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.

43
demandé sur Adam Matan 2015-05-13 11:04:06

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)

36
répondu Antoine 2017-08-16 12:27:15

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 }}"
45
répondu wired00 2018-09-19 06:47:58

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
9
répondu V. Morate 2017-06-08 08:04:54

Vous pouvez faire quelque chose de semblable.

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

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

    my_secure_variable: "X_my_secret_X"
    
  5. crypter le fichier de variables (à partir de l'adresse emplacement du projet avec l' 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 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
5
répondu grandma 2017-06-05 13:15:07

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

2
répondu leucos 2017-06-02 00:59:16

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.

0
répondu Sebastian Stigler 2015-05-13 08:34:49