Considérons un fichier d'inventaire Ansible semblable à l'exemple suivant:
[san_diego]
Host1
Host2
[san_francisco]
Host3
Host4
[west_coast]
san_diego
san_francisco
[west_coast:vars]
db_server=foo.example.com
db_Host=5432
db_password=top secret password
Je voudrais stocker certains des vars (comme db_password
) dans un emplacement de stockage Ansible , mais pas le fichier entier.
Comment importer un fichier ansible chiffré dans un coffre-fort dans un fichier d'inventaire non chiffré?
J'ai créé un fichier vars crypté et j'ai essayé de l'importer avec:
include: secrets
Pour lequel ansible-playbook
a répondu avec:
ERROR: variables assigned to group must be in key=value form
Probablement parce qu'il a essayé d'analyser l'instruction include
en tant que variable.
Si votre problème est d'avoir à la fois des fichiers vars non cryptés et cryptés par hôtes_groupe.
Vous pouvez utiliser cette fonctionnalité ansible: http://docs.ansible.com/ansible/playbooks_best_practices.html#best-practices-for-variables-and-vaults
group_vars/
san_diego/
vars.yml # unencrypted yaml file
vault.yml # encrypted yaml file
Ansible lira automatiquement vault.yml en tant que fichier yaml crypté.
Mise à jour: La solution ci-dessous est également une bonne solution (depuis Ansible 2.3)
Depuis Ansible 2.3, vous pouvez crypter une Variable cryptée unique. IMO, une visite virtuelle est nécessaire car le document semble trop concis.
Soit un exemple de: mysql_password: password123
(dans main.yml)
Exécuter une commande telle que:
ansible-vault encrypt_string password123 --ask-vault-pass
Cela produira:
!vault |
$ANSIBLE_VAULT;1.1;AES256
66386439653236336462626566653063336164663966303231363934653561363964363833
3136626431626536303530376336343832656537303632313433360a626438346336353331
Encryption successful
coller ceci dans votre main.yml:
mysql_password: !vault |
$ANSIBLE_VAULT;1.1;AES256
66386439653236336462626566653063336164663966303231363934653561363964363833
3136626431626536303530376336343832656537303632313433360a626438346336353331
run playbook:
Ie, ansible-playbook -i hosts main.yml --ask-vault-pass
Verify via debug:
- debug:
msg: "mysql Pwd: {{ mysql_password }}"
À l’heure actuelle, avec Ansible 2.3, il est possible d’avoir dans un yaml clair des variables chiffrées et non chiffrées. Le format des variables cryptées est le suivant:
dbServer: PlainDatabaseServer
dbName: PlainDatabaseName
dbUser: PlainUser
dbPasswd: !vault |
$ANSIBLE_VAULT;1.1;AES256
63633363616165656538656537323835343634633063386137353637646663333939623464666437
6263383933656635316436313934366564316337623435350a386362613838373363393534383232
39663162363066313431623466363763356466376538613532333731613538373431623239626330
6463373238366630360a623566616535376339326431363465663431623462356238636333306663
6439
Vous pouvez chiffrer la variable en utilisant un mot de passe ou un fichier de mot de passe avec la déclaration suivante:
ansible-vault encrypt_string "dummy" --vault-password-file pass-ansible.txt
Cette instruction retourne le texte affiché dans la variable dbPasswd dans la variable yaml ci-dessus.
Pour exécuter un livre de lecture utilisant la variable chiffrée, ajoutez simplement la variable suivante:
ansible-playbook playbooks/myplaybook --vault-password-file pass-ansible.txt
Vous pouvez également faire de même avec --ask-vault-pass, qui vous demande le mot de passe pour exécuter le livre de lecture:
ansible-playbook playbooks/myplaybook --ask-vault-pass
Vous pouvez faire quelque chose de semblable à ceci.
Créez un ansible.cfg
dans votre dossier de projet ansible
[defaults]
vault_password_file = <path/to/your/password/file>
Créer un fichier de livre de lecture (par exemple playbook.yml
)
- name: my ansible playbook
hosts: 127.0.0.1
vars_files:
- 'vars.yml'
tasks:
- name: print secure variable
debug: msg="my secure variable '{{ my_secure_variable }}'"`
Créer un fichier de variable (par exemple vars.yml
)
my_secure_variable: "X_my_secret_X"
Chiffrer le fichier de variable (à partir de l'emplacement du projet ansible avec le ansible.cfg
)
ansible-vault encrypt vars.yml
Lancez votre playbook (à partir de l'emplacement du projet ansible avec le ansible.cfg
)
ansible-playbook -i "localhost," playbook.yml
Vous devriez obtenir une sortie semblable à:
$ ansible-playbook playbook.yml -i 'localhost,'
PLAY [my ansible playbook] ****************************************************
GATHERING FACTS ***************************************************************
ok: [127.0.0.1]
TASK: [print secure variable] *************************************************
ok: [127.0.0.1] => {
"msg": "my secure variable 'X_my_secret_X' "
}
PLAY RECAP ********************************************************************
127.0.0.1 : ok=2 changed=0 unreachable=0 failed=0
Cela dépend de votre flux de travail. Vous pouvez utiliser un fichier group_vars
selon la suggestion de Sebastian Stigler ou, si vous souhaitez utiliser un fichier d'inventaire, vous pouvez simplement ajouter un autre fichier de type "ini" dans un répertoire d'inventaire et le chiffrer.
$ mkdir my_inventory/
$ cat >> hosts << EOF
[san_diego]
Host1
Host2
[san_francisco]
Host3
Host4
[west_coast]
san_diego
san_francisco
EOF
$ cat >> inventory_crypted_vars << EOF
[west_coast:vars]
db_server=foo.example.com
db_Host=5432
db_password=top secret password
EOF
Ensuite, utilisez -i my_inventory/
dans votre ligne de commande ou créez un ansible.cfg
local contenant:
[defaults]
hostfile = ./my_inventory/
et vous devriez être mis. Ansible fusionnera les deux fichiers au moment de l'exécution.
Utilisez ansible-vault encrypt my_inventory/inventory_crypted_vars
avant de vous engager et vous êtes prêt.
Vous voulez probablement un crochet de pré-validation pour vous assurer de ne pas commettre de version non chiffrée du fichier. Par exemple un crochet de pré-validation comme ceci ferait l'affaire (ajustez FILES_PATTERN
en conséquence).
Vous pouvez utiliser group_vars (voir http://docs.ansible.com/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable ).
Créez un sous-répertoire dans votre livre de lecture nommé group_vars
.
Là vous créez un fichier nommé west_coast
et y mettez les entrées suivantes:
---
db_server: foo.example.com
db_Host: 5432
db_password: top secret password
Ce fichier peut ensuite être converti en un coffre-fort ansible.