Ansible: comment chiffrer certaines variables dans un fichier d'inventaire dans un fichier séparé?
paramètres
Envisager un fichier D'inventaire possible 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
Le problème
je voudrais stocker une partie de la rva (comme db_password
) dans un Ansible vault, mais pas le dossier entier.
comment un fichier ansible crypté dans une chambre forte peut-il être importé dans un fichier d'inventaire non crypté?
Ce que j'ai essayé
j'ai créé un fichier Vars crypté et a essayé de l'importer avec:
include: secrets
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' include
déclaration d'une variable.
6 réponses
si votre problème est d'avoir à la fois des fichiers vars non cryptés et cryptés par group_hosts.
Vous pouvez utiliser cette fonctionnalité possible: 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 voûte.yml comme fichier yaml crypté.
mise à jour : la solution en dessous de est aussi une bonne solution (depuis Ansible 2.3)
depuis Ansible 2.3 vous pouvez chiffrer un Single Crypted Variable. IMO, une visite est nécessaire car les doco semblent plutôt minces.
un exemple: mysql_password: password123
(dans principal.yml)
Exécuter une commande telle que:
ansible-vault encrypt_string password123 --ask-vault-pass
Ceci va produire:
!vault |
$ANSIBLE_VAULT;1.1;AES256
66386439653236336462626566653063336164663966303231363934653561363964363833
3136626431626536303530376336343832656537303632313433360a626438346336353331
Encryption successful
collez ceci dans votre main.yml:
mysql_password: !vault |
$ANSIBLE_VAULT;1.1;AES256
66386439653236336462626566653063336164663966303231363934653561363964363833
3136626431626536303530376336343832656537303632313433360a626438346336353331
exécuter playbook:
c'est à dire, ansible-playbook -i hosts main.yml --ask-vault-pass
Vérifier par l'intermédiaire d'debug:
- debug:
msg: "mysql Pwd: {{ mysql_password }}"
en ce moment avec Ansible 2.3 il est possible d'avoir dans un yaml simple à la fois des variables cryptées et non cryptées. Le format des variables cryptées est comme ceci:
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:
ansible-vault encrypt_string "dummy" --vault-password-file pass-ansible.txt
cette instruction renvoie le texte affiché dans la variable dbPasswd dans la yaml ci-dessus.
pour lancer un playbook qui utilise la variable cryptée, il suffit d'ajouter ce qui suit: var:
ansible-playbook playbooks/myplaybook --vault-password-file pass-ansible.txt
Ou vous pouvez faire de même avec --demandez-chapelle-pass, qui vous demandera le mot de passe lors de l'exécution de la playbook:
ansible-playbook playbooks/myplaybook --ask-vault-pass
Vous pouvez faire quelque chose de semblable.
- Créer un fichier de mot de passe (un fichier texte avec votre mot de passe sur une seule ligne)
Créer un
ansible.cfg
dans votre dossier de projet accessible[defaults] vault_password_file = <path/to/your/password/file>
Créer un playbook de fichier (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"
crypter le fichier de variables (à partir de l'adresse emplacement du projet avec l'
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 un résultat similaire à:
$ 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 group_vars
fichier selon la suggestion de Sebastian Stigler ou si vous voulez utiliser un fichier d'inventaire, vous pouvez juste ajouter un autre fichier "ini-like" 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
alors, utilisez -i my_inventory/
dans votre ligne de commande, ou créez unansible.cfg
contient:
[defaults]
hostfile = ./my_inventory/
et vous devriez être en jeu. Ansible à fusionner les deux fichiers au moment de l'exécution.
Utiliser ansible-vault encrypt my_inventory/inventory_crypted_vars
avant de commettre et vous êtes définir.
vous voulez probablement un crochet de pré-propagation pour vous assurer que vous ne commettez pas la version non cryptée du fichier. Par exemple,un pre-commit hook comme ceci devrait faire l'affaire (ajuster FILES_PATTERN
par conséquent).
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 playbook nommé group_vars
.
Il vous créez un fichier nommé west_coast
et de mettre les entrées suivantes:
---
db_server: foo.example.com
db_host: 5432
db_password: top secret password
ce fichier peut alors être converti en une voûte possible.