Spécifiez le mot de passe sudo pour Ansible
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 l'exécuter comme ceci:
ansible-playbook playbook.yml -i inventory.ini --user=username
--sudo-pass=12345
y a-t-il un moyen? Je veux automatiser le plus possible le déploiement de mon projet.
17 réponses
vous pouvez passer la 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 à:
ansible-playbook playbook.yml -i inventory.ini --user=username \
--extra-vars "ansible_sudo_pass=yourPassword"
Update 2017 : Ansible 2.2.1.0 utilise maintenant var ansible_become_pass
. Soit semble fonctionner.
les docs fortement déconseillent de définir le mot de passe sudo en clair, et à la place d'utiliser --ask-sudo-pass
sur la ligne de commande lors de l'exécution ansible-playbook
2016 Mise à jour:
Ansible 2.0 (pas de 100%), marquée --ask-sudo-pass
comme obsolète. Les docs maintenant vous recommandons d'utiliser --ask-become-pass
au lieu de cela, tandis que changez également l'utilisation de sudo
tout au long de vos playbooks avec become
.
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 voûte Ansible .
par exemple, vous pourriez avoir un playbook quelque chose comme 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 utiliserons ansible-vault pour créer une version cryptée de ce fichier:
ansible-vault create secret
cela va vous demander un mot de passe, puis ouvrir votre éditeur par défaut pour éditer le fichier. Vous pouvez mettre votre ansible_sudo_pass
ici.
p.ex.: secret
:
ansible_sudo_pass: mysudopassword
enregistrer et sortir, maintenant vous avez un fichier secret
crypté que Ansible est capable de déchiffrer lorsque vous exécutez votre playbook. Note: vous pouvez éditer le fichier avec ansible-vault edit secret
(et entrer 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 avec un --vault-password-file
qu'il utilisera pour déchiffrer votre fichier secret
.
créer un fichier appelé vault.txt
et y mettre 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 de caractères stockée sur une seule ligne dans le fichier.
De l'Ansible Docs:
.. assurez-vous que les permissions sur le fichier sont telles que personne d'autre ne peut accéder à votre clé et ne pas ajouter votre clé au contrôle source
enfin: vous pouvez maintenant lancer 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 disposition suivante du répertoire:
.
|_ 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 mettre dans votre fichier d'inventaire :
[whatever]
some-host ansible_sudo_pass='foobar'
il semble y avoir une certaine disposition dans ansible.cfg
fichier de configuration aussi, Mais Pas mis en œuvre en ce moment ( constants.py
).
Je 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 configs cela peut être défini, mais cela rendrait l'utilisation d'une option moins sûre dans l'ensemble et ne serait pas 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 soit à une liste restreinte de commandes.
si vous lancez sudo visudo
et inscrivez une ligne comme ci-dessous, alors l'utilisateur 'privilegedUser' ne devrait pas avoir à entrer un mot de passe quand ils exécutent quelque chose comme sudo service xxxx start
:
%privilegedUser ALL= NOPASSWD: /usr/bin/service
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
le sudo password est stocké sous la forme d'une variable appelée ansible_sudo_pass
.
Vous pouvez définir cette variable de plusieurs façons:
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 le 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"
Je déchirais Mes cheveux au-dessus de celui-ci, 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 organiser le mot de passe de la chambre forte (entrée via-demandez-chapelle-pass) ou par cfg est à vous
basé sur ceci, je pense que vous pouvez simplement crypter le fichier entier des hôtes...
vous pouvez utiliser Ansible vault qui codera votre mot de passe dans une voûte cryptée. Après cela, vous pouvez utiliser la variable de voûte dans les tablettes playbook.
quelques documents sur la voûte ansible:
http://docs.ansible.com/playbooks_vault.html
nous l'utilisons comme chambre forte par Environnement. Pour éditer la voûte, nous avons la commande as:
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 de chambre forte dans le répertoire local dans le texte simple, mais ce n'est pas plus dangereux que stocker le mot de passe de racine pour chaque système. Le mot de passe Root est dans le fichier vault ou vous pouvez l'avoir comme le fichier sudoers pour votre utilisateur/groupe.
Je recommande d'utiliser le fichier sudoers serveur. Voici un exemple d'administrateur de groupe:
%admin ALL=(ALL) NOPASSWD:ALL
si vous êtes à l'aise avec la conservation des mots de passe dans des fichiers texte, une autre option est d'utiliser un fichier JSON avec le paramètre --extra-vars (assurez-vous d'exclure le fichier du contrôle source):
ansible-playbook --extra-vars "@private_vars.json" playbook.yml
Ansible vault a été suggéré plusieurs fois ici, mais je préfère git-crypt pour crypter les fichiers sensibles dans mes playbooks. Si vous utilisez git pour garder vos livres de jeu accessibles, c'est un claquement. Le problème que j'ai trouvé avec ansible vault, c'est que je tombe inévitablement sur des copies cryptées du fichier avec lequel je veux travailler et que je dois le déchiffrer avant de pouvoir travailler. git-crypt
offre un meilleur workflow IMO.
en utilisant ceci, vous pouvez mettre vos mots de passe dans un var dans votre playbook, et marquer votre playbook comme un fichier crypté dans .gitattributes
comme ceci:
my_playbook.yml filter=git-crypt diff=git-crypt
votre playbook sera crypté de façon transparente sur Github. Ensuite, il vous suffit d'installer votre clé de cryptage sur l'hôte que vous utilisez pour exécuter ansible, ou de suivre les instructions sur la documentation pour la configurer avec gpg
.
Il ya une bonne Q&R sur l'expédition gpg
clés comme votre ssh-agent
transmet clés SSH ici: https://superuser.com/questions/161973/how-can-i-forward-a-gpg-key-via-ssh-agent .
appelez simplement votre playbook avec --extra-vars "become_pass=Password"
becte_pass=('ansible_become_password',' ansible_become_pass')
Vous pouvez utiliser sshpass
utilitaire comme ci-dessous,
$ sshpass -p "your pass" ansible pattern -m module -a args \
-i inventory --ask-sudo-pass
vous pouvez écrire le mot de passe sudo pour votre playbook dans le fichier hosts comme ceci:
[host-group-name]
host-name:port ansible_sudo_pass='*your-sudo-password*'
nous pouvons également utiliser EXPECT BLOCK dans ansible pour frayer bash 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
très simple, et ajouter seulement dans le fichier variable:
exemple:
$ vim group_vars/all
et ajouter:
Ansible_connection: ssh
Ansible_ssh_user: rafael
Ansible_ssh_pass: password123
Ansible_become_pass: password123
ça a marché pour moi... Créé le fichier /etc/sudoers.d/90-init-les utilisateurs de fichiers avec NOPASSWD
echo "user ALL=(ALL) NOPASSWD:ALL" > 90-init-users
où "utilisateur" est votre nom d'utilisateur.