J'utilise Ansible 2.2, mais je peux mettre à niveau si cela aide.
J'ai vu cela et j'étais assez excité, mais cela ne semble pas être dans cette version (ou n'importe quelle autre) de la documentation Ansible.
Le problème que j'essaie de résoudre est que j'ai 1000 utilisateurs que je dois gérer sur une box Centos.
Il faut un certain temps pour exécuter cette tâche en série. Et encore plus ennuyeux, tout apparaît comme modifié car la commande "expires" sur le module utilisateur marque toujours la chose comme modifiée.
cela semblait également prometteur, mais cela prenait le même temps pour exécuter chaque commande dans la boucle with_items et n'allait pas plus vite (je n'ai jamais pris la peine d'attendre assez longtemps pour arriver à la fin).
Sauter des tâches est rapide maintenant (beaucoup plus rapide que dans Ansible 2.0), si je ne peux pas comprendre comment faire fonctionner cela en parallèle, je pense que je vais revenir en arrière et comprendre comment sauter des tâches inutiles et si tout sinon échoue, je vais écrire mon propre module. Mais il semble que je devrais pouvoir faire tout cela plus rapidement dans Ansible.
C'est ce que je veux exécuter en parallèle, host_authorizations
c'est une liste de noms d'utilisateurs et d'autres données.
- name: Create/modify OS user accounts
user: name={{ item.username }} group=sshusers shell=/bin/bash home="/home/selinux-modules/{{ item.username }}" state=present expires={{item.expiredate|default(omit)}}
with_items: "{{ host_authorizations }}"
tags: full_maintenance
Réponses:
Comme @webKnja l'a mentionné, cela est possible avec le
async
mode. Je l'ai moi-même découvert récemment et j'ai appris que vous pouvez l'utiliser de 3 manières différentes selon vos besoins.Exécutez et interrogez les résultats, notez le
poll:5
, cela interrogera les résultats toutes les 5 secondes. Vous pouvez gagner du temps avec cette méthode.Tirez et oubliez
poll: 0
, c'est une option très rapide car Ansible ne fait que tirer sur ces tâches. L'inconvénient est que nous ne savons pas quel a été le résultat de la tâche, c'est-à-direchanged: True/False
. Bien sûr, c'est un inconvénient si vous vous souciez des commentaires;).Déclenchez et oubliez avec
async_status
, la syntaxe de la tâche est la même que dans l'exemple 2, chaque fois qu'elle nécessitera une tâche supplémentaireasync_status
. C'est mon préféré car il est relativement rapide (plus rapide que le bouclage normal ou leexecute and poll
) et vous permet de capturer les commentaires, mais il faudra en traiter de nouveauxregister
pour votreasync_task
.retries: 20
- combien de tentatives avant d'échouer.delay: 2
- combien de secondes attendre entre les sondages.Un mot d'avertissement , selon la tâche, vous ne pourrez peut-être pas utiliser l'
async
option. J'ai eu des exemples où j'interagissais avec un système qui n'était pas en mesure de gérer plusieurs demandes pour la même ressource. J'ai trouvé que l'async
option fonctionnait mieux si je devais effectuer la même tâche sur plusieurs hôtes. C'est là que j'ai pu "économiser" le plus de temps.Depuis que vous avez publié le lien vers la documentation Ansible dans la question, je ne vais pas le faire.
la source
poll
valeur à 0 dans l'exemple 3. C'est une explication incroyable !! Thnx.async_status
nécessitejid
, nonid
.Pour répondre à votre question: Non, pour l'instant Ansible ne peut pas exécuter de boucles en parallèle.
J'utiliserais à la
newusers
place, ce qui est fait pour la création d'utilisateurs en masse. Créez un fichier avec tous les utilisateurs, copiez-le sur l'hôte et exécuteznewusers /path/to/user/list
unecommand
tâche.la source
Il est possible d'y parvenir en utilisant le
async
mode. Veuillez trouver ci-dessous quelques références sur la façon de procéder.Réfs:
la source