Ansible with_nested嵌套循环遍历level3变量报错问题排查
错误原因
- 第一个错误是变量引用错误:
level2是列表类型,不是单值字典,直接写{{ level2.level3 }}相当于在列表对象上读取level3属性,直接触发'list object' has no attribute 'level3'报错。 - 第二个错误是循环逻辑错误:
with_nested只会对传入的多个独立列表做全量笛卡尔积,不会自动绑定level2列表中每个元素和它自身携带的level3子列表,就算修正了变量引用,也会出现不同app的level3值乱匹配的问题,得不到预期的组合结果。
正确实现
要输出所有层级的合法组合(level1所有值、每个app项、该app自己的level3值三者的全配对),用Ansible自带的过滤器组合实现即可,参考配置:
--- - hosts: localhost gather_facts: no connection: local vars: level1: - abc - def level2: - { name: "app1", level3: ["aaaa","bbbb"]} - { name: "app2", level3: ["eeeee"]} tasks: - name: 输出所有层级组合 debug: msg: "{{ item.0 }} {{ item.1.0.name }} {{ item.1.1 }}" loop: "{{ level1 | product(level2 | subelements('level3')) }}"
运行后会输出所有预期的组合结果:
"msg": "abc app1 aaaa" "msg": "abc app1 bbbb" "msg": "abc app2 eeeee" "msg": "def app1 aaaa" "msg": "def app1 bbbb" "msg": "def app2 eeeee"
实现说明:
subelements('level3')会遍历level2列表的每一项,自动把每个app项和它自己的level3列表里的每个值绑定成配对元组,从根源避免跨app的level3值乱匹配product过滤器负责做笛卡尔积运算,把level1的所有值和前面生成的app+level3配对做全量组合,刚好得到所有需要的遍历项
内容的提问来源于stack exchange,提问作者Janek
相关产品推荐
相关产品推荐

