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.

157
demandé sur Slava Fomin II 2014-02-19 06:54:46

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.

100
répondu Alexandr Nikitin 2017-11-16 01:08:39

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 .

169
répondu deefour 2016-07-31 19:57:44

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

84
répondu toast38coza 2015-03-23 15:17:04

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 ).

41
répondu leucos 2014-02-19 08:41:25

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
39
répondu scottod 2016-05-20 03:34:43

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
16
répondu Mircea Vutcovici 2014-09-03 14:20:18

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"
16
répondu Bouke Versteegh 2016-05-03 11:24:34

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

10
répondu greenone83 2015-10-17 20:10:42

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

2
répondu maxo 2015-06-02 15:15:01

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 supporte cette option depuis 1.3 .

2
répondu sidecarcat 2016-01-08 16:15:33

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 .

2
répondu user2432419 2018-09-28 01:33:53

appelez simplement votre playbook avec --extra-vars "become_pass=Password"

becte_pass=('ansible_become_password',' ansible_become_pass')

1
répondu Crypto 2018-08-14 10:59:48

Vous pouvez utiliser sshpass utilitaire comme ci-dessous,

$ sshpass -p "your pass" ansible pattern -m module -a args \
   -i inventory --ask-sudo-pass
1
répondu Sachin 2018-09-28 01:30:38

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*'
1
répondu user3343297 2018-09-28 01:31:02

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
0
répondu Ashish Ranjan 2017-04-28 19:45:11

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
0
répondu rafaelrms 2018-09-28 01:31:44

ç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.

-2
répondu ScottM 2018-03-15 16:30:16