Spécifier le mot de passe sudo pour Ansible
Comment puis-je spécifier un mot de passe sudo pour Ansible non-interactif?
Je suis en cours d'exécution Ansible playbook comme ceci:
$ ansible-playbook playbook.yml -i inventory.ini \
--user=username --ask-sudo-pass
Mais je veux l'exécuter comme ceci:
$ ansible-playbook playbook.yml -i inventory.ini \
--user=username` **--sudo-pass=12345**
Est-il un moyen? Je veux automatiser mon projet de déploiement autant que possible.
- Voir aussi: serverfault.com/questions/560106/...
Vous devez vous connecter pour publier un commentaire.
Vous pouvez passer de la variable sur la ligne de commande via
--extra-vars "name=value"
. Sudo variable mot de passe estansible_sudo_pass
. Si votre commande devrait ressembler à:Mise à jour en 2017: Ansible 2.2.1.0 utilise maintenant var
ansible_become_pass
. Soit semble fonctionner.history -c
après l'exécution de la yml..bash_history
./proc
avechidepid=2
unix.stackexchange.com/a/244357/194848Les docs fortement recommandons contre l'établissement de l'sudo mot de passe en clair, et au lieu d'utiliser
--ask-sudo-pass
sur la ligne de commande lors de l'exécution deansible-playbook
2016 mise à Jour:
Ansible 2.0 (pas de 100%) a marqué
--ask-sudo-pass
comme obsolète. Les docs maintenant vous recommandons d'utiliser--ask-become-pass
au lieu de cela, tout en changeant l'utilisation desudo
tout au long de votre tablettes playbook avecbecome
.Probablement la meilleure façon de le faire - en supposant que vous ne pouvez pas utiliser la NOPASSWD solution fournie par scottod est d'utiliser Mircea Vutcovici de la solution en combinaison avec Ansible voûte.
Par exemple, vous pourriez avoir un playbook quelque chose comme ceci:
Nous sommes ici, y compris un fichier appelé
secret
qui contiendra notre sudo mot de passe.Nous allons utiliser ansible-coffre-fort pour créer une version chiffrée de ce fichier:
Cela va vous demander un mot de passe, puis ouvrez votre éditeur par défaut pour modifier le fichier. Vous pouvez mettre votre
ansible_sudo_pass
ici.par exemple:
secret
:Enregistrer et quitter, vous avez maintenant une chiffré
secret
fichier qui Ansible est capable de déchiffrer lorsque vous exécutez votre playbook. Remarque: vous pouvez modifier le fichier avecansible-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 est de fournir de l'Ansible avec un
--vault-password-file
qui sera utilisé pour décrypter votresecret
fichier.Créer un fichier appelé
vault.txt
et que mettre le mot de passe que vous avez utilisé lors de la création de votresecret
fichier. Le mot de passe doit être une chaîne de caractères stockée sur une seule ligne dans le fichier.De l'Ansible Docs:
Enfin: vous pouvez maintenant exécuter votre playbook avec quelque chose comme
Le dessus est en supposant que le répertoire suivant la mise en page:
Vous pouvez en savoir plus sur Ansible Voûte ici: https://docs.ansible.com/playbooks_vault.html
ansible-vault create group_vars/all/ansible.yml
et ajouteransible_sudo_pass: yourpassword
là. Pas besoin de changer de tablettes playbook ou de l'inventairefatal: [localhost]: FAILED! => {"changed": false, "failed": true, "module_stderr": "sudo: a password is required\n", "module_stdout": "", "msg": "MODULE FAILURE", "parsed": false}
--ask-vault-pass
au lieuRegardant le code (
runner/__init__.py
), je pense que vous pouvez mettre dans votre fichier d'inventaire :Il semble y avoir une certaine disposition dans
ansible.cfg
fichier de config, mais n'est pas encore implémenté (constants.py
).host_vars
ougroup_vars
répertoire puis crypter le fichier à l'aide de ansible-chapelleJe ne pense pas que ansible vous permet de spécifier un mot de passe dans les drapeaux comme vous le souhaitez.
Il y a peut-être quelque part dans les configs cela peut être réglé, mais cela ferait l'aide d'ansible moins en sécurité globale et ne serait pas être recommandé.
Une chose que vous pouvez faire est de créer un utilisateur sur la machine cible et de leur accorder des privilèges sudo sans mot de passe, soit toutes les commandes ou une liste restreinte de commandes.
Si vous exécutez
sudo visudo
et entrez une ligne comme ci-dessous, l'utilisateur 'privilegedUser' ne devraient pas avoir à entrer un mot de passe lors de l'exécution de quelque chose commesudo service xxxx start
:La sudo mot de passe est stocké dans une variable appelée
ansible_sudo_pass
.Vous pouvez définir cette variable dans une quelques façons:
Par hôte, dans votre inventaire fichier hosts (
inventory/<inventoryname>/hosts
)Par groupe, dans votre inventaire groupes de fichier (
inventory/<inventoryname>/groups
)Par groupe, dans le groupe de vars (
group_vars/<groupname>/ansible.yml
)Par groupe, chiffré (
ansible-vault create group_vars/<groupname>/ansible.yml
)Vous pouvez définir le mot de passe pour un groupe ou pour tous les serveurs à la fois:
Je déchirait mes cheveux plus de ce, maintenant j'ai trouvé une solution qui fait ce que je veux:
1 fichier chiffré par l'hôte contenant le mot de passe sudo
/etc/ansible/hosts:
puis vous créez pour chaque hôte chiffré var-fichier comme ceci:
avec le contenu
comment vous organiser le coffre-fort de mot de passe (entrée via-demandez-chapelle-pass) ou par cfg est à vous
basé sur ce je soupçonne que vous pouvez simplement chiffrer l'ensemble du fichier hosts...
ansible-playback
. J'ai eu à utiliser-e @vault/filename.ext
à utiliser le coffre-fort avec monansible-playbook
appel.Un plus avisés façon de le faire est de stocker vos
sudo
mot de passe dans un coffre-fort sécurisé comme LastPass ou KeePass et puis la passer àansible-playbook
à l'aide de la-e@
mais au lieu de coder en dur le contenu dans un fichier existant, vous pouvez utiliser la construction-e@<(...)
pour exécuter une commande dans un sous-shell, et de rediriger sa sortie (STDOUT) à un anonyme du descripteur de fichier, effectivement nourrir le mot de passe pour le-e@<(..)
.Exemple
Le dessus est en train de faire plusieurs choses, nous allons le décomposer.
ansible-playbook -i /tmp/hosts pb.yml
- de toute évidence, l'exécution d'un playbook par ansible-playbook$(lpass show folder1/item1 --password)"
- exécute le LastPass CLIlpass
et récupère le mot de passe à utiliserecho "ansible_sudo_pass: ...password..."
- prend la chaîne "ansible_sudo_pass:" et il se combine avec le mot de passe fourni parlpass
-e@<(..)
- met ci-dessus ensemble, et relie le shell interne est exécuté de<(...)
comme un descripteur de fichier pouransible-playbook
à consommer.D'autres améliorations
Si vous préférez ne pas le type que chaque fois que vous pouvez tout simplement les choses comme si. D'abord créer un alias dans votre
.bashrc
comme suit:Vous pouvez maintenant exécuter votre playbook comme ceci:
Références
--extra-vars @<(echo ansible_become_pass: $(op get item <item name> | jq --raw-output '.details.sections[0].fields[] | select(.t=="password").v'))
/dev/fd/63
et donc, par le mot de passe dans un fichier temp descripteur, ce n'est pas divulguée.Si vous êtes à l'aise avec le maintien de mots de passe dans des fichiers de texte brut, une autre option est d'utiliser un fichier JSON avec l' --extra-vars paramètre (assurez-vous d'exclure le fichier de contrôle de code source):
Ansible, a souscrit à cette option depuis la 1.3.
vous pouvez écrire sudo mot de passe pour votre playbook dans le fichier hosts comme ceci:
Ansible vault a été suggéré une couple de fois ici, mais je préfère git-crypt pour le cryptage des fichiers sensibles dans mes tablettes playbook. Si vous utilisez git pour garder votre ansible tablettes playbook, c'est un clin d'œil. Le problème que j'ai trouvé avec ansible coffre-fort est que je finissent inévitablement à venir à travers les chiffrée des copies du fichier que je veux travailler avec et pour aller décrypter avant que je puisse travailler.
git-crypt
offre un meilleur flux de travail de l'OMI.En utilisant cela, vous pouvez mettre vos mots de passe dans un var dans votre playbook, et la marque de votre playbook comme un fichier crypté en
.gitattributes
comme ceci:Votre playbook seront cryptées de manière transparente sur Github. Ensuite, vous avez juste besoin d'installer votre clé de cryptage sur la machine que vous utilisez pour exécuter ansible, ou suivre les instructions sur la documentation à mettre en place avec
gpg
.Il y a une bonne Q&A sur le transfert des
gpg
des touches de votressh-agent
transmet les clés SSH ici: https://superuser.com/questions/161973/how-can-i-forward-a-gpg-key-via-ssh-agent.Vous pouvez utiliser
sshpass
utilitaire comme ci-dessous,Vous pouvez utiliser ansible vault qui sera le code de votre mot de passe cryptés la voûte. Après cela, vous pouvez utiliser la variable de voûte dans les tablettes playbook.
Un peu de documentation sur ansible coffre-fort:
http://docs.ansible.com/playbooks_vault.html
Nous l'utilisons de voûte pour l'environnement. Pour modifier voûte de commande:
ansible-vault edit inventories/production/group_vars/all/vault
Si vous voulez l'appeler voûte de la variable que vous avez à utiliser ansible-playbook avec des paramètres tels que:
ansible-playbook -s --vault-password-file=~/.ansible_vault.password
Oui, nous sommes le stockage de voûte de mot de passe dans le répertoire local en texte brut, mais ce n'est pas plus dangereux comme store root mot de passe pour chaque système. Mot de passe de Root est à l'intérieur de la voûte fichier ou vous pouvez l'avoir comme sudoers pour votre utilisateur/groupe.
Je le recommande d'utiliser sudoers fichier sur le serveur. Voici l'exemple pour le groupe admin:
%admin ALL=(ALL) NOPASSWD:ALL
Il suffit d'appeler votre playbook avec
--extra-vars "become_pass=Password"
become_pass=('ansible_become_password', 'ansible_become_pass')
À l'aide de ansible 2.4.1.0 et le suivant doit travailler:
Et il suffit d'exécuter la playbook avec cet inventaire que:
Mon hack pour automatiser cela a été d'utiliser une variable d'environnement et d'y accéder via
--extra-vars="ansible_become_pass='{{ lookup('env', 'ANSIBLE_BECOME_PASS') }}'"
.De l'exportation d'un env var, mais éviter bash/shell histoire (faire précéder par un espace, ou d'autres méthodes). E. g.:
La recherche de l'env var en passant par les extra
ansible_become_pass
variable dans leansible-playbook
, E. g.:Bonne alternative réponses:
ansible_become_pass
. Ce est décent. Toutefois, pour les paranoïaques équipes qui ont besoin de partager ansible voûte des mots de passe, et de les exécuter ansible joue avec induvidual des comptes, ils coudld utilisation partagée de la voûte mot de passe à l'inverse les uns des autres système d'exploitation mot de passe (le vol d'identité). Sans doute, vous devez faire confiance à votre propre équipe?@
préfixe pour lire l'ansible de la variable dans le fichier desriptor. Évite bash histoire au moins. Pas sûr, mais j'espère que shell interne est exécuté écho de ne pas se faire attraper et exposés dans l'enregistrement d'audit (par exemple, auditd).on Peut également Utiliser d'ATTENDRE BLOC dans ansible pour frayer bash et de le personnaliser selon vos besoins
Très simple, et d'en ajouter dans le fichier de variable:
Exemple:
Et ajouter ceux-ci:
Juste un additif, de sorte que personne d'autre ne passe par l'ennui que j'ai fait récemment:
Autant que je sache, la meilleure solution est un le long de la ligne générale de toast38coza ci dessus. Si elle fait sens pour attacher vos fichiers de mot de passe et de votre playbook ensemble de manière statique, puis de suivre son modèle avec
vars_files
(ouinclude_vars
). Si vous voulez les garder séparés, vous pouvez fournir le coffre-fort contenu sur la ligne de commande comme ceci:C'est évident, rétrospectivement, mais voici les astuces:
Sanglant @ signe. Si vous le laissez sortir, l'analyse sera échoue silencieusement, et ansible-playbook va agir comme si vous n'avais jamais spécifié le fichier en premier lieu.
Vous devez explicitement importer le contenu de la voûte, soit avec une ligne de commande --extra-vars/-e ou au sein de votre YAML code. Le
--ask-vault-pass
drapeau ne fait rien par lui-même (d'ailleurs vous invite pour une valeur qui peut ou ne peut pas être utilisé plus tard).Peut vous d'inclure votre "@"s et enregistrer une heure.
Après cinq ans, je vois que c'est encore un thème très actuel. Un peu de mise en miroir de leucos réponse que je trouve le mieux dans mon cas, à l'aide ansible outils uniquement (sans authentification centralisée, des jetons ou quoi que ce soit). Cela suppose que vous avez le même nom et la même clé publique sur tous les serveurs. Si vous n'avez pas, bien sûr, vous aurez besoin pour être plus précis et ajouter les variables correspondantes à côté des hôtes:
Ajouter:
Alors:
Au moins de cette façon vous n'avez pas à écrire de plus les variables qui pointent vers les mots de passe.
Solution ci-dessus par @toast38coza travaillé pour moi, juste que sudo: oui est obsolète dans Ansible maintenant.
Utilisation devenir et become_user à la place.
Cela a fonctionné pour moi...
Créé le fichier /etc/sudoers.d/90-init-les utilisateurs de fichiers avec NOPASSWD
où "utilisateur" est votre nom d'utilisateur.