Comment puis-je spécifier un mot de passe Sudo pour Ansible de manière non interactive?
J'exécute Ansible playbook comme ceci:
ansible-playbook playbook.yml -i inventory.ini --user=username --ask-Sudo-pass
Mais je veux le lancer comme ça:
ansible-playbook playbook.yml -i inventory.ini --user=username
--Sudo-pass = 12345
Y a-t-il un moyen? Je souhaite automatiser autant que possible le déploiement de mon projet.
Vous pouvez passer variable sur la ligne de commande via --extra-vars "name=value"
. La variable de mot de passe Sudo est ansible_Sudo_pass
. Donc, votre commande ressemblerait à ceci:
ansible-playbook playbook.yml -i inventory.ini --user=username \
--extra-vars "ansible_Sudo_pass=yourPassword"
Mise à jour 2017 : Ansible 2.2.1.0 utilise maintenant var ansible_become_pass
. Soit semble fonctionner.
La documentationfortement recommande de ne pas définir le mot de passe Sudo en texte brut, mais d'utiliser plutôt --ask-Sudo-pass
sur la ligne de commande lors de l'exécution de ansible-playbook
.
Mise à jour 2016:
Ansible 2.0 (pas 100% lorsque) a marqué --ask-Sudo-pass
comme obsolète. Les docs recommandent maintenant d'utiliser --ask-become-pass
à la place, tout en remplaçant l'utilisation de Sudo
dans vos playbooks par become
.
La meilleure façon de procéder est probablement d’utiliser la solution de Mircea Vutcovici en combinaison avec Ansible vault .
Par exemple, vous pourriez avoir un livre de lecture qui ressemble à ceci:
- hosts: all
vars_files:
- secret
tasks:
- name: Do something as Sudo
service: name=nginx state=restarted
Sudo: yes
Nous incluons ici un fichier appelé secret
qui contiendra notre mot de passe Sudo.
Nous allons utiliser ansible-vault pour créer une version chiffrée de ce fichier:
ansible-vault create secret
Cela vous demandera un mot de passe, puis ouvrez votre éditeur par défaut pour éditer le fichier. Vous pouvez mettre votre ansible_Sudo_pass
ici.
exemple: secret
:
ansible_Sudo_pass: mysudopassword
Sauvegarder et quitter, vous avez maintenant un fichier secret
chiffré que Ansible est capable de déchiffrer lorsque vous exécutez votre livre de lecture. Remarque: vous pouvez éditer le fichier avec ansible-vault edit secret
(et entrez le mot de passe que vous avez utilisé lors de la création du fichier).
La dernière pièce du puzzle consiste à fournir à Ansible un --vault-password-file
qu’il utilisera pour déchiffrer votre fichier secret
.
Créez un fichier appelé vault.txt
et insérez le mot de passe que vous avez utilisé lors de la création de votre fichier secret
. Le mot de passe doit être une chaîne stockée sur une seule ligne du fichier.
De la Ansible Docs:
.. assurez-vous que les autorisations sur le fichier sont telles que personne d'autre ne peut accéder à votre clé et n'ajoutez pas votre clé au contrôle de source
Enfin: vous pouvez maintenant exécuter votre playbook avec quelque chose comme
ansible-playbook playbook.yml -u someuser -i hosts --Sudo --vault-password-file=vault.txt
Ce qui précède suppose la structure de répertoire suivante:
.
|_ playbook.yml
|_ secret
|_ hosts
|_ vault.txt
Vous pouvez en savoir plus sur Ansible Vault ici: https://docs.ansible.com/playbooks_vault.html
En regardant le code ( runner/__init__.py
), je pense que vous pouvez probablement le définir dans votre fichier d'inventaire:
[whatever]
some-Host ansible_Sudo_pass='foobar'
Il semble y avoir une disposition dans le fichier de configuration ansible.cfg
également, mais elle n’a pas encore été mise en œuvre ( constants.py
).
Je ne pense pas que ansible vous laissera spécifier un mot de passe dans les drapeaux comme vous le souhaitez. Il peut y avoir quelque part dans les configs que cela peut être défini, mais cela rendrait l’utilisation de ansible moins sécurisé et ne serait pas recommandé.
Vous pouvez, par exemple, créer un utilisateur sur la machine cible et lui accorder des privilèges Sudo sans mot de passe pour toutes les commandes ou pour une liste restreinte de commandes.
Si vous exécutez Sudo visudo
et entrez une ligne similaire à celle ci-dessous, l'utilisateur 'privilegedUser' ne devrait pas avoir à entrer de mot de passe pour exécuter quelque chose comme Sudo service xxxx start
:
%privilegedUser ALL= NOPASSWD: /usr/bin/service
Le mot de passe Sudo est stocké sous forme de variable appelée ansible_Sudo_pass
. Vous pouvez définir cette variable de plusieurs manières:
Par hôte, dans votre fichier d'hôtes d'inventaire (inventory/<inventoryname>/hosts
)
[server]
10.0.0.0 ansible_Sudo_pass=foobar
Par groupe, dans votre fichier de groupes d'inventaire (inventory/<inventoryname>/groups
)
[server:vars]
ansible_Sudo_pass=foobar
Par groupe, dans groupe vars (group_vars/<groupname>/ansible.yml
)
ansible_Sudo_pass: "foobar"
Par groupe, crypté (ansible-vault create group_vars/<groupname>/ansible.yml
)
ansible_Sudo_pass: "foobar"
Vous pouvez définir le mot de passe pour un groupe ou pour tous les serveurs à la fois:
[all:vars]
ansible_Sudo_pass=default_Sudo_password_for_all_hosts
[group1:vars]
ansible_Sudo_pass=default_Sudo_password_for_group1
J'étais en train de m'arracher les cheveux, maintenant j'ai trouvé une solution qui fait ce que je veux:
1 fichier crypté par hôte contenant le mot de passe Sudo
/ etc/ansible/hosts:
[all:vars]
ansible_ssh_connection=ssh ansible_ssh_user=myuser ansible_ssh_private_key_file=~/.ssh/id_rsa
[some_service_group]
node-0
node-1
ensuite, vous créez pour chaque hôte un fichier var crypté comme ceci:
ansible-vault create /etc/ansible/Host_vars/node-0
avec contenu
ansible_Sudo_pass: "my_Sudo_pass_for_Host_node-0"
comment vous organisez le mot de passe du coffre-fort (entrez via --ask-vault-pass) ou par cfg, c'est vous qui décidez
sur cette base, je soupçonne que vous pouvez simplement chiffrer tout le fichier hosts ...
Une façon plus avisée de le faire est de stocker votre mot de passe Sudo
dans un emplacement sécurisé tel que LastPass ou KeePass puis de le transmettre à ansible-playbook
en utilisant le -e@
mais au lieu de coder en dur le contenu d'un fichier, vous pouvez utiliser la construction -e@<(...)
pour exécuter une commande dans un sous-shell et rediriger sa sortie (STDOUT) vers un descripteur de fichier anonyme, en fournissant efficacement le mot de passe à -e@<(..)
.
$ ansible-playbook -i /tmp/hosts pb.yml \
-e@<(echo "ansible_Sudo_pass: $(lpass show folder1/item1 --password)")
Ce qui précède fait plusieurs choses, décomposons-le.
ansible-playbook -i /tmp/hosts pb.yml
- exécuter un playbook évidemment avec ansible-playbook$(lpass show folder1/item1 --password)"
- exécute LastPass CLI lpass
et récupère le mot de passe à utiliserecho "ansible_Sudo_pass: ...password..."
- prend la chaîne 'ansible_Sudo_pass:' et la combine avec le mot de passe fourni par lpass
-e@<(..)
- rassemble les éléments ci-dessus et connecte le sous-shell de <(...)
en tant que descripteur de fichier que ansible-playbook
doit consommer.Si vous préférez ne pas taper cela à chaque fois, vous pouvez simplement utiliser des choses comme ça. Commencez par créer un alias dans votre .bashrc
comme suit:
$ cat ~/.bashrc
alias asp='echo "ansible_Sudo_pass: $(lpass show folder1/item1 --password)"'
Maintenant, vous pouvez lancer votre playbook comme ceci:
$ ansible-playbook -i /tmp/hosts pb.yml -e@<(asp)
Si vous souhaitez conserver les mots de passe dans des fichiers de texte brut, vous pouvez également utiliser un fichier JSON avec le paramètre --extra-vars (veillez à exclure le fichier du contrôle de code source):
ansible-playbook --extra-vars "@private_vars.json" playbook.yml
Ansible prend en charge cette option depuis la version 1.3 .
Un coffre Ansible a été suggéré à quelques reprises ici, mais je préfère git-crypt pour chiffrer des fichiers sensibles dans mes playbooks. Si vous utilisez git pour garder vos playbooks ansible, c'est très simple. Le problème que j'ai trouvé avec ansible vault est que je finis inévitablement par trouver des copies chiffrées du fichier avec lequel je veux travailler et que je dois le déchiffrer avant de pouvoir travailler. git-crypt
offre un meilleur flux de travail IMO.
En utilisant ceci, vous pouvez mettre vos mots de passe dans une variable de votre playbook, et marquer votre playbook en tant que fichier chiffré dans .gitattributes
comme ceci:
my_playbook.yml filter=git-crypt diff=git-crypt
Votre Playbook sera crypté de manière transparente sur Github. Ensuite, il vous suffit d’installer votre clé de chiffrement sur l’hôte que vous utilisez pour exécuter ansible ou de suivre les instructions de la documentation pour le configurer avec gpg
.
Il existe de bonnes questions-réponses sur le transfert de clés gpg
telles que votre ssh-agent
transfère les clés SSH ici: https://superuser.com/questions/161973/how-can-i-forward-a-gpg-key-via-ssh-agent .
vous pouvez écrire le mot de passe Sudo pour votre playbook dans le fichier hosts de la manière suivante:
[Host-group-name]
Host-name:port ansible_Sudo_pass='*your-Sudo-password*'
Vous pouvez utiliser l'utilitaire sshpass
comme ci-dessous,
$ sshpass -p "your pass" ansible pattern -m module -a args \
-i inventory --ask-Sudo-pass
Appelez votre Playbook avec --extra-vars "become_pass=Password"
devenir_pass = ('ansible_become_password', 'ansible_become_pass')
Utiliser ansible 2.4.1.0 et ce qui suit doit fonctionner:
[all]
17.26.131.10
17.26.131.11
17.26.131.12
17.26.131.13
17.26.131.14
[all:vars]
ansible_connection=ssh
ansible_user=per
ansible_ssh_pass=per
ansible_Sudo_pass=per
Et lancez simplement le playbook avec cet inventaire en tant que:
ansible-playbook -i inventory copyTest.yml
Mon hack pour automatiser cela consistait à utiliser une variable d'environnement et à y accéder via --extra-vars="ansible_become_pass='{{ lookup('env', 'ANSIBLE_BECOME_PASS') }}'"
.
Exportez une variable env, mais évitez l’historique bash/Shell (ajoutez un espace, ou d’autres méthodes). Par exemple.:
export ANSIBLE_BECOME_PASS='<your password>'
Cherchez la variable env en passant la variable extra ansible_become_pass
dans la ansible-playbook
, par exemple:
ansible-playbook playbook.yml -i inventories/dev/hosts.yml -u user --extra-vars="ansible_become_pass='{{ lookup('env', 'ANSIBLE_BECOME_PASS') }}'"
Bonnes réponses alternatives:
ansible_become_pass
. C'est décent. Cependant, pour les équipes paranoïaques qui doivent partager des mots de passe de coffre-fort, et exécuter des jeux avec des comptes individuels, elles peuvent utiliser le mot de passe de coffre-fort partagé pour inverser le mot de passe du système d'exploitation (identiy theft). On peut soutenir que vous avez besoin de faire confiance à votre propre équipe?@
pour lire la variable ansible à partir du descripteur de fichier . Evite au moins l'histoire bash. Pas sûr, mais j'espère que l'écho de sous-shell ne sera pas attiré et exposé dans la journalisation d'audit (par exemple, auditd).Juste un addenda, afin que personne d'autre ne subisse l'ennui que j'ai eu récemment:
Autant que je sache, la meilleure solution est celle qui suit les lignes générales de toast38coza ci-dessus. S'il est logique de lier statiquement vos fichiers de mots de passe et votre livre de lecture, suivez son modèle avec vars_files
(ou include_vars
). Si vous voulez les garder séparés, vous pouvez fournir le contenu du coffre-fort sur la ligne de commande comme suit:
ansible-playbook --ask-vault-pass -e@<PATH_TO_VAULT_FILE> <PLAYBOOK_FILE>
Cela est évident rétrospectivement, mais voici les pièges:
Ce sanglant signe @. Si vous le laissez pas, l'analyse échouera silencieusement, et ansible-playbook se déroulera comme si vous n'aviez jamais spécifié le fichier.
Vous devez importer explicitement le contenu du coffre-fort, avec une ligne de commande --extra-vars/-e ou dans votre code YAML. L'indicateur --ask-vault-pass
ne fait rien par lui-même (à part vous invite à saisir une valeur qui peut ou non être utilisée ultérieurement).
Puissiez-vous inclure vos "@" et économiser une heure.
nous pouvons également utiliser EXPECT BLOCK en une fois pour générer et le personnaliser selon vos besoins
- name: Run expect to INSTALL TA
Shell: |
set timeout 100
spawn /bin/sh -i
expect -re "$ "
send "Sudo yum remove -y xyz\n"
expect "$ "
send "Sudo yum localinstall -y {{ rpm_remotehost_path_for_xyz }}\n"
expect "~]$ "
send "\n"
exit 0
args:
executable: /usr/bin/expect
La solution ci-dessus de @ toast38coza a fonctionné pour moi; juste que Sudo: oui est obsolète dans Ansible maintenant. Utilisez pour devenir et pour devenir utilisateur .
tasks:
- name: Restart Apache service
service: name=Apache2 state=restarted
become: yes
become_user: root
Très simple, et n’ajoutez que dans le fichier variable:
Exemple:
$ vim group_vars/all
Et ajoutez ceci:
Ansible_connection: ssh
Ansible_ssh_user: rafael
Ansible_ssh_pass: password123
Ansible_become_pass: password123
Après cinq ans, je constate que le sujet est toujours d'actualité. Un peu en miroir de la réponse de leucos que je trouve la meilleure dans mon cas, en utilisant uniquement des outils compatibles (sans authentification centralisée, jetons ou autre). Cela suppose que vous ayez le même nom d'utilisateur et la même clé publique sur tous les serveurs. Si vous ne le faites pas, vous devrez bien sûr être plus spécifique et ajouter les variables correspondantes à côté des hôtes:
[all:vars]
ansible_ssh_user=ansible
ansible_ssh_private_key_file=home/user/.ssh/mykey
[group]
192.168.0.50 ansible_Sudo_pass='{{ myserver_Sudo }}'
ansible-vault create mypasswd.yml
ansible-vault edit mypasswd.yml
Ajouter:
myserver_Sudo: mysecretpassword
Ensuite:
ansible-playbook -i inv.ini my_role.yml --ask-vault --extra-vars '@passwd.yml'
De cette façon, vous n’avez pas à écrire plus de variables pointant vers les mots de passe.