Ansible: un host appare in più di un gruppo ed entrambi i gruppi hanno gli stessi compiti in essi; un modo per eseguire le attività una volta?


9

Ho un playbook che assomiglia a questo:

---
- hosts: group1
  roles:
    - role1
    - role2

- hosts: group2
  roles:
    - role2
    - role3

Ora dì che ho un file hosts che ha una voce come questa:

[group1]
host1.example.com

[group2]
host1.example.com

Ansible eseguirà le attività in role2 DUE VOLTE per host1.example.com perché appare in 2 gruppi e ognuno ha assegnato loro2.

Come posso far capire ad Ansible che ha lo stesso ruolo incluso due volte e quindi dovrebbe eseguirlo solo una volta?


Sarebbe meglio darci esempi reali invece di "ruolo1", "ruolo2" ecc., Perché forse dovresti farlo diversamente. Ma dipende da cosa stai effettivamente cercando di ottenere.
Antonis Christofides,

Risposte:


10

Come accennato, questo è di progettazione. Ansible esegue solo un gioco alla volta. Il tuo playbook è composto da due giochi (i due elementi nell'elenco YAML a livello di root definito dal file del playbook). Il primo gioco applica role1 e role2 al gruppo1. Quella giocata viene eseguita per prima e solo una volta terminata inizia la seconda giocata. Ma Ansible non tenta di unire le rappresentazioni logicamente. Dopotutto, potresti effettivamente voler eseguire due volte le attività in role2.

Per quanto riguarda la risoluzione del problema, ci sono alcuni modi per aggirare questo problema e che si sceglie dipenderà dai dettagli dei gruppi e dei ruoli.

Se tutte le attività in role2 sono idempotenti, ovvero se possono essere eseguite più volte e finiscono con lo stesso risultato ogni volta, allora tutto ciò che stai davvero perdendo è il tempo ed è giusto lasciare che i ruoli si ripetano. Se i ruoli richiedono molto tempo per essere applicati o se non riesci a renderlo idempotente, considera le seguenti idee:


È possibile dividere il playbook in tre giochi e applicare i ruoli individualmente:

---
- hosts: group1
  roles:
    - role1

- hosts: group1:group2
  roles:
    - role2

- hosts: group2
  roles:
    - role3

Oppure, se è necessario raggruppare i ruoli, è possibile creare un terzo gruppo per i server che richiedono tutti e tre i ruoli. Non è necessario eliminarli dagli altri due gruppi. È possibile creare il gruppo nel file di inventario in questo modo:

[group1and2:children]
group1
group2

Quindi nel tuo playbook potresti di nuovo dividerlo in tre giochi, ma usa il terzo gruppo per evitare di ricoprire ruoli:

---
- hosts: group1:!group1and2
  roles:
    - role1
    - role2

 - hosts: group1and2
   roles:
     - role1
     - role2
     - role3

 - hosts: group2:!group1and2
   roles:
     - role2
     - role3

È piuttosto brutto ma potrebbe essere utile in alcuni casi.


Grazie, penso che andrò con una variante dell'opzione (2) - Renderò i miei gruppi e ruoli più granulari per raggruppare i miei server.
Asfand Qazi,

Se chiamo host tramite variabile come {{host1}} e {{host2}}, come posso metterli insieme?
BMW

Se cerchi la sezione documentazione: Schemi comuni
Sahap Asci

3

Questo è di progettazione. L'unico modo per procedere sarebbe applicare il ruolo 2 solo in un playbook a un gruppo specifico e non utilizzare il ruolo 2 in qualsiasi altro playbook di un gruppo che potrebbe avere membri comuni, come qui.

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.