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