Ansible合并多文件dbconn变量报列表与NoneType拼接错误
问题根因
YAML语法中,键后无赋值内容时(比如示例中app3-webapps-dev.yml的dbconn:行后没有任何值),经过from_yaml过滤器解析后,该键对应的值为None(空值类型),而非空列表。原任务中直接用列表拼接运算符+连接初始空列表和这个None值时,就会触发类型不匹配报错:
can only concatenate list (not "NoneType") to list
可行修复方案
核心修复逻辑是对每个文件解析出的dbconn值做空值兜底,确保参与拼接的始终是列表类型,最简修改方式是在取值后增加default过滤器做类型兼容:
- set_fact: dbconn: "{{ dbconn|d([]) + (lookup('file', item ~ '-webapps-' + ENV ~ '.yml' )|from_yaml).dbconn | default([], true) }}" loop: - app1 - app2 - app3
关键参数说明
default([], true):第二个参数传入true的作用是,不仅在dbconn键不存在时返回空列表,也会在dbconn值为None、空、布尔假等场景下统一返回空列表,完美匹配app3配置文件中dbconn为空的场景。- 如果需要更强的兼容性(比如防止个别文件里误把dbconn写成字符串等非列表类型),可以额外追加
list过滤器强制转类型,写法为:dbconn: "{{ dbconn|d([]) + ((lookup('file', item ~ '-webapps-' + ENV ~ '.yml' )|from_yaml).dbconn | default([], true) | list) }}"
修复后执行任务,最终拼接得到的dbconn变量结果符合预期:
dbconn: - host1 port1 - host4 port4 - host5 port5
内容的提问来源于stack exchange,提问作者Ashar
相关产品推荐
相关产品推荐

