Ansible: ¿Cómo ejecutar una tarea Host por Host?

15

En el nivel de juego, tenemos serial: 1que permitirnos ejecutar todo el juego un host a la vez. Pero no he encontrado una manera simple de hacer esto en una sola tarea. Esto es especialmente relevante, si la tarea en cuestión no realiza el bloqueo adecuado (por cualquier razón).

Una respuesta obvia es poner la tarea en su propio juego. Pero eso no ayuda con los roles. (Tener que serial: 1actuar con el rol no es realmente intuitivo).

Elrond
fuente

Respuestas:

11

Si no desea ningún paralelismo al realizar los pasos en su libro de jugadas, configure el nivel de la bifurcación en 1:

ansible-playbook --forks=1 ...

También puede poner esto en su archivo cfg ansible:

[defaults]
forks=1

pero si lo desea de forma individual, use la opción de línea de comando anterior.

EDITAR:

serial: 1hace algo completamente diferente: es como ejecutar el libro de jugadas para cada host a la vez, esperar la finalización del libro de jugadas completo antes de pasar al siguiente host. forks=1significa ejecutar la primera tarea en una jugada en un host antes de ejecutar la misma tarea en el siguiente host, por lo que la primera tarea se ejecutará para cada host antes de tocar la siguiente tarea.

Así que solo quieres forks=1una jugada; lamentablemente eso no es posible actualmente.

wurtel
fuente
2
No estaba buscando configurar esto en un libro de jugadas completo. Eso es mucho para no granular. serial: 1déjenme ponerlo en una obra de teatro al menos. Pero solo quiero establecerlo en un subpunto de una obra de teatro (cualquiera que sea el nombre correcto de eso. Pensé que era "tarea", pero el comentario anterior parece estar en desacuerdo).
Elrond
3
serial: 1hace algo completamente diferente: es como ejecutar el libro de jugadas para cada host a la vez, esperar la finalización del libro de jugadas completo antes de pasar al siguiente host. forks=1significa ejecutar la primera tarea en una jugada en un host antes de ejecutar la misma tarea en el siguiente host, por lo que la primera tarea se ejecutará para cada host antes de tocar la siguiente tarea. Así que solo quieres forks=1una jugada; lamentablemente eso no es posible actualmente.
wurtel
¡Buen punto! ¿Te importaría agregar eso a la respuesta?
Elrond
2

Hay una solución alternativa a este problema: se puede pasar una lista de hosts (o un grupo) with_itemsy luego usarla delegate_tocon esta lista. De esta manera, la tarea se ejecutará host por host.

Por ejemplo:

- 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
Tomasz Klosinski
fuente
Para aquellos que se preguntan por qué run_once: trueestá allí, intente sacarlo. No te gustará lo que sucede. (tantas ejecuciones repetidas aaaahhhh)
Almenon
1

Si lo está ejecutando en una sola máquina, entonces surge un problema de bloqueos exclusivos para más de un host. Por lo tanto, debe ejecutar uno por uno para todos los hosts. Para esto, debe --forks=1estar configurado al llamar al comando ansible playbook. Por ejemplo: ansible-playbook webserver.yml --forks=1donde webserver.yml tiene app01 y app02 dentro de su[webserver]

Rohan Seth
fuente
0

Piensa que lo que quieres es

run_once: true

usuario19151
fuente
44
no: "run_once: true" significa ejecutar la tarea para exactamente un host en la lista de hosts. Quiero ejecutarlo para cada host en la lista, pero uno tras otro.
Elrond
0

Para los comandos que se pueden ejecutar localmente, use un bucle para iterar sobre todos los hosts en la obra. Esto SOLO funciona si el comando se puede ejecutar localmente. También podría ejecutar un comando con ssh en las máquinas remotas una por una de esta manera, si las teclas están configuradas, pero se vuelve difícil cuando se habla de escalada.

P.EJ:

- 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 }}"
Michele
fuente
1
Debe proporcionar una lista de hosts en lugar de solo en el host con nombre inventory_hostname, de lo contrario, el bucle no tiene sentido.
Konstantin Suvorov