Au niveau du jeu, nous avons serial: 1
pour 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. (Avoir à mettre serial: 1
sur le jeu en utilisant le rôle n'est pas vraiment intuitif.)
Si vous ne voulez pas de parallélisme dans l'exécution des étapes de votre playbook, définissez le niveau de fork sur 1:
ansible-playbook --forks=1 ...
Vous pouvez également le mettre dans votre fichier cfg ansible:
[defaults]
forks=1
mais si vous le souhaitez sur une base individuelle, utilisez l'option de ligne de commande ci-dessus.
MODIFIER:
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 d'un jeu sur un hôte avant d'exécuter la même tâche sur l'hôte suivant, de sorte que la première tâche sera exécutée pour chaque hôte avant que la tâche suivante ne soit touchée.
Alors tu veux forks=1
pour une seule pièce; malheureusement ce n'est pas possible actuellement.
Il y a une solution à ce problème - on peut passer la liste des hôtes (ou un groupe) à with_items
, puis utilisez delegate_to
avec cette liste. De cette façon, la tâche sera exécutée hôte par hôte.
Par exemple:
- name: start and enable rabbitmq (run task Host by Host)
service:
name: "rabbitmq-server"
state: "started"
enabled: true
delegate_to: "{{ item }}"
with_items: "{{ groups['rabbitmq-cluster'] }}"
run_once: true
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
étant défini lors de l'appel de la commande ansible playbook. Par exemple: ansible-playbook webserver.yml --forks=1
où webserver.yml a app01 et app02 à l'intérieur de votre [webserver]
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:
- name: Init New Appliances - Remove the known hosts entry for the server in case it has changed
run_once: yes
connection: local
become: no
command: "ssh-keygen -R {{ item }}"
with_items:
- "{{ inventory_hostname }}"
Vous pouvez exécuter une seule tâche en série (c'est-à-dire hôte par hôte) en ajoutant throttle: 1
à elle.
Exemple:
---
- hosts: all
tasks:
- name: wait in parallel
command: sleep 20
- name: wait in serial
command: sleep 30
throttle: 1
Références:
Pensez à ce que vous voulez
run_once: true