Отсутствует с_знаками, когда элемент определен

Несущественный 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

Может, я что-то не так? извините за мой английский

Ответы

Ответ 1

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

Ответ 2

Причиной такого поведения являются условия работы по-разному внутри циклов. Если цикл был определен, условие оценивается для каждого элемента, итерации по элементам. Но сам цикл требует наличия допустимого списка.

Это также упоминается в документах:

Обратите внимание, что при объединении с 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' undefined