Resources attached to the Road To DevOps tutorial https://blog.noobtoroot.xyz/road-to-devops/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

284 lines
8.0 KiB

## 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`.
<!-- .slide: data-background="#2E2E2E" data-state="small-code" -->
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
```
<!-- .slide: data-background="#2E2E2E" data-state="medium-code" -->
Créer `playbook-vault.yaml`
```yaml
- hosts: debian9
tasks:
- name: Display secured password
debug:
msg: "Robert's password is: {{ vault_robert_password }}"
```
<!-- .slide: data-background="#2E2E2E" data-state="medium-code" -->
Lancer le playbook
```none
$ ansible-playbook -i inventories/formation/hosts playbook-vault.yaml
PLAY [debian9] *****************************************************
ERROR! Attempting to decrypt but no vault secrets found
```
<small>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`.</small>
<!-- .slide: data-background="#2E2E2E" data-state="small-code" -->
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`.
<!-- .slide: data-background="#2E2E2E"" -->
Créer un fichier contenant le mot de passe vault
```none
$ echo "12345678" > vault-password
$ chmod 600 vault-password
```
<small>`Attention` ! Dans un environnement Git attention à ne pas versionner le fichier contenant le mot de passe, en utilisant `.gitignore` par exemple.</small>
<!-- .slide: data-background="#2E2E2E" data-state="small-code" -->
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
```
<!-- .slide: data-background="#2E2E2E" -->
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
```
<!-- .slide: data-background="#2E2E2E" -->
Créer `inventories/formation/group_vars/all/vars`
```yaml
robert_password: "{{ vault_robert_password }}"
```
<small>La variable `robert_password` pointe sur
la variable `vault_robert_password` stockée dans le fichier `vault`.</small>
* Modifier le fichier playbook pour utiliser la variable provenant du fichier `vars`.
* Lancer le playbook.
<!-- .slide: data-background="#2E2E2E" data-state="small-code" -->
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/