2015-10-14 21 views
26

Ho un grande playbook Ansible in cui vengono create le immagini Docker durante l'esecuzione. Sto usando un numero crescente come tag per la versione. Attualmente, devo specificarlo in ogni sezione hosts:.È possibile definire le variabili globali di Playbook in Ansible?

So che ci sono variabili globali, ma da quello che ho trovato attraverso la ricerca di "variabili globali "ansible"", devono definito al di fuori del playbook. È possibile definire variabili globali che sono globali per il playbook?

risposta

11

Se il tag/versione utilizzata è applicabile a tutti gli host, quindi utilizzando group_vars/all è una valida opzione.

Se i numeri di revisione sono specifici per ciascuna voce host in un file host_vars/nome_host potrebbe essere migliore.

Se si desidera leggere e inizializzare var e quindi incrementarlo dopo ogni riproduzione, diventa un po 'più difficile mantenere tali informazioni attraverso le riproduzioni (o ogni host come si dice) nel playbook. Per esempio, se state cercando di distribuire le istanze della finestra mobile N si potrebbe fare un po 'di magia inventario dinamico come questo:

- hosts: localhost 
    tasks: 
    - add_host: name=docker_{{item}} groups="dockers,other" tag={{item}} 
    with_sequence: start={{ext_def_start}} count={{ext_def_num}} 


- hosts: dockers 
    tasks: 
    - debug: var=tag 
+0

Volevo avere le variabili nel playbook perché ce l'ho in Git. Ricorro quindi a condividere i file di inventario con le variabili e devo adattarlo. Volevo le variabili nel playbook perché una volta che tutto è stato impostato, non cambiano, ma potrebbero essere gli host nell'inventario. – rabejens

+0

Il modo in cui ansible gestisce le variabili è un po 'grossolano, ma è comprensibile data la sua forte dipendenza dagli include impliciti (basati sull'inventario) e dall'incapacità di condividere facilmente le variabili tra i giochi. Come mostra il mio esempio, ho fatto ricorso all'utilizzo di moduli di inventario per spingere i dati nelle unità di inventario. Fatto (vedi modulo set_fact) persistono attraverso i giochi, ma sono su una base per ospite. Tieni presente che puoi sempre scrivere uno script veloce (ad esempio python) per generare un inventario dinamico, compresi i vars e il raggruppamento, che ha esattamente lo stesso aspetto che desideri. – Petro026

+0

Stavo pensando a qualcosa del genere (scrivendo una sceneggiatura che genera un inventario) da solo, penso che lo farò.Il playbook è per la creazione di un cluster Hadoop base con supporto Spark/YARN, database Cassandra e Zeppelin, e potrei scrivere uno script che prima chiede all'utente di enumerare tutti gli host e quindi impostare quali host dovrebbero ospitare il servizio. – rabejens

10

Ansible ha un all gruppo predefinito che, stranamente, contiene tutti gli host del file di inventario.

Come tale si può fare come con nessun gruppo di accoglienza e di fornire group_vars per il gruppo host.

Come mostrato nel collegamento precedente, questi possono essere definiti direttamente nel file di inventario oppure possono essere contenuti in un file separato denominato dopo il gruppo in una directory group_vars allo stesso livello di directory del file di inventario.

Un esempio struttura di directory potrebbe quindi cercare qualcosa di simile:

-ansible 
|--inventory 
| |--group_vars 
| | |--all 
| | |--dev 
| | |--test 
| | |--prod 
| | |--webservers 
| | |--databases 
| |--dev 
| |--test 
| |--prod 
|--roles 
    ... 

Il file di inventario dev potrebbe quindi cercare qualcosa di simile:

[dev:children] 
webservers 
databases 

[webservers] 
web1.dev 
web2.dev 

[databases] 
database-master.dev 
database-slave.dev 

Tutti questi eserciti ora raccogliere qualsiasi configurazione specifica ospite (che potrebbe essere definito in linea o, proprio come con group_vars possono essere messi in una cartella host_vars) e config per i gruppi specifici che sono come e poi i gruppi che ereditano anche da come dev b ut anche, per impostazione predefinita, all.

Questo può quindi essere utilizzato per configurare le cose in modo più grossolana rispetto per host.

Le cose come i server NTP possono essere definite in tutto, mentre i server DNS potrebbero essere definiti a livello di ambiente (se la rete è segmentata in dev, test e produzione potrebbero aver bisogno di diversi server DNS in /etc/resolv.conf) mentre diversi tipi di server possono avere configurazioni diverse attorno a cose come liste di pacchetti da installare. Infine, alcune cose potrebbero dover essere specifiche dell'host come l'impostazione dell'ID del server MySQL in un gruppo di replica.

Se, invece, si desidera solo per definire le impostazioni globali playbook piuttosto che attraverso l'inventario (e così è stato possibile accedere da altri Playbook), allora è sufficiente un blocco vars nella vostra play definizione in questo modo:

- hosts: webservers 
    vars: 
    http_port: 80 
    tasks: 
    - name: Task1 to be ran against all the webservers 
     ... 

Come accennato prima, si può sempre utilizzare il gruppo all anche qui:

- hosts: all 
    vars: 
    ntp_pool: 
     - ntp1.domain 
     - ntp2.domain 
    tasks: 
    - name: Task1 to be ran against all the servers 
     ... 

In generale, comunque, mi sento di raccomandare vivamente di utilizzare i ruoli di strutturare ciò che le cose sono corse contro certa h host e quindi utilizzare l'inventario per spiegare quali server sono di tipo e quindi utilizzare una directory group_vars a livello di inventario per contenere tutte le variabili per quei gruppi di host. Fare le cose in questo modo ti aiuterà a mantenere le cose in luoghi sensibili e ti permetterà di riutilizzare facilmente il tuo codice base.

+0

Hmm, mettendo un '[{padroni di casa: 'tutti', Vars: {test: 'ciao'}}, {hosts: 'web': ruoli: [...]} 'Quando entro nei ruoli dopo la fase di installazione su 'all', ottengo comunque' una variabile che non è definita. ' ( – ThorSummoner

+0

@ThorSummoner Lo sto prendendo anche io. Penso che quelle variabili siano valide solo per un'attività chiamata all'interno di quel gruppo di host. –

+0

Se sei interessato, scriverò la mia soluzione. –

0

Sì, vars globali sono possibili in questo modo,

campione configurazione splunk playbook

splunk/ 
    setup_splunk_playbook.yaml 
    roles/base 
      /tasks/main.yaml 
      /tasks/install.yaml 
     search_head 
      /tasks/configure.yaml 
     indexer 
      /tasks/configure.yaml 
     some_other_role 
      /tasks/some_task.yaml 
    hosts 
    config.yaml 

Posizionare i vostri Vars in config.yaml

gatto Splunk/config.yaml

--- 
# global Splunk variables 
splunk_version: 7.0.0 

nel playbook, comprendono i ruoli

gatto setup_splunk_playbook.yaml

- hosts: "search_heads" 
    become_user: root 
    become: true 
    gather_facts: true 

    roles: 
    - base 
    - search_head 

nel tuo ruolo, includere le Vars globali all'interno di un compito

ruoli gatto/base/compiti/main.yaml

--- 
# install Splunk Base 

- name: include vars 
    include_vars: "{{ playbook_dir }}/config.yaml" 

- include: install.yaml 

Vars sono accessibili in compiti a questa parte, i ruoli

gatto/base/attività/install.yaml

- name: echo version 
    debug: splunk version is {{ splunk_version }} 
+0

Non funziona per l'utilizzo di variabili nella proprietà "hosts:". – hakre

Problemi correlati