Cos’è Ansible:


Ansible​ è uno strumento open source per l’a​utomazione.​ Fornisce una piattaforma semplice​, ​agentless​ e potente che permette di automatizzare tutti i processi di una infrastruttura indipendentemente dal tipo di infrastruttura stessa e dal tipo di processo.

(Per una introduzione più dettagliata rimando alla guida precedente: Introduzione ad Ansible)​

 

Problema:


Ansible​ permette, attraverso l’uso di semplici file in formato Y​AML​ di scrivere su semplici file di testo le ​configurazioni​ necessarie per il p​rovisioning​, tra le altre cose, della nostra infrastruttura. Tali ​configurazioni​ possono -o sarebbe meglio dire devono- essere versionate​ su un sistema di tipo ​DCVS​. A questo punto però sorge un problema: come facciamo a tenere ​nascoste informazioni sensibili, come le chiavi ssh ad esempio?

 

Soluzione:


Ansible​ risponde in maniera ​ottimale​ a questo problema grazie ad A​nsible Vault: un meccanismo che permette di ​criptare​ e ​decriptare​ le ​variabili​ di un playbook automaticamente​. Usando questa feature di Ansible le nostre informazioni sensibili saranno criptate nel server della nostra azienda, restando n​ascoste​ da occhi m​aliziosi​ ma comunque perfettamente accessibili​ ed ​usabili​ dai nostri sistemi.

 

Hands on:

Per prima cosa creiamo il ​file​ contenente la password​ con cui andremo a criptare le nostre variabili: tale file ​non ​dovrà essere versionato ma è importante che venga conservato lontano da occhi indiscreti, perché permette di decriptare le informazioni che vogliamo tenere nascoste.

 

echo "MyVeryComplicatedLongPassword" > ~/.vault_pass.txt
chmod 600 ~/.vault_pass.txt

 

“~/.vault_pass.txt” contiene ora la nostra password che useremo per criptare le informazioni sensibili.

Successivamente seguendo le ​best practice​ creiamo 2 file contenenti uno le variabili che andremo ad usare e l’altro i corrispettivi valori criptati:

 

→ cat group_vars/localhost/vars.yml 
---

my_secret_key: "{{ vault_my_secret_key }}"

 

→ cat group_vars/localhost/vault.yml 
---

vault_my_secret_key: VerySecretValue

 

“vars.yml” contiene la variabile che useremo nel nostro playbook mentre “vault.yml” contiene il valore corretto che andremo a criptare.
Criptiamo “vault.yml”:

 

→ ansible-vault encrypt group_vars/localhost/vault.yml --vault-password-file ~/.vault_pass.txt 
Encryption successful

 

→ head -n3 group_vars/localhost/vault.yml
$ANSIBLE_VAULT;1.1;AES256 3237356333336666353533356334303539653039623464373133373962663530663933313 4313965 6664326664393537356334323539663333366237633863390a64366134393130363834353 6373735

 

Possiamo vedere che il file contenente le variabili con valori sensibili è stato criptato permettendoci di caricarlo su un repository pubblico.
Scriviamo ora un semplice playbook per testare il corretto funzionamento ed un relativo ruolo:

 

→ cat provision.yml 
---

- name: Deploy keys 
    hosts: localhost 
    connection: local 
    gather_facts: no 
    roles:
      - { role: deploy-keys } 
    vars_files:
      - 'group_vars/localhost/vars.yml'
      - 'group_vars/localhost/vault.yml'

 

→ cat roles/deploy-keys/tasks/main.yml 
---
# tasks file for deploy-keys

- name: Copy keys in the tmp directory on the remote server. 
  copy:
    content: "{{ my_secret_key }}"
    dest: /tmp/keys.txt

 

Questo semplice playbook copia il contenuto della variabile “my_secret_key” in un file “/tmp/keys.txt”.

Ricordiamoci che quest’ultima variabile punta a quella criptata.
Eseguiamo ora il playbook:

 

 

→ ansible-playbook provision.yml --vault-password-file ~/.vault_pass.txt
[WARNING]: provided hosts list is empty, only localhost is available


PLAY [Deploy keys] *************************************************************

TASK [deploy-keys : Copy keys in the tmp directory on the remote server.] ******
changed: [localhost]

PLAY RECAP ********************************************************************* 
localhost : ok=1 changed=1 unreachable=0 failed=0

 

E controlliamo che il file sia stato creato correttamente:
 

 

→ cat /tmp/keys.txt 
VerySecretValue

 

Se abbiamo bisogno di modificare la nostra variabile criptata nessun problema:

 

→ ansible-vault decrypt group_vars/localhost/vault.yml --vault-password-file 
~/.vault_pass.txt
Decryption successful

 

→ cat group_vars/localhost/vault.yml 
---

vault_my_secret_key: VerySecretValue

 

Ricordiamoci solo di criptare nuovamente il file una volta finito.
Ansible Vault ci mette a disposizione una serie di comandi per gestire al meglio il nostro file criptato: [create|decrypt|edit|encrypt|rekey|view].
Il codice di questo tutorial è disponibile su g​ithub.​

 

Conclusioni:


Ansible​ è uno strumento estremamente ​semplice​ ma ​potente​ la cui versatilità ci permette di sviluppare ed ottimizzare le nostre ​procedure​ in tutta ​sicurezza​.
In questo tutorial abbiamo ​imparato​ come usare la caratteristica di ​Ansible​ ​Vault​ per versionare playbook contenenti i​nformazioni​ sensibili tenendole n​ascoste​ in ogni caso da occhi indiscreti.

 

E voi avete esperienze ​Ansible​ da c​ondividere?​

 

Andrea Lorenzetti