web-dev-qa-db-fra.com

Ansible: Comment chiffrer certaines variables d'un fichier d'inventaire dans un fichier de stockage séparé?

Les paramètres

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

Le problème

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é?

Ce que j'ai essayé

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.

47
Adam Matan

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)

39
Antoine

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 }}"
53
wired00

À 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
10
V. Morate

Vous pouvez faire quelque chose de semblable à ceci.

  1. Créer un fichier de mot de passe (un fichier texte avec votre mot de passe sur une seule ligne)
  2. Créez un ansible.cfg dans votre dossier de projet ansible

    [defaults]
    vault_password_file = <path/to/your/password/file>
    
  3. 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 }}'"`
    
  4. Créer un fichier de variable (par exemple vars.yml)

    my_secure_variable: "X_my_secret_X"
    
  5. Chiffrer le fichier de variable (à partir de l'emplacement du projet ansible avec le ansible.cfg)

    ansible-vault encrypt vars.yml
    
  6. 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
6
grandma

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).

3
leucos

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.

0