定义项目时Ansible with_items

时间:2016-02-18 00:42:49

标签: ansible

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

也许我做错了什么? 对不起我的英语

2 个答案:

答案 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'时,这将默认为空列表。未定义