我是Ansible的新手,正试图弄清YAML和Ansible的语法。
在尝试使用“循环”而不是“ with_items”循环遍历多个词典列表时遇到致命错误。
---
- 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
错误日志:
fatal: [localhost]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'list object' has no attribute 'name'\n\nThe error appears to have been in '/Ansible/playbook.yml': line 17, column 8, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n tasks:\n - name: debug all users\n ^ here\n"}
答案 0 :(得分:1)
您要遍历一个包含两个项目的列表,这些项目是您的初始列表。您需要做的是将这两个列表与{{ allow_list + deny_list }}
一起加入。检出this post。
您的固定代码:
---
- 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: "{{ item.name }} {{ item.uid }}"
loop: "{{ allow_list + deny_list }}"
如果您想在set_fact
块中进行处理:
---
- 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 }
some_var: 42
tasks:
- name: set fact on condition
set_fact:
userlist: "{{ allow_list }}"
when: some_var <= 5
- name: set fact on negated condition
set_fact:
userlist: "{{ allow_list + deny_list }}"
when: some_var > 5
- name: debug all users
debug:
msg: "{{ item.name }} {{ item.uid }}"
loop: "{{ userlist }}"
您需要确保您的set_fact
块中的每一个都正确运行,否则最终会出现错误或意外结果。