{{tag>Ansible CA}}
= Notes Ansible boucle loop
Exemple équivalent à une boucle for imbriqué dans une boucle for, grâce au filtre ''product''
#! /usr/bin/ansible-playbook
- name: play test loop
hosts: localhost
vars:
objects:
- pomme
- banane
emails:
- 'root@localhost'
- 'plop@acme.fr'
tasks:
- name: Exemple boucle
debug:
msg: "{{ object }} - {{ email }}"
vars:
object: "{{ item.0 }}"
email: "{{ item.1 }}"
loop: "{{ objects | product(emails) | list }}"
ok: [localhost] => (item=['pomme', 'root@localhost']) => {
"msg": "pomme - root@localhost"
}
ok: [localhost] => (item=['pomme', 'plop@acme.fr']) => {
"msg": "pomme - plop@acme.fr"
}
ok: [localhost] => (item=['banane', 'root@localhost']) => {
"msg": "banane - root@localhost"
}
ok: [localhost] => (item=['banane', 'plop@acme.fr']) => {
"msg": "banane - plop@acme.fr"
}
== Ansible loop break
#!/usr/bin/ansible-playbook
---
- name: test
hosts: localhost
tasks:
- name: break 1
command: "echo {{ item }}"
register: res
with_sequence: 0-100
when:
- item |int > 3
- not (res.changed|d(false))
- name: break 2
set_fact:
id: "{{ item }}"
register: res2
with_sequence: 0-100
# Because set_fact not make "change"
changed_when: item |int > 3
when:
- not (res2.changed|d(false))
# Ca fonctionne mais
# * hélas ce n'est pas un vrai Break car il boucle sur toutes les valeurs
# * plus problématique encore, ce n'est pas idempotent, car il fait un "Change" à chaque appel
# Nous préférerons utiliser les listes
- name: break 3-A
set_fact:
ids: "{{ ids | d([]) + [ item | int ] }}"
with_sequence: 0-100
when: item |int > 3
- name: break 3-B
debug:
msg: "{{ ids | min }}"