如何使用Ansible的'loop'语法遍历多个字典列表?新手报错求助
解决Ansible loop遍历多个字典列表时的致命错误
嘿,刚接触Ansible的话很容易踩这个小坑,我来帮你捋清楚问题出在哪以及怎么解决!
问题原因
你当前的loop配置是把allow_list和deny_list这两个完整的列表作为迭代对象,也就是说循环会先处理整个allow_list(此时user是包含4个字典的列表),再处理整个deny_list,自然会报错说“列表对象没有name属性”——因为你试图从一个列表里取name,而不是从列表里的单个字典取。
解决方案
你需要把两个列表合并成一个扁平的列表,让loop遍历里面的每一个字典元素。最直接的方式就是用+运算符把两个列表拼接起来:
修改后的Playbook代码
--- - hosts: localhost vars: allow_list: - {name: user1, uid: 1001} - {name: user2, uid: 1002} - {name: user3, uid: 1003} - {name: user4, uid: 1004} deny_list: - {name: user11, uid: 1011} - {name: user12, uid: 1012} - {name: user13, uid: 1013} - {name: user14, uid: 1014} tasks: - name: debug all users debug: msg: "{{ user.name }} {{ user.uid }}" loop: "{{ allow_list + deny_list }}" loop_control: loop_var: user
其他可选方法
如果之后遇到更复杂的嵌套列表场景,也可以用flatten过滤器来扁平化列表:
loop: "{{ [allow_list, deny_list] | flatten }}"
或者用query插件的flattened lookup:
loop: "{{ query('flattened', allow_list, deny_list) }}"
验证效果
修改后运行playbook,你会看到每个用户的name和uid都被正确打印出来,不会再出现变量未定义的错误啦!
内容的提问来源于stack exchange,提问作者Dan Fishman
相关产品推荐
相关产品推荐

