|
|
|
|
## 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/
|