web-dev-qa-db-fra.com

Comment appliquer une boucle Ansible with_items aux tâches incluses?

La documentation pour import_tasks mentions 

Toutes les boucles, conditions et la plupart des autres mots-clés seront appliqués aux tâches incluses, pas à cette déclaration.

C'est exactement ce que je veux. Malheureusement, lorsque je tente de faire fonctionner import_tasks avec une boucle

- import_tasks: msg.yml
  with_items:
    - 1
    - 2
    - 3

Je reçois le message

ERREUR! Vous ne pouvez pas utiliser de boucles sur les instructions 'import_tasks'. Vous devriez utiliser 'include_tasks' à la place.

Je ne veux pas le comportement include_tasks, car cela applique la boucle au fichier inclus et duplique les tâches. Je souhaite spécifiquement exécuter la première tâche pour chaque variable de boucle (en tant que tâche avec la sortie standard with_items), puis la seconde, etc. Comment puis-je obtenir ce comportement?


En particulier, considérez ce qui suit:

Supposons que j'ai les fichiers suivants:

playbook.yml

---                       

- hosts: 192.168.33.100
  gather_facts: no
  tasks:
  - include_tasks: msg.yml
    with_items:
      - 1
      - 2

msg.yml

---

- name: Message 1
  debug:
    msg: "Message 1: {{ item }}"

- name: Message 2
  debug:
    msg: "Message 2: {{ item }}"

J'aimerais que les messages imprimés soient

Message 1: 1
Message 1: 2
Message 2: 1
Message 2: 2 

Cependant, avec import_tasks je reçois une erreur et avec include_tasks je reçois

Message 1: 1
Message 2: 1
Message 1: 2
Message 2: 2 

3
Chris Midgley

Vous pouvez ajouter une boucle with_items en prenant une liste pour chaque tâche du fichier importé et appeler import_tasks avec une variable que vous transmettez à la boucle with_items intérieure. Cela déplace la gestion des boucles vers le fichier importé et nécessite la duplication de la boucle sur toutes les tâches.


Compte tenu de votre exemple, cela modifierait les fichiers en:

playbook.yml

---

- hosts: 192.168.33.100
  gather_facts: no
  tasks:
  - import_tasks: msg.yml
    vars:
      messages:
        - 1
        - 2

msg.yml

---

- name: Message 1
  debug:
    msg: "Message 1: {{ item }}"
  with_items:
    - "{{ messages }}"

- name: Message 2
  debug:
    msg: "Message 2: {{ item }}"
  with_items:
    - "{{ messages }}"
1
Chris Midgley

Ce n'est pas possible. include/import instructions fonctionnent avec les fichiers de tâches dans leur ensemble.

Donc, avec les boucles, vous aurez:

Task 1 with Item 1
Task 2 with Item 1
Task 3 with Item 1
Task 1 with Item 2
Task 2 with Item 2
Task 3 with Item 2
Task 1 with Item 3
Task 2 with Item 3
Task 3 with Item 3
0
Konstantin Suvorov