Ansible with_items if item is defined

喜夏-厌秋 提交于 2020-01-22 08:30:10

问题


Ansible 1.9.4.

The script should execute some task only on hosts where some variable is defined. It works fine normally, but it doesn't work with the with_items statement.

- 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

But I get:

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

Maybe I am doing something wrong? sorry for my english


回答1:


with_items: "{{ symlinks | default([]) }}"



回答2:


The reason for this behavior is conditions work differently inside loops. If a loop was defined the condition is evaluated for every item while iterating over the items. But the loop itself requires a valid list.

This is also mentioned in the docs:

Note that when combining when with with_items (see Loops), be aware that the when statement is processed separately for each item. This is by design:

tasks:
  - command: echo {{ item }}
    with_items: [ 0, 2, 4, 6, 8, 10 ]
    when: item > 5

I think this is a bad design choice and for this functionality they better should have introduced something like with_when.

As you have already figured out yourself, you can default to an empty list.

with_items: "{{ symlinks  | default([]) }}"

Finally if the list is dynamically loaded from a var, say x, use:

with_items: "{{ symlinks[x|default('')] | default([])}}" 

This will default to an empty list when 'x' is undefined



来源:https://stackoverflow.com/questions/35470667/ansible-with-items-if-item-is-defined

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!