Ansible 1.9.4。 我尝试只为主机执行一些任务,当定义一些变量时,它工作正常,但是不能使用with_items语句。
- debug: var=symlinks
when: symlinks is defined
- name: Create other symlinks
file: src={{ item.src }} dest={{ item.dest }} state=link
with_items: "{{ symlinks }}"
when: symlinks is defined
但我明白了:
TASK: [app/symlinks | debug var=symlinks] *********************
skipping: [another-host-yet]
TASK: [app/symlinks | Create other symlinks] ******************
fatal: [another-host-yet] => with_items expects a list or a set
也许我做错了什么? 对不起我的英语
答案 0 :(得分:33)
with_items: "{{ symlinks | default([]) }}"
答案 1 :(得分:24)
此行为的原因是条件在循环内的工作方式不同。如果定义了循环,则在迭代项目的同时评估每个项目的条件。但循环本身需要一个有效的列表。
这也提到in the docs:
请注意,当与with_items组合时(请参阅Loops),请注意每个项目单独处理when语句。这是设计的:
tasks: - command: echo {{ item }} with_items: [ 0, 2, 4, 6, 8, 10 ] when: item > 5
我认为这是一个糟糕的设计选择,对于这个功能,他们最好应该引入类似with_when
的东西。
正如您已经想到的那样,您可以默认为空列表。
with_items: "{{ symlinks | default([]) }}"
最后,如果列表是从var(例如x
)动态加载的,请使用:
with_items: "{{ symlinks[x|default('')] | default([])}}"
当' x'时,这将默认为空列表。未定义