Come usare le variabili e le variabili Ansible

[ware_item id=33][/ware_item]

Come ExpressVPN utilizza Ansible


Come utilizziamo Ansible ampiamente su ExpressVPN

I nostri team di sviluppo lavorano in modo indipendente, vale a dire, un team possiede il proprio prodotto per l'intero ciclo di vita. Questo set significa che la nostra comprensione Ansible proviene da una raccolta di conoscenze da molti team diversi dell'azienda piuttosto che da un gruppo centralizzato che gestisce Ansible.

Una forza lavoro decentralizzata offre ai nostri team molta flessibilità e mobilità, ma fa anche pressione sulle persone affinché sappiano molto su molti strumenti.

Per semplificare la condivisione delle conoscenze e l'utilizzo corretto degli strumenti, abbiamo deciso di standardizzare il modo in cui utilizziamo Ansible per la gestione della configurazione e le operazioni del server.

Questo blog tratta le lezioni che abbiamo imparato operando su nostra scala, le riflessioni sul modo in cui lavoriamo e su come gestiamo Ansible in tale contesto.

Documentazione attendibile

Entriamo subito! La documentazione per Ansible lascia alcune cose a desiderare, specialmente quando si tratta di documentazione end-to-end (come, come si ottiene dal punto A al punto Z?).

Alcune domande che incontriamo regolarmente sono: "Come funziona la precedenza variabile?" E "Come si inserisce Ansible Vault?"

Entrambi i problemi sono documentati molto bene in modo indipendente (qui e qui), e la pagina Variabili Ansible ha una bella sezione sulla precedenza esplicitamente, ma l'intersezione dei due riceve solo una breve menzione. Il problema è che non ci sono collegamenti tra la documentazione su Variabili e depositi, dando l'impressione che l'onere sia sull'utente per capire come i due si intersecano tra loro.

Quindi, oggi proveremo a coprire l'intersezione tra Variabili e Vault e le migliori pratiche.

Per cosa puoi usare i file Ansible Vault

In sintesi: la documentazione di Vault afferma che puoi essenzialmente crittografare qualsiasi cosa all'interno della tua cartella Ansible in un file Vault, e Ansible proverà a decodificarlo "in modo intelligente" ogni volta che una riproduzione include questi file. Huh. Freddo!

La documentazione su Variables non menziona nulla sui file di Vault, il che è strano poiché Vault è stato progettato per i file delle variabili. Quindi come si adattano insieme? È importante notare questo I file Vault stessi non hanno alcun significato speciale per l'elaborazione o la precedenza delle variabili, quindi c'è molta flessibilità. Ma potenzialmente questo non ti lascia abbastanza informazioni su come usarlo correttamente.

Come non usare AnsibleLo stai facendo male.

Prendi questo esempio di una semplice cartella Ansible:

.
├── group_vars
│ ├── tutto
│ ├── produzione
│ └── messa in scena
├── ansible.cfg
├── inventario
└── playbook.yml

A prima vista, questa configurazione sembra buona; questa sarebbe una struttura relativamente comune da produrre se si dovesse leggere la documentazione. Un osservatore potrebbe potenzialmente supporre che i file di gestione temporanea e di produzione in group_vars siano Vault, ma ciò non è necessariamente vero, il che di per sé è un problema.

Ora, il file "all" non può essere un file Vault poiché (si spera) hai crittografato i file Vault di staging e produzione con password diverse. Ma significa anche che il tuo file group_vars per ambienti deve contenere una combinazione di segreti e non segreti poiché sei limitato a un file per ambiente.

Per questo motivo - e se hai estrapolato un po 'dopo aver letto l'introduzione ai Vault nella documentazione di Ansible - probabilmente hai creato i depositi di produzione / stadiazione copiando inizialmente il contenuto di "tutto" e poi modificandoli.

Ciò significa che il tuo file "all" potrebbe apparire così:

Banca dati:
nome utente: default_user
password: falsa

super_important_var_that_should_be_one: 1

E il tuo file Vault di produzione potrebbe apparire così:

Banca dati:
nome utente: produser
password: supersecretpasswordnoonecansee

super_important_var_that_should_be_one: 1

(Non preoccuparti, questa non è la nostra vera password di produzione! Abbiamo ricontrollato.)

Quanto sopra è pericoloso per ragioni che potrebbero non essere ovvie. Ad esempio, potresti perdere la modifica di un valore predefinito per la produzione e / o il tuo file "all" potrebbe anche essere nominato errato e non incluso affatto! (Questa è la causa principale dell'interruzione che abbiamo avuto la scorsa settimana.)

Procedura consigliata: come utilizzare i file Ansible Vault in modo sicuro

Come indicato nella pagina delle migliori pratiche, la creazione di un file in un file Vault oscura il contenuto del file, quindi presentano un grosso svantaggio: non è possibile cercare quali variabili si trovano all'interno del file Vault senza decifrarle esplicitamente. Questo sistema significa che chiunque stia guardando la tua configurazione Ansible non ha idea di cosa ci sia dentro questi file senza conoscere anche la password di Vault (terribile per le revisioni del codice!). Pertanto, si consiglia di inserire il minor numero possibile di variabili nei file Vault. (In altre parole, metti solo i segreti nei file di Vault!)

Quindi, diamo un'occhiata a una struttura che renderebbe più facile non spararti nel piede:

.
├── group_vars
│ ├── tutto
│ │ └── vars.yml
│ ├── produzione
│ │ ├── vars.yml
│ │ └── vault.yml
│ └── messa in scena
│ └── vault.yml
├── ansible.cfg
├── inventario
└── playbook.yml

La documentazione relativa alle migliori pratiche raccomanda inoltre di utilizzare uno "strato di riferimento indiretto", il che significa che dovresti essere il modello in tutte le variabili nel file Vault nelle variabili a cui fai riferimento nei tuoi playbook. Ti consiglia inoltre di aggiungere un prefisso alle variabili del tuo vault con "vault_", il che significa che tutto / vars.yml potrebbe essere simile a:

Banca dati:
nome utente: default_user
password: "{{vault_database_password}}"

super_important_var_that_should_be_one: 1

La tua produzione / vars.yml è simile a questa:

Banca dati:
nome utente: produser

E il tuo file production / vault.yml dovrebbe contenere solo questo:

vault_database_password: supersecretpasswordnoonecansee

Questa struttura rivista ha un paio di vantaggi. Prima di tutto, se stai facendo revisioni del codice (per favore, fallo!), Significa che i tuoi revisori possono vedere cosa hai cambiato, insieme a ciò che hai aggiunto e rimosso in (quasi tutte) la tua configurazione. Con questa struttura, i revisori non vedranno solo una modifica completa del file su un Vault che deve essere decrittografato manualmente, salvato su disco e diffuso con la versione precedente.

E, cosa ancora più importante, Ansible non riuscirà nemmeno a rendere i vars se manca il file vault_database_password Variabile all'interno del Vault, che ti salverà da almeno una serie di problemi che potresti riscontrare se non stai tenendo sotto controllo i tuoi file Vault.

Se ti attieni a questo schema, non importa se si tratta di un gruppo host all'interno di un ambiente, un ambiente completo per cui stai impostando Variabili o anche la cartella "all", i tuoi colleghi non saranno mai confusi su ciò che è e non è all'interno la cassaforte.

Per ora è tutto, speriamo che ti sia stato utile!

Come usare le variabili e le variabili Ansible
admin Author
Sorry! The Author has not filled his profile.