You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ansible Jinja模板报错AnsibleUndefinedVariable,如何修复序列为空问题?

修复Jinja模板中序列为空导致的AnsibleUndefinedVariable错误

问题场景

两段用于生成CSV的Jinja模板代码均触发AnsibleUndefinedVariable: No first item, sequence was empty错误,核心逻辑是从myvars[h]['group_names']中匹配以ring加数字开头的组名,再映射为友好名称;当没有匹配到任何组名时,需要输出unknown或类似内容。

出错代码1(三元嵌套写法)

(... other variables here ...)
}},{% set ring = (myvars[h]['group_names'] | select('match', '^ring\d+') | list | first) %}{{ 
    (ring == 'ring0') | ternary('Ring 0 (Fast)',
    (ring == 'ring1') | ternary('Ring 1 (Slow)',
    (ring == 'ring2') | ternary('Ring 2 (Current)',
    (ring == 'ring3') | ternary('Ring 3 (Manual)','No ring')))) 
}},{{ 
(... other variables here ...)

出错代码2(映射表写法)

(... other variables here ...)
}},{% set ring = (myvars[h]['group_names'] | select('match', '^ring\d+') | list | first) %}
{% set mapping = {
    'ring0': 'Ring 0 (Fast)',
    'ring1': 'Ring 1 (Slow)',
    'ring2': 'Ring 2 (Current)',
    'ring3': 'Ring 3 (Manual)'
} %}{{ 
    mapping.get(ring, 'No ring')
}},{{ 
(... other variables here ...)

错误原因

当select('match', '^ring\d+')没有筛选到任何符合条件的组名时,后续的list会生成空序列,直接调用first过滤器就会触发“序列为空无首个元素”的错误。


修复方案

核心思路是先捕获筛选结果,为空时给ring变量设置默认值,避免first直接报错。

修复后的三元嵌套写法

(... other variables here ...)
}},{% set ring_list = myvars[h]['group_names'] | select('match', '^ring\d+') | list %}
{% set ring = ring_list | first | default('unknown') %}{{ 
    (ring == 'ring0') | ternary('Ring 0 (Fast)',
    (ring == 'ring1') | ternary('Ring 1 (Slow)',
    (ring == 'ring2') | ternary('Ring 2 (Current)',
    (ring == 'ring3') | ternary('Ring 3 (Manual)','unknown')))) 
}},{{ 
(... other variables here ...)

修复后的映射表写法(更简洁)

(... other variables here ...)
}},{% set ring_list = myvars[h]['group_names'] | select('match', '^ring\d+') | list %}
{% set ring = ring_list | first | default('unknown') %}
{% set mapping = {
    'ring0': 'Ring 0 (Fast)',
    'ring1': 'Ring 1 (Slow)',
    'ring2': 'Ring 2 (Current)',
    'ring3': 'Ring 3 (Manual)'
} %}{{ 
    mapping.get(ring, 'unknown')
}},{{ 
(... other variables here ...)

关键改动说明

  1. 先将筛选后的结果存入ring_list,避免重复执行筛选逻辑
  2. 使用| default('unknown')在ring_list为空时,给ring设置默认值,避免first报错
  3. 映射表写法中,mapping.get(ring, 'unknown')会自动处理两种情况:ring为默认值unknown,或ring不在映射键中,统一返回unknown

内容的提问来源于stack exchange,提问作者dr_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 00:58:15