## TP Ansible Vault Sécuriser les informations sensibles. * Créer un dossier nommé `all` dans `group_vars`. ```none . └── inventories    └── formation    ├── group_vars    │   └── all <---- ici    └── hosts ``` * Créer avec la commande `ansible-vault create` : - un fichier nommé `vault` - dans `group_vars/all`. * Ajouter une variable dans le fichier. ```none . └── inventories    └── formation    ├── group_vars    │   └── all    │   └── vault <---- ici    └── hosts ``` ```none vault_robert_password: Mon super password ! ``` * Vérifier le contenu du fichier vault - avec la commande `cat`, - avec la commande `ansible-vault view`. * Il est possible de modifier le contenu du fichier chiffré avec la commande `ansible-vault edit`. Avec `cat` ```none $ cat inventories/formation/group_vars/all/vault $ANSIBLE_VAULT;1.1;AES256 64373435616463653634613737613565626662326539376138393733333762343364303961306536 6337336233323932346134313838666538363863376562360a326561356365626462373963636233 63613139383437303262616366623538613761336361626665653631343061326535373363643039 3633363965363237370a623063343839626634633435373834386332313933643661356266653265 35333234643234376266343935303837373561333265653338323235656638316539646137313234 3861623031393635646363343662366161343130653864336331 ``` Avec `ansible-vault` ```none $ ansible-vault view inventories/formation/group_vars/all/vault Vault password: vault_robert_password: Mon super password ! ``` * Créer un playbook nommé `playbook-vault.yaml`. * Ajouter une tâche de debug qui affichera la variable stockée dans le fichier `vault`. * Lancer le playbook ! * La structure du dossier de travail est : ```none . ├── inventories │   └── formation │   ├── group_vars │   │   └── all │   │   └── vault │   └── hosts └── playbook-vault.yaml ``` Créer `playbook-vault.yaml` ```yaml - hosts: debian9 tasks: - name: Display secured password debug: msg: "Robert's password is: {{ vault_robert_password }}" ``` Lancer le playbook ```none $ ansible-playbook -i inventories/formation/hosts playbook-vault.yaml PLAY [debian9] ***************************************************** ERROR! Attempting to decrypt but no vault secrets found ``` Il nous faut donc préciser le mot de passe de déchiffrement vault en utilisant au choix l'option `--ask-vault-pass` ou l'option `--vault-password-file`. Lancer le playbook avec `--ask-vault-pass` ```none $ ansible-playbook -i inventories/formation/hosts playbook-vault.yaml --ask-vault-pass Vault password: PLAY [debian9] ***************************************************************** TASK [Gathering Facts] ********************************************************* ok: [ansible-3] TASK [Display secured password] ************************************************ ok: [ansible-3] => { "msg": "Robert's password is: Mon super password !" } PLAY RECAP ********************************************************************* ansible-3 : ok=2 changed=0 unreachable=0 failed=0 ``` * Afin d'éviter d'avoir à taper le mot de passe vault à chaque fois, mettons le dans un fichier ! * Relancer le playbook en précisant l'option `--vault-password-file`. Créer un fichier contenant le mot de passe vault ```none $ echo "12345678" > vault-password $ chmod 600 vault-password ``` `Attention` ! Dans un environnement Git attention à ne pas versionner le fichier contenant le mot de passe, en utilisant `.gitignore` par exemple. Relancer le playbook avec l'option `--vault-password-file` ```none $ ansible-playbook -i inventories/formation/hosts playbook-vault.yaml \ --vault-password-file vault-password PLAY [debian9] ***************************************************************** TASK [Gathering Facts] ********************************************************* ok: [ansible-3] TASK [Display secured password] ************************************************ ok: [ansible-3] => { "msg": "Robert's password is: Mon super password !" } PLAY RECAP ********************************************************************* ansible-3 : ok=2 changed=0 unreachable=0 failed=0 ``` * Pour éviter d'avoir à préciser le fichier de mot de passe vault à chaque exécution du playbook, il est possible d'en préciser le nom une fois pour toutes dans le fichier de configuration `ansible.cfg` à la racine du projet local. * Créer le fichier `ansible.cfg` et ajouter le paramètre `vault_password_file` dans la section `[defaults]`. * La structure du dossier de travail devient : ```none . ├── ansible.cfg <----- c'est ici que ça se passe ├── inventories │   └── formation │   ├── group_vars │   │   └── all │   │   ├── vars │   │   └── vault │   └── hosts ├── playbook-vault.yaml └── vault-password ``` Référencer le fichier de mot de passe vault dans `ansible.cfg` ```none [defaults] vault_password_file = vault-password ``` __Bonnes pratiques avec vault__ * Lorsqu'on utilise vault, les variables et leurs valeurs sont offusquées, il n'est pas forcément évident d'assurer la maintenance sur ces fichiers de variables. * Les bonnes pratiques Ansible préconisent de passer par une couche d'indirection, c'est à dire d'ajouter un fichier non chiffré dont les variables référenceront les variables vault. * Créer un nouveau fichier nommé `vars` dans `group_vars/all`. * Ajouter la variable et la faire pointer vers la variable vault. * La structure du dossier de travail devient : ```none . ├── ansible.cfg ├── inventories │   └── formation │   ├── group_vars │   │   └── all │   │   ├── vars <----- fichier d'indirection │   │   └── vault │   └── hosts ├── playbook-vault.yaml └── vault-password ``` Créer `inventories/formation/group_vars/all/vars` ```yaml robert_password: "{{ vault_robert_password }}" ``` La variable `robert_password` pointe sur la variable `vault_robert_password` stockée dans le fichier `vault`. * Modifier le fichier playbook pour utiliser la variable provenant du fichier `vars`. * Lancer le playbook. Modifier `playbook-vault.yaml` ```yaml --- - hosts: debian9 tasks: - name: Display secured password debug: msg: "Robert's password is: {{ robert_password }}" ``` Lancer le playbook ```none $ ansible-playbook -i inventories/formation/hosts playbook-vault.yaml \ --vault-password-file vault-password PLAY [debian9] ***************************************************************** TASK [Gathering Facts] ********************************************************* ok: [ansible-3] TASK [Display secured password] ************************************************ ok: [ansible-3] => { "msg": "Robert's password is: Mon super password !" } PLAY RECAP ********************************************************************* ansible-3 : ok=2 changed=0 unreachable=0 failed=0 ``` __Pour aller plus loin__ Il est possible d'aller encore plus loin avec les `vault-id` : * https://docs.ansible.com/ansible/latest/user_guide/vault.html#vault-ids-and-multiple-vault-passwords * https://dev.iachieved.it/iachievedit/ansible-vault-ids/