Come specificare host diversi per diversi playbook in uno script ansible


9

A quanto ho capito, ogni playbook accetta una voce host. Voglio sapere che se creo un playbook contenitore che include altri playbook, posso parametrizzare gli host per ogni playbook incluso. Quindi qualcosa del genere

---
- include playbook_1.yml
    hosts: tag_postgres
- include: playbook_2.yml
    hosts: tag_rabbitmq

Sono in grado di mettere tutti i diversi playbook in uno script e chiamare, ma in questo modo non sono in grado di riutilizzare alcuni set_fact da un playbook in un altro e quindi c'è molta duplicazione di attività.

Un altro corollario della domanda è, posso lanciare ec2 su Amazon che avrebbe

hosts: localhost

e configurazione degli ec2 lanciati, che fondamentalmente configurerebbero l'inventario da -i ec2.py, e con host specificati come

hosts: tag_<some_tag>

accade attraverso lo stesso playbook o un set di playbook inclusi (ruoli diversi)?


sai che puoi avere più di una hosts:sezione nel tuo yaml e, in sostanza, avere diversi playbook che usano gruppi host diversi nel tuo inventario?
Yonsy Solis,

Risposte:


4

In realtà, puoi avere più di un host: sezione per playbook. Sembra che un host: inizia una nuova riproduzione. Vedi http://www.tecmint.com/use-ansible-playbooks-to-automate-complex-tasks-on-multiple-linux-servers/ , ad esempio.

Qualcosa del genere funziona per me (ansible 2.2):

---
- hosts: localhost 
  connection: local
  roles:
    - { role: ec2,
        tag: 'master',
        instance_type: t2.2xlarge,
        count: 1
      }
  tasks:
  - shell: hostname # reports localhost

- hosts: tag_master
  tasks:
  - shell: hostname # reports instance(s) with tag 'master'

Quindi, inserisci host: nella parte superiore di ogni file .yml incluso, non dopo l'inclusione :.


4

http://docs.ansible.com/ansible/playbooks_variables.html#information-discovered-from-systems-facts

... Esistono altri luoghi da cui possono provenire le variabili, ma si tratta di un tipo di variabile che viene scoperto, non impostato dall'utente.

I fatti sono informazioni derivate dal parlare con i tuoi sistemi remoti ...

I fatti sono derivati ​​dai tuoi host remoti. Quindi questo è il motivo per cui normalmente puoi condividere fatti tra i tuoi diversi host quando il tuo file * .yml ha diversi playbook .

Ora puoi accedere a fatti di altri host se fai qualcosa del genere in un'altra parte del tuo playbook:

{{ hostvars['server01.example.com']['ansible_eth0']['ipv4']['address'] }}
...
...
{{ hostvars[groups['servers'][0]]['ansible_eth0']['ipv4']['address'] }}

ma in questo caso, è necessario ricordare che è necessario ottenere i fatti prima di utilizzare questo. Quindi puoi impostare una prima parte nel tuo playbook che ottiene tutti i fatti per tutti gli host o usa la cache dei fatti per questo (vedi: http://docs.ansible.com/ansible/playbooks_variables.html#fact-caching )

Ora, se ti piace condividere le opzioni nei tuoi playbook, forse può essere meglio ripensare le informazioni da inserire nelle variabili e, con questo, puoi "condividere" le tue variabili con le stesse includeistruzioni, guarda questo:

http://docs.ansible.com/ansible/playbooks_variables.html#variables-defined-from-included-files-and-roles


2
La mia domanda era molto specifica per gli host e non per le variabili in generale. La mia necessità è quella di essere in grado di creare un playbook master che non abbia un host, ma ogni playbook incluso contiene un host o può essere fornito come parametro. Posso sempre gestirli come playbook separati, ma i fatti ottenuti in uno non portano avanti al successivo e quindi c'è molta ridondanza
Pankaj Lal

leggi di nuovo sopra per favore: "Ora puoi accedere ai fatti di altri host se fai qualcosa del genere in un'altra parte del tuo playbook: ... ma in questo caso, devi ricordare che devi ottenere i fatti prima di utilizzare questo "quindi sì, puoi condividere i tuoi fatti tra i playbook inclusi nel tuo playbook principale.
Yonsy Solis,
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.