Существует два способа сделать вложенный (двойной) цикл в Ansible.
with_nested
. Это позволяет вам иметь внутреннюю итерацию для объекта, который вы повторяете во внешнем цикле. Примеры и пояснения приведены в официальной документации: https://docs.ansible.com/ansible/2.5/plugins/lookup/nested.html
с использованием with_items
вместе с include_tasks
. Это сложная, но мощная конструкция. В теории нет предела (кроме глубины стека) того, насколько вложенной может быть эта конструкция.
Требуется поместить внутренний код в отдельный список задач. Я покажу это с помощью outer.yaml
и inner.yaml
, внешнего цикла выполнения над списком, а внутреннего - выполнения цикла над элементом (переменной цикла) внешнего цикла.
outer.yaml:
- name: Loop over foo
include_tasks: inner.yaml
with_items: '{{ foo }}'
loop_control:
loop_var: inner_var_name
vars:
foo:
- [1, 2, 3]
- [a, b, c]
inner.yaml:
- name: Performing operation one
debug: msg="Action one for {{ item }}"
with_items: '{{ inner_var_name }}'
- name: Performing operation two
debug: msg="Action two for {{item}}"
with_items: '{{ inner_var_name }}'
Ключевым преимуществом этого метода является то, что inner.yaml
может содержать любое количество операторов, все из которых будут обработаны в цикле от outer.yaml
.
Одна важная вещь: все include
вещи требуют некоторой осторожности со всем, что связано с передачей значений (set_fact
, register
и т. Д.) Из включенного кода. Это довольно сложно и неочевидно, поэтому я никогда не советую использовать переменные, заданные в include-коде, вне этого включения.