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 ...)
关键改动说明
- 先将筛选后的结果存入
ring_list,避免重复执行筛选逻辑 - 使用
| default('unknown')在ring_list为空时,给ring设置默认值,避免first报错 - 映射表写法中,
mapping.get(ring, 'unknown')会自动处理两种情况:ring为默认值unknown,或ring不在映射键中,统一返回unknown
内容的提问来源于stack exchange,提问作者dr_
相关产品推荐
相关产品推荐

