web-dev-qa-db-fra.com

Ansible: Comment exécuter un hôte de tâches par hôte?

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.)

17
Elrond

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.

13
wurtel

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
2
Tomasz Klosinski

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]

1
Rohan Seth

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 }}"
0
Michele

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:

0
maxschlepzig

Pensez à ce que vous voulez

run_once: true

0
user19151