Au niveau du jeu, nous devons serial: 1
nous permettre d'exécuter le jeu entier un hôte à la fois. Mais je n'ai pas trouvé de moyen simple de le faire sur une seule tâche. Cela est particulièrement pertinent si la tâche en question n'effectue pas un verrouillage approprié (pour une raison quelconque).
Une réponse évidente est de mettre la tâche dans son propre jeu. Mais cela n'aide pas avec les rôles. (Devoir serial: 1
jouer le jeu en utilisant le rôle n'est pas vraiment intuitif.)
serial: 1
laissez-moi le mettre sur une pièce au moins. Mais je veux seulement le placer sur un sous-élément d'une pièce (quel que soit le nom correct de cela. Je pensais que c'était "tâche", mais le commentaire ci-dessus semble être en désaccord).serial: 1
fait quelque chose de complètement différent: c'est comme exécuter le playbook pour chaque hôte tour à tour, attendre la fin du playbook complet avant de passer à l'hôte suivant.forks=1
signifie exécuter la première tâche dans un jeu sur un hôte avant d'exécuter la même tâche sur l'hôte suivant, donc la première tâche sera exécutée pour chaque hôte avant que la tâche suivante ne soit touchée. Vous ne voulez doncforks=1
qu'une seule pièce; malheureusement ce n'est pas possible actuellement.Il existe une solution de contournement à ce problème - on peut transmettre la liste des hôtes (ou un groupe) à
with_items
, puis l'utiliserdelegate_to
avec cette liste. De cette façon, la tâche sera exécutée hôte par hôte.Par exemple:
la source
run_once: true
est là-dedans, essayez de le retirer. Vous n'aimerez pas ce qui se passe. (tant de pistes répétées aaaahhhh)Si vous l'exécutez sur une seule machine, un problème de verrous exclusifs se pose pour plusieurs hôtes. Vous devez donc exécuter un par un pour tous les hôtes. Pour cela, vous devez avoir
--forks=1
été défini lors de l'appel de la commande ansible playbook. Pour un exemple:ansible-playbook webserver.yml --forks=1
où webserver.yml a app01 et app02 dans votre[webserver]
la source
Pensez à ce que vous voulez
run_once: true
la source
Pour les commandes pouvant être exécutées localement, utilisez une boucle pour parcourir tous les hôtes de la lecture. Cela ne fonctionne que si la commande peut être exécutée localement. Vous pouvez également exécuter une commande contenant ssh sur les machines distantes une par une de cette manière, si les clés sont configurées, mais cela devient difficile lorsque vous parlez d'escalade.
PAR EXEMPLE:
la source
inventory_hostname
, sinon la boucle n'a aucun sens.