2017-10-06 10 views
0

Je suis dans une situation où je veux faire une boucle sur une liste (with_items) et exécuter une commande. Cependant, l'élément suivant ne peut pas démarrer à moins que le premier ne soit terminé sur tous les hôtes. La quantité d'objets que je vais boucler sera énorme. Cependant, il ne devrait pas y avoir de dérive dans les hôtes quant à l'objet utilisé. Aucun hôte ne doit démarrer item2 à moins que l'élément 1 ne soit terminé dans l'ensemble du pool d'hôtes.Ansible séquentiel avec_héléments sur les hôtes

Pour créer une preuve de concept que j'espère obtenir les résultats suivants

- name: proof of concept 
    command: bash -c /home/user/my_test_script.sh 
    with_items: 
    - item_1 
    - item_2 
    .... 
    - item_n 

Où my_test_script.sh a un sommeil différent (x) sur chaque hôte simulant que certains peuvent être plus lents dans l'exécution d'un travail.

J'ai déjà regardé, wait_for, wait_until, etc .. mais je n'ai pas encore trouvé de solution pour exécuter une tâche parallèle (with_items), qui fonctionne (pour chaque élément de la liste) 'sync' (dans le temps pas rsync) pour un certain nombre d'éléments donnés.

Toute aide serait appréciée.

Répondre

0

Connexe: Ansible: How to iterate over an role with an array?. Si vous utilisez Ansible 2.3.0 ou supérieur, consultez le include_role. Vous pouvez écrire un rôle qui appellera votre script avec un paramètre variable. Ensuite, votre playbook peut faire une boucle sur le rôle.

rôle:

- name: proof of concept 
    command: bash -c /home/user/my_test_script.sh {{ script_param }} 

PlayBook:

- include_role: 
     name: test_script 
    with_items: 
    - item1 
    - item2 
    - item3 
    vars: 
     script_param: "{{ item }}" 
+0

Est-ce possible à partir d'un rôle (qui est ma situation actuelle) – Benjamin

+0

Bien sûr, il suffit de mettre la tâche de fond dans votre rôle n » est pas t 'test_script'. – kfreezy