Ответ 1
with_items: "{{ symlinks | default([]) }}"
Несущественный 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
Может, я что-то не так? извините за мой английский
with_items: "{{ symlinks | default([]) }}"
Причиной такого поведения являются условия работы по-разному внутри циклов. Если цикл был определен, условие оценивается для каждого элемента, итерации по элементам. Но сам цикл требует наличия допустимого списка.
Это также упоминается в документах:
Обратите внимание, что при объединении с 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