定义项目时Ansible with_items

24 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
Run Code Online (Sandbox Code Playgroud)

但我得到:

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
Run Code Online (Sandbox Code Playgroud)

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

小智 36

with_items: "{{ symlinks | default([]) }}"
Run Code Online (Sandbox Code Playgroud)


udo*_*dan 26

这种行为的原因是条件在循环内的工作方式不同.如果定义了循环,则在迭代项目的同时评估每个项目的条件.但循环本身需要一个有效的列表.

这也在文档中提到:

请注意,当与with_items组合时(请参阅循环),请注意为每个项目单独处理when语句.这是设计的:

tasks:
  - command: echo {{ item }}
    with_items: [ 0, 2, 4, 6, 8, 10 ]
    when: item > 5
Run Code Online (Sandbox Code Playgroud)

我认为这是一个糟糕的设计选择,对于这个功能,他们应该更好地介绍一些类似的东西with_when.

正如您已经想到的那样,您可以默认为空列表.

with_items: "{{ symlinks  | default([]) }}"
Run Code Online (Sandbox Code Playgroud)

最后,如果列表是从var动态加载的,比如说x,使用:

with_items: "{{ symlinks[x|default('')] | default([])}}" 
Run Code Online (Sandbox Code Playgroud)

当'x'未定义时,这将默认为空列表