Comment spécifier un mot de passe sudo pour Ansible de manière non interactive?
J'utilise le playbook Ansible comme ceci:
$ ansible-playbook playbook.yml -i inventory.ini \
--user=username --ask-sudo-pass
Mais je veux le faire comme ceci:
$ 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.
Réponses:
Vous pouvez transmettre des variables sur la ligne de commande via
--extra-vars "name=value"
. La variable de mot de passe Sudo estansible_sudo_pass
. Votre commande ressemblerait donc à:Mise à jour 2017 : Ansible 2.2.1.0 utilise désormais var
ansible_become_pass
. Soit semble fonctionner.la source
history -c
après l'exécution du yml..bash_history
.Les documents recommandent fortement de ne pas définir le mot de passe sudo en texte brut et de l'utiliser
--ask-sudo-pass
à la place sur la ligne de commande lors de l'exécutionansible-playbook
Mise à jour 2016:
Ansible 2.0 (pas 100% quand) marqué
--ask-sudo-pass
comme obsolète. Les documents recommandent désormais d'utiliser à la--ask-become-pass
place, tout en échangeant l'utilisation desudo
tout au long de vos playbooks avecbecome
.la source
Probablement la meilleure façon de le faire - en supposant que vous ne pouvez pas utiliser la solution NOPASSWD fournie par scottod est d'utiliser la solution de Mircea Vutcovici en combinaison avec Ansible vault .
Par exemple, vous pourriez avoir un playbook quelque chose comme ceci:
Ici, nous incluons un fichier appelé
secret
qui contiendra notre mot de passe sudo.Nous utiliserons ansible-vault pour créer une version chiffrée de ce fichier:
Cela vous demandera 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
::Enregistrez et quittez, vous avez maintenant un
secret
fichier crypté qu'Ansible est capable de décrypter lorsque vous exécutez votre playbook. Remarque: vous pouvez modifier le fichier avecansible-vault edit secret
(et saisir 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 à Ansible un fichier
--vault-password-file
qu'il utilisera pour décrypter votresecret
fichier.Créez un fichier appelé
vault.txt
et entrez 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 stockée sur une seule ligne dans le fichier.Depuis les documents Ansible:
Enfin: vous pouvez maintenant exécuter votre playbook avec quelque chose comme
Ce qui précède suppose la disposition de répertoire suivante:
Vous pouvez en savoir plus sur Ansible Vault ici: https://docs.ansible.com/playbooks_vault.html
la source
ansible-vault create group_vars/all/ansible.yml
et ajoutez-ansible_sudo_pass: yourpassword
y. Pas besoin de changer les playbooks ou l'inventairefatal: [localhost]: FAILED! => {"changed": false, "failed": true, "module_stderr": "sudo: a password is required\n", "module_stdout": "", "msg": "MODULE FAILURE", "parsed": false}
En regardant le code (
runner/__init__.py
), je pense que vous pouvez probablement le définir dans votre fichier d'inventaire:Il semble également y avoir une disposition dans le
ansible.cfg
fichier de configuration, mais pas implémentée pour le moment (constants.py
).la source
host_vars
ougroup_vars
répertoire, puis crypter le fichier en utilisant ansible-voûteJe ne pense pas qu'ansible vous permettra de spécifier un mot de passe dans les drapeaux comme vous le souhaitez. Il peut y avoir quelque part dans les configurations cela peut être défini mais cela rendrait l'utilisation d'ansible moins sûre dans l'ensemble et ne serait pas recommandée.
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 à toutes les commandes ou à une liste restreinte de commandes.
Si vous exécutez
sudo visudo
et entrez une ligne comme celle ci-dessous, l'utilisateur «privilegedUser» ne devrait pas avoir à saisir de mot de passe lorsqu'il exécute quelque chose commesudo service xxxx start
:la source
Le mot de passe sudo est stocké sous la forme d'une 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
)Par groupe, dans votre fichier de groupes d'inventaire (
inventory/<inventoryname>/groups
)Par groupe, en groupe vars (
group_vars/<groupname>/ansible.yml
)Par groupe, crypté (
ansible-vault create group_vars/<groupname>/ansible.yml
)la source
Vous pouvez définir le mot de passe pour un groupe ou pour tous les serveurs à la fois:
la source
J'arrachais mes cheveux sur celui-ci, maintenant j'ai trouvé une solution qui fait ce que je veux:
1 fichier chiffré par hôte contenant le mot de passe sudo
/ etc / ansible / hosts:
puis vous créez pour chaque hôte un fichier var chiffré comme ceci:
avec contenu
la façon dont vous organisez le mot de passe du coffre-fort (entrez via --ask-vault-pass) ou par cfg dépend de vous
sur cette base, je pense que vous pouvez simplement crypter tout le fichier d'hôtes ...
la source
ansible-playback
. J'ai dû utiliser-e @vault/filename.ext
pour utiliser le coffre-fort avec monansible-playbook
appel.Une façon plus judicieuse de le faire consiste à stocker votre
sudo
mot de passe dans un coffre-fort sécurisé tel que LastPass ou KeePass , puis à le passer à l'ansible-playbook
aide de-e@
mais au lieu de coder en dur le contenu d'un fichier réel, 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 au-e@<(..)
.Exemple
Ce qui précède fait plusieurs choses, décomposons-le.
ansible-playbook -i /tmp/hosts pb.yml
- évidemment exécuter un playbook via ansible-playbook$(lpass show folder1/item1 --password)"
- exécute la CLI LastPasslpass
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 parlpass
-e@<(..)
- rassemble ce qui précède et connecte le sous-shell de<(...)
comme descripteur de fichieransible-playbook
à consommer.Améliorations supplémentaires
Si vous préférez ne pas taper cela à chaque fois, vous pouvez simplement faire des choses comme ça. Créez d'abord un alias dans votre
.bashrc
comme ceci:Vous pouvez maintenant exécuter votre playbook comme ceci:
Références
la source
--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 si le mot de passe est dans un descripteur de fichier temporaire, il n'est pas divulgué.Si vous êtes à l'aise avec la conservation des mots de passe dans des fichiers en texte brut, une autre option consiste à utiliser un fichier JSON avec le paramètre --extra-vars (assurez-vous d'exclure le fichier du contrôle de code source):
Ansible prend en charge cette option depuis la 1.3 .
la source
vous pouvez écrire le mot de passe sudo pour votre playbook dans le fichier hosts comme ceci:
la source
Un coffre-fort ansible a été suggéré plusieurs fois ici, mais je préfère git-crypt pour crypter des fichiers sensibles dans mes playbooks. Si vous utilisez git pour garder vos playbooks ansible, c'est un jeu d'enfant. Le problème que j'ai trouvé avec le coffre-fort ansible est que je tombe inévitablement sur 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 flux de travail plus agréable IMO.En utilisant cela, vous pouvez mettre vos mots de passe dans une var dans votre playbook, et marquer votre playbook comme un fichier crypté
.gitattributes
comme ceci: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
gpg
.Il y a un bon Q&A sur les
gpg
clés de transfert comme vosssh-agent
clés SSH vers l'avant ici: /superuser/161973/how-can-i-forward-a-gpg-key-via-ssh-agent .la source
Vous pouvez utiliser l'
sshpass
utilitaire comme ci-dessous,la source
L'utilisation de ansible 2.4.1.0 et des éléments suivants doit fonctionner:
Et lancez simplement le playbook avec cet inventaire comme:
la source
Mon hack pour automatiser cela était d'utiliser une variable d'environnement et d'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:
Recherchez la
ansible_become_pass
variable env en passant la variable supplémentaire dansansible-playbook
, par exemple: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 ansible et exécuter des jeux ansible avec des comptes induviduels, elles pourraient utiliser le mot de passe de coffre-fort partagé pour s'inverser mutuellement le mot de passe du système d'exploitation (vol d'identité). Sans doute, vous devez faire confiance à votre propre équipe?@
@ slm est générée dans le descripteur de fichier temporaire et utilise le préfixe pour lire la variable ansible à partir du descripteur de fichier . Évite au moins l'histoire de bash. Pas sûr, mais j'espère que l'écho du sous-shell ne sera pas pris et exposé dans la journalisation d'audit (par exemple auditd).la source
Vous pouvez utiliser le coffre-fort ansible qui votre mot de passe en coffre-fort chiffré. Après cela, vous pouvez utiliser la variable du coffre-fort dans les playbooks.
Quelques documentations sur ansible vault:
http://docs.ansible.com/playbooks_vault.html
Nous l'utilisons comme coffre-fort par environnement. Pour modifier le coffre-fort, nous avons la commande suivante:
ansible-vault edit inventories/production/group_vars/all/vault
Si vous voulez appeler la variable vault, vous devez utiliser ansible-playbook avec des paramètres comme:
ansible-playbook -s --vault-password-file=~/.ansible_vault.password
Oui, nous stockons le mot de passe du coffre-fort dans le répertoire local en texte brut, mais ce n'est pas plus dangereux comme stocker le mot de passe root pour chaque système. Le mot de passe root se trouve dans le fichier du coffre-fort ou vous pouvez l'avoir comme le fichier sudoers pour votre utilisateur / groupe.
Je recommande d'utiliser le fichier sudoers sur le serveur. Voici un exemple pour l'administrateur de groupe:
%admin ALL=(ALL) NOPASSWD:ALL
la source
Appelez simplement votre playbook avec
--extra-vars "become_pass=Password"
devenir_pass = ('ansible_become_password', 'ansible_become_pass')
la source
Après cinq ans, je constate que c'est toujours un sujet très pertinent. Reflétant quelque peu la réponse de leucos que je trouve la meilleure dans mon cas, en utilisant uniquement des outils ansibles (sans authentification centralisée, jetons ou autre). Cela suppose que vous avez 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 précis et ajouter les variables correspondantes à côté des hôtes:
Ajouter:
Ensuite:
Au moins de cette façon, vous n'avez pas à écrire plus de variables qui pointent vers les mots de passe.
la source
La solution ci-dessus de @ toast38coza a fonctionné pour moi; juste ce sudo: yes est déconseillé dans Ansible maintenant. Utilisez devenir et become_user à la place.
la source
nous pouvons également utiliser EXPECT BLOCK en ansible pour générer bash et le personnaliser selon vos besoins
la source
Très simple, et ajoutez seulement dans le fichier variable:
Exemple:
Et ajoutez-les:
la source
Juste un addendum, donc personne d'autre ne ressent le désagrément que j'ai fait récemment:
AFAIK, 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 playbook, suivez son modèle avec
vars_files
(ouinclude_vars
). Si vous souhaitez les garder séparés, vous pouvez fournir le contenu du coffre-fort sur la ligne de commande comme suit:C'est évident rétrospectivement, mais voici les pièges:
Ce sanglant signe @ . Si vous le laissez de côté, l'analyse échouera silencieusement et ansible-playbook se déroulera comme si vous n'aviez jamais spécifié le fichier en premier lieu.
Vous devez importer explicitement le contenu du coffre-fort, soit avec une ligne de commande --extra-vars / -e ou dans votre code YAML. L'
--ask-vault-pass
indicateur ne fait rien par lui-même (en plus de vous demander une valeur qui peut ou non être utilisée plus tard).Puissiez-vous inclure vos "@" et gagner une heure.
la source
Cela a fonctionné pour moi ... Fichier créé /etc/sudoers.d/90-init-users avec NOPASSWD
où "utilisateur" est votre ID utilisateur.
la source