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.
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
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
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