Risposta: Come eseguire un Task Host per Host?


15

A livello di gioco, dobbiamo serial: 1permetterci di eseguire l'intero gioco un host alla volta. Ma non ho trovato un modo semplice per farlo su una singola attività. Ciò è particolarmente rilevante se l'attività in questione non esegue il blocco corretto (per qualsiasi motivo).

Una risposta ovvia è mettere il compito in proprio. Ma questo non aiuta con i ruoli. (Dover serial: 1recitare nel ruolo usando il ruolo non è davvero intuitivo.)

Risposte:


11

Se non si desidera alcun parallelismo nell'esecuzione dei passaggi nel proprio playbook, impostare il livello fork su 1:

ansible-playbook --forks=1 ...

Puoi anche metterlo nel tuo file cfg ansible:

[defaults]
forks=1

ma se lo desideri su base individuale, usa l'opzione della riga di comando sopra.

MODIFICARE:

serial: 1fa qualcosa di completamente diverso: è come eseguire il playbook per ogni host a sua volta, in attesa del completamento del playbook completo prima di passare all'host successivo. forks=1significa eseguire la prima attività in una riproduzione su un host prima di eseguire la stessa attività sull'host successivo, quindi la prima attività verrà eseguita per ciascun host prima che venga toccata l'attività successiva.

Quindi vuoi forks=1solo una commedia; sfortunatamente ciò non è attualmente possibile.


2
Non stavo cercando di impostarlo su un intero playbook. È molto non granulare. serial: 1fammelo fare almeno una commedia. Ma voglio solo impostarlo su un sottotem di una rappresentazione teatrale (qualunque sia il nome corretto di quello che è. Ho pensato, era "compito", ma il commento sopra sembra non essere d'accordo).
Elrond,

3
serial: 1fa qualcosa di completamente diverso: è come eseguire il playbook per ogni host a sua volta, in attesa del completamento del playbook completo prima di passare all'host successivo. forks=1significa eseguire la prima attività in una riproduzione su un host prima di eseguire la stessa attività sull'host successivo, quindi la prima attività verrà eseguita per ciascun host prima che venga toccata l'attività successiva. Quindi vuoi forks=1solo una commedia; sfortunatamente ciò non è attualmente possibile.
wurtel,

Buon punto! Ti dispiacerebbe aggiungerlo alla risposta?
Elrond,

2

Esiste una soluzione a questo problema: è possibile passare un elenco di host (o un gruppo) a with_items, quindi utilizzarlo delegate_tocon questo elenco. In questo modo l'attività verrà eseguita host dall'host.

Per esempio:

- 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

Per quelli che si chiedono perché run_once: trueè lì dentro, prova a eliminarlo. Non ti piacerà quello che succede. (tante ripetizioni ripetute aaaahhhh)
Almenon,

1

Se lo stai eseguendo su un singolo computer, allora si verifica un problema di blocchi esclusivi per più di un host. Pertanto, dovresti eseguirlo uno per uno per tutti gli host. Per questo è necessario aver --forks=1impostato quando si chiama il comando Ansible Playbook. Per esempio: ansible-playbook webserver.yml --forks=1dove webserver.yml ha app01 e app02 dentro il tuo[webserver]


0

Pensa che cosa vuoi

run_once: true


4
no: "run_once: true" significa eseguire l'attività esattamente per un host nell'elenco di host. Voglio eseguirlo per ogni host nell'elenco, ma uno dopo l'altro.
Elrond,

0

Per i comandi che possono essere eseguiti localmente, utilizzare un ciclo per scorrere su tutti gli host nella riproduzione. Funziona SOLO se il comando può essere eseguito localmente. È anche possibile eseguire un comando con ssh in esso sui computer remoti uno alla volta in questo modo, se i tasti sono impostati, ma diventa difficile quando si parla di escalation.

PER ESEMPIO:

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

1
Devi fornire un elenco di host anziché solo sull'host con nome inventory_hostname, altrimenti il ​​ciclo non ha senso.
Konstantin Suvorov,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.