A mio parere uno dei costrutti meno comprensibili di Ansible riguarda la gestione dei loop. Se poi parliamo di loop annidati, la situazione è ancora più complessa. In questo breve post vediamo le ricette per:
Le ricette sono a disposizione nel repository Git dedicato ai subscriber di grado Learner o superiore .
Il loop più semplice prevede di usare una lista ed effettuare una serie di azioni su ciascun elemento, di default item
:
- ansible.builtin.debug:
msg: "Now reading {{ item }}"
with_items: "{{ list1 }}"
Come vediamo, all’interno del loop l’elemento è accessibile mediante la variabile item
.
Se stiamo facendo un loop (non sarebbe il termine corretto) su un dizionario, probabilmente avremo bisogno di accedere sia alla chiave che al valore. La sintassi è simile al caso precedente:
- ansible.builtin.debug:
msg: "Now reading {{ item.key }} by {{ item.value }}"
with_dict: "{{ dict1 }}"
Vediamo in questo caso che la chiave è accessibile tramite item.key
mentre il valore associato tramite item.value
.
Se abbiamo bisogno di utilizzare loop annidati, la sintassi si complica e avremo bisogno di appoggiarci a file esterni. Vediamo la sintassi:
- ansible.builtin.include_tasks: sub_task1.yml
with_items: "{{ list1 }}"
loop_control:
loop_var: outer_item
Per ciascun elemento contenuto nella lista list1
, il playbook eseguirà i task contenuti nel file sub_task1.yml
. Nell’esecuzione dei sotto task, l’elemento corrente è accessibile tramite la variabile outer_item
:
- ansible.builtin.debug:
msg: "Now reading {{ outer_item }} from outer loop"
Nello stesso file possiamo eseguire un ulteriore loop, chiamando un terzo file:
- ansible.builtin.include_tasks: sub_task2.yml
with_items: "{{ list2 }}"
loop_control:
loop_var: inner_item
Il file sub_task2.yml
definisce i task che useranno le variabili dal primo (outer) e secondo (inner) loop:
- ansible.builtin.debug:
msg: "Now reading {{ outer_item}} / {{ inner_item }} from inner loop"