web-dev-qa-db-fra.com

Comment stocker ansible_become_pass dans un coffre et comment l'utiliser?

Je suis un débutant à ansible et j'utilise un livre de jeu très simple pour émettre Sudo apt-get update et Sudo apt-get upgrade sur quelques serveurs.

C'est le playbook que j'utilise:

---

- name: Update Servers
  hosts: my-servers
  become: yes
  become_user: root
  tasks:
    - name: update packages
      apt: update_cache=yes

    - name: upgrade packages
      apt: upgrade=dist

et ceci est un extrait de mon fichier ~/.ansible/inventory/hosts:

[my-servers]
san-francisco ansible_Host=san-francisco ansible_ssh_user=user ansible_become_pass=<my_Sudo_password_for_user_on_san-francisco>
san-diego     ansible_Host=san-diego     ansible_ssh_user=user ansible_become_pass=<my_Sudo_password_for_user_on_san-diego>

C'est ce que je reçois si je lance le playbook:

$ ansible-playbook update-servers-playbook.yml                                                                                                                                     

PLAY [Update Servers] **********************************************************

TASK [setup] *******************************************************************
ok: [san-francisco]
ok: [san-diego]

TASK [update packages] *********************************************************
ok: [san-francisco]
ok: [san-diego]

TASK [upgrade packages] ********************************************************
ok: [san-francisco]
ok: [san-diego]

PLAY RECAP *********************************************************************
san-francisco              : ok=3    changed=0    unreachable=0    failed=0   
san-diego                  : ok=3    changed=0    unreachable=0    failed=0

Ce qui me dérange, c’est que j’ai le mot de passe de mon utilisateur user stocké en texte brut dans mon fichier ~/.ansible/inventory/hosts.

J'ai lu sur vaults , mais aussi sur les meilleures pratiques pour les variables et les vaults mais je ne comprends pas comment appliquer cela à mon cas d'utilisation très minimal.

J'ai aussi essayé d'utiliser lookups . En général, ils travaillent également dans le fichier d’inventaire et je peux faire quelque chose comme ceci:

[my-servers]
san-francisco ansible_Host=san-francisco ansible_ssh_user=user ansible_become_pass="{{ lookup('env', 'ANSIBLE_BECOME_PASSWORD_SAN_FRANCISCO') }}"

dans ce cas, le mot de passe serait stocké dans une variable d'environnement appelée ANSIBLE_BECOME_PASSWORD_SAN_FRANCISCO; autant que je sache, il n'y a aucun moyen de rechercher des variables dans les coffres.

Alors, comment pourrais-je organiser mon fichier de manière à pouvoir rechercher mes mots de passe quelque part et les stocker en toute sécurité?

13
CristianCantoro

Vous devez créer des fichiers de variables sauvegardés, puis les inclure dans vos playbooks ou sur la ligne de commande.

Si vous changez votre fichier d'inventaire pour utiliser une variable pour le devenir, cette variable peut être sauvegardée:

[my-servers]
san-francisco ansible_Host=san-francisco ansible_ssh_user=user ansible_become_pass='{{ sanfrancisco_become_pass }}'
san-diego     ansible_Host=san-diego     ansible_ssh_user=user ansible_become_pass='{{ sandiego_become_pass }}'

Utilisez ensuite ansible-vault create vaulted_vars.yml pour créer un fichier dans le coffre-fort avec le contenu suivant:

sanfrancisco_become_pass: <my_Sudo_password_for_user_on_san-francisco>
sandiego_become_pass    : <my_Sudo_password_for_user_on_san-diego>

Ensuite, incluez le fichier vaulté en tant que vars supplémentaires comme ceci:

ansible-playbook -i ~/.ansible/inventory/hosts playbook.yml --ask-vault-pass -e@~/.ansible/inventory/vault_vars

Ou bien incluez le fichier vars dans votre playbook avec une tâche include_vars :

- name        : include vaulted variables
  include_vars: ~/.ansible/inventory/vault_vars
13
ydaetskcoR

Après avoir configuré un inventaire avec vos propres paramètres pertinents. Ces paramètres supposent que vous avez déjà configuré une paire de clés RSA pour accéder à votre serveur. Vous devriez être capable de ssh sur votre serveur avec ssh [email protected] 

[local]
localhost    ansible_connection=local

[remote]
155.42.88.199   ansible_connection=ssh    ansible_user=remoteuser ansible_become_user=root ansible_become=yes  ansible_ssh_private_key_file=<private_key_file_path>

Vous devez stocker votre mot de passe root dans un fichier (j'ai appelé le mien 'my_vault.yml'). Vous pouvez le faire avec la commande suivante:

~/.ansible$ ansible-vault create my_vault.yml

Enregistrez simplement le mot de passe de votre serveur distant comme suit (n'incluez pas les balises '<>')

su_password: <myreallyspecialpassword> 

Le mot de passe va maintenant être crypté par le coffre-fort et la seule façon de le voir est d'entrer la commande suivante.

~/.ansible$ ansible-vault edit my_vault.yml

Nous devons maintenant inclure notre fichier 'my_vault.yml' dans notre playbook. Nous pouvons le faire en utilisant vars-files pour obtenir la valeur de su-password. Nous pouvons maintenant créer une var intitulée ansible_become_pass à laquelle sera transmise la valeur de notre fichier my_vault.yml qui permettra à notre utilisateur distant de s'exécuter une fois sur le serveur.

---
- name: My Awesome Playbook
  hosts: remote
  become: yes

  vars_files:
    - ~/.ansible/my_vault.yml 

  vars:
    ansible_become_pass: '{{ su_password }}'

  roles:
      - some_awesome_role

Comme nous utilisons le coffre-fort chaque fois que nous voulons exécuter ce livre de jeu, nous devons utiliser la commande suivante.

ansible-playbook myawesome_playbook.yml --ask-vault-pass
1
andy_roddam

Le meilleur moyen de résoudre ce problème est d'utiliser Host_vars. La configuration la plus simple consiste simplement à placer le ansible_become_pass dans les fichiers chiffrés de Vault dans les répertoires Host_vars correspondants, comme suit:

myplaybook.yml
Host_vars/onehost.com/crypted
Host_vars/otherhost.com/crypted

Dans les fichiers crypted, placez l'affectation de la variable ansible_become_pass:

ansible_become_pass: SuperSecre3t

Créez le fichier avec ansible-vault create, éditez-le avec ansible-vault edit

En suivant les conseils de la documentation Ansible , vous devez créer un fichier supplémentaire par hôte attribuant le ansible_become_passwd à partir de la variable cryptée portant un nom différent. De cette façon, il est possible de rechercher le ansible_become_passwd dans les fichiers du projet. 

myplaybook.yml
Host_vars/onehost.com/plain
Host_vars/onehost.com/crypted
Host_vars/otherhost.com/plain
Host_vars/otherhost.com/crypted

où un fichier plain contient quelque chose comme ceci:

ansible_become_pass: "{{ vaulted_become_pass }}"

et le fichier crypted définit le vaulted_become_pass comme indiqué ci-dessus. 

Tous les fichiers crypted doivent être chiffrés avec la même clé et ansible-playbook doit être appelé avec --ask-vault-pass

0
ofrommel