web-dev-qa-db-fra.com

Une boucle sur plusieurs tâches Ansible

J'ai créé un playbook Ansible qui crée une instance cloud, puis installe certains programmes sur l'instance. Je veux exécuter ce playbook plusieurs fois (sans utiliser de script bash). Est-il possible d'utiliser une boucle pour boucler sur ces deux tâches ensemble (I.E. Une boucle pour deux tâches?). Tout ce que j'ai pu trouver jusqu'à présent, c'est une boucle pour chaque tâche individuelle

25
AverageWorker

Non, ce n'est actuellement pas possible. with_items fonctionnait avec l'instruction include dans les versions précédentes d'Ansible mais a malheureusement été abandonné.

Bien qu'il soit ramené dans Ansible 2.0, voir la diapositive 14/15 de Quoi de neuf dans v2 - AnsibleFest London 2015

enter image description here

Vous pouvez essayer de travailler avec la branche v2 de github , la fonctionnalité devrait y être disponible.

Ce que vous pouvez faire avec 1.9.1 est de déplacer vos tâches dans un rôle et de référencer ce rôle plusieurs fois dans votre playbook.

27
udondan

Une mise à jour:

Dans 2.0, vous pouvez utiliser with_ boucles et tâches incluent (mais pas les playbooks inclus), cela ajoute la possibilité de parcourir l'ensemble des tâches en une seule fois. Il y a deux ou trois choses que vous devez garder à l'esprit, une tâche incluse qui a sa propre with_ loop remplacera la valeur de la variable d'élément spéciale. Par conséquent, si vous souhaitez accéder à la fois à l'élément inclus et à l'élément de la tâche en cours, vous devez utiliser set_fact pour créer un alias vers l'extérieur:

- include: test.yml
  with_items:
    - 1
    - 2
    - 3

dans test.yml:

- set_fact: outer_loop="{{item}}"
- debug: msg="outer item={{outer_loop}} inner item={{item}}"
  with_items:
    - a
    - b
    - c

Source: Ansible Docs

21
Wtower

J'ai réussi à le faire en incluant récursivement le même fichier yaml en fonction d'une condition. Voici l'essentiel: https://Gist.github.com/ParagDoke/5ddfc3d5647ce9b0110d1b9790090092 . En effet, dans votre playbook, incluez un fichier avec quelques vars:

  - name: Invoke poller
    vars:
      some_condition: '"failed" not in response.content and response.json.status=="running"'
    include_tasks: status-poller.yml

Puis dans status-poller.yml, comprend lui-même:

- include_tasks: includes/status-poller.yml
  when: some_condition
3
Parag Doke