web-dev-qa-db-fra.com

Ignorer certains éléments à la condition dans la boucle ansible with_items

Est-il possible de sauter certains éléments dans l'opérateur de boucle Ansible with_items, sur une base conditionnelle, sans générer d'étape supplémentaire?

Juste par exemple:

- name: test task
    command: touch "{{ item.item }}"
    with_items:
      - { item: "1" }
      - { item: "2", when: "test_var is defined" }
      - { item: "3" }

dans cette tâche, je veux créer le fichier 2 uniquement lorsque test_var est défini.

7
m_messiah

L'autre réponse est proche mais passera à côté de tous les éléments! = 2. Je ne pense pas que ce soit ce que vous souhaitiez. voici ce que je ferais:

- hosts: localhost
  tasks:
  - debug: msg="touch {{item.id}}"
    with_items:
    - { id: 1 }
    - { id: 2 , create: "{{ test_var is defined }}" }
    - { id: 3 }
    when: item.create | default(True) | bool
12
Petro026

Le when: conditionnel à la tâche est évalué pour chaque élément. Donc dans ce cas, vous pouvez simplement faire:

...
with_items:
- 1
- 2
- 3
when: item != 2 and test_var is defined
3
nitzmahone

Ce que vous voulez, c'est que les fichiers 1 et 3 soient toujours créés mais que le fichier 2 ne soit créé que lorsque test_var est défini. Si vous utilisez la condition ansible lorsque cela fonctionne, la tâche est complète et non sur des éléments individuels comme celui-ci:

- name: test task
  command: touch "{{ item.item }}"
  with_items:
      - { item: "1" }
      - { item: "2" }
      - { item: "3" }
  when: test_var is defined

Cette tâche vérifie la condition pour les trois postes 1,2 et 3.

Cependant, vous pouvez y parvenir par deux tâches simples:

- name: test task
  command: touch "{{ item }}"
  with_items:
      - 1 
      - 3

- name: test task
  command: touch "{{ item }}"
  with_items:
      - 2
  when: test_var is defined
0
Deepali Mittal