Especifique la contraseña de sudo para Ansible


¿Cómo puedo especificar una contraseña sudo para Ansible de forma no interactiva?

Estoy ejecutando Ansible playbook así:

ansible-playbook playbook.yml -i inventory.ini --user=username --ask-sudo-pass

Pero quiero ejecutarlo así:

ansible-playbook playbook.yml -i inventory.ini --user=username --sudo-pass=12345

Hay una manera? Quiero automatizar la implementación de mi proyecto tanto como sea posible.

 157
Author: Slava Fomin II, 2014-02-19

17 answers

Puede pasar variable en la línea de comandos a través de --extra-vars "name=value". La variable Sudo password es ansible_sudo_pass. Así que su orden se vería como:

ansible-playbook playbook.yml -i inventory.ini --user=username \
                              --extra-vars "ansible_sudo_pass=yourPassword"

Actualización 2017 : Ansible 2.2.1.0 ahora usa var ansible_become_pass. Cualquiera parece funcionar.

 100
Author: Alexandr Nikitin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-16 01:08:39

Los documentos fuertemente recomienda no establecer la contraseña sudo en texto plano, y en su lugar usar --ask-sudo-pass en la línea de comandos cuando se ejecuta ansible-playbook


2016 Actualización:

Ansible 2.0 (no 100% cuando) marcado --ask-sudo-pass como obsoleto. Los documentos ahora recomiendan usar --ask-become-pass en su lugar, mientras que también intercambian el uso de sudo en sus libros de jugadas con become.

 169
Author: deefour,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-31 19:57:44

Probablemente la mejor manera de hacer esto - suponiendo que no se puede utilizar la solución NOPASSWD proporcionada por scottod es utilizar la solución de Mircea Vutcovici en combinación con Ansible vault.

Por ejemplo, usted podría tener un libro de jugadas algo como esto:

- hosts: all

  vars_files:
    - secret

  tasks:
    - name: Do something as sudo
      service: name=nginx state=restarted
      sudo: yes

Aquí estamos incluyendo un archivo llamado secret que contendrá nuestra contraseña sudo.

Usaremos ansible-vault para crear una versión cifrada de este archivo:

ansible-vault create secret

Esto te preguntará para obtener una contraseña, abra el editor predeterminado para editar el archivo. Puedes poner tu ansible_sudo_pass aquí.

E. g.: secret:

ansible_sudo_pass: mysudopassword

Guarde y salga, ahora tiene un archivo cifrado secret que Ansible puede descifrar cuando ejecuta su libro de jugadas. Nota: puede editar el archivo con ansible-vault edit secret (e introducir la contraseña que utilizó al crear el archivo)

La pieza final del rompecabezas es proporcionar a Ansible un --vault-password-file que utilizará para descifrar su secret file.

Crea un archivo llamado vault.txt y en él pon la contraseña que usaste al crear tu archivo secret. La contraseña debe ser una cadena almacenada como una sola línea en el archivo.

De los documentos de Ansible:

.. asegúrese de que los permisos en el archivo sean tales que nadie más pueda acceder a su clave y no agregue su clave al control de código fuente

Finalmente: ahora puede ejecutar su libro de jugadas con algo como

ansible-playbook playbook.yml -u someuser -i hosts --sudo --vault-password-file=vault.txt 

Lo anterior supone la siguiente disposición del directorio:

.
|_ playbook.yml
|_ secret
|_ hosts
|_ vault.txt

Puedes leer más sobre Ansible Vault aquí: https://docs.ansible.com/playbooks_vault.html

 84
Author: toast38coza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-23 15:17:04

Mirando el código (runner/__init__.py), Creo que probablemente puede configurarlo en su archivo de inventario:

[whatever]
some-host ansible_sudo_pass='foobar'

Parece haber alguna disposición en el archivo de configuración ansible.cfg también, pero no implementada en este momento (constants.py).

 41
Author: leucos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-19 08:41:25

No creo que ansible le permita especificar una contraseña en las banderas como desea hacer. Puede haber algún lugar en las configuraciones que se puede establecer, pero esto haría que el uso de ansible sea menos seguro en general y no se recomendaría.

Una cosa que puede hacer es crear un usuario en la máquina de destino y otorgarle privilegios sudo sin contraseña a todos los comandos o a una lista restringida de comandos.

Si ejecuta sudo visudo e ingresa una línea como la siguiente, entonces el usuario 'privilegedUser' no debería tener que introducir una contraseña cuando ejecutan algo como sudo service xxxx start:

%privilegedUser ALL= NOPASSWD: /usr/bin/service
 39
Author: scottod,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-20 03:34:43

Puede establecer la contraseña para un grupo o para todos los servidores a la vez:

[all:vars]
ansible_sudo_pass=default_sudo_password_for_all_hosts

[group1:vars]
ansible_sudo_pass=default_sudo_password_for_group1
 16
Author: Mircea Vutcovici,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-03 14:20:18

La contraseña sudo se almacena como una variable llamada ansible_sudo_pass. Puede establecer esta variable de varias maneras:

Por host, en su archivo de hosts de inventario (inventory/<inventoryname>/hosts)

[server]
10.0.0.0 ansible_sudo_pass=foobar

Por grupo, en su archivo de grupos de inventario (inventory/<inventoryname>/groups)

[server:vars]
ansible_sudo_pass=foobar

Por grupo, en vars de grupo (group_vars/<groupname>/ansible.yml)

ansible_sudo_pass: "foobar"

Por grupo, cifrado (ansible-vault create group_vars/<groupname>/ansible.yml)

ansible_sudo_pass: "foobar"
 16
Author: Bouke Versteegh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-03 11:24:34

Me estaba arrancando el pelo por encima de este, ahora encontré una solución que hace lo que quiero:

1 archivo cifrado por host que contiene la contraseña 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

Luego se crea para cada host un archivo var cifrado así:

ansible-vault create /etc/ansible/host_vars/node-0

Con contenido

ansible_sudo_pass: "my_sudo_pass_for_host_node-0"

Cómo organizar la contraseña del almacén (ingrese a través de ask ask-vault-pass) o por cfg depende de usted

Basándome en esto, sospecho que puede cifrar todos los hosts file...

 10
Author: greenone83,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-17 20:10:42

Puede usar ansible vault que codificará su contraseña en encriptado vault. Después de eso, puede usar variable de vault en los libros de jugadas.

Alguna documentación sobre ansible vault:
http://docs.ansible.com/playbooks_vault.html

Lo estamos usando como almacén por entorno. Para editar vault tenemos comando como:
ansible-vault edit inventories/production/group_vars/all/vault

Si desea llamar a la variable vault, debe usar ansible-playbook con parámetros como:
ansible-playbook -s --vault-password-file=~/.ansible_vault.password

Sí estamos almacenando contraseña del almacén en el directorio local en texto plano, pero no es más peligroso como la contraseña de root de la tienda para cada sistema. La contraseña de root está dentro del archivo vault o puede tenerla como el archivo sudoers para su usuario/grupo.

Recomiendo usar el archivo sudoers en el servidor. Este es un ejemplo para el administrador de grupo:
%admin ALL=(ALL) NOPASSWD:ALL

 2
Author: maxo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-02 15:15:01

Si se siente cómodo manteniendo las contraseñas en archivos de texto plano, otra opción es usar un archivo JSON con el parámetro extra extra-vars (asegúrese de excluir el archivo del control de código fuente):

ansible-playbook --extra-vars "@private_vars.json" playbook.yml 

Ansible ha soportado esta opción desde la versión 1.3.

 2
Author: sidecarcat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-08 16:15:33

Ansible vault se ha sugerido un par de veces aquí, pero prefiero git-crypt para cifrar archivos confidenciales en mis libros de jugadas. Si estás usando git para mantener tus manuales de ansible, es muy fácil. El problema que he encontrado con ansible vault es que inevitablemente termino encontrándome con copias cifradas del archivo con el que quiero trabajar y tengo que descifrarlo antes de poder trabajar. git-crypt ofrece un flujo de trabajo más agradable IMO.

Usando esto, puede poner sus contraseñas en un var en su libro de jugadas, y marcar su libro de jugadas como un archivo cifrado en .gitattributes así:

 my_playbook.yml filter=git-crypt diff=git-crypt

Tu libro de jugadas se cifrará de forma transparente en Github. Entonces solo necesita instalar su clave de cifrado en el host que usa para ejecutar ansible, o seguir las instrucciones en la documentación para configurarlo con gpg.

Hay un buen Q & A en reenviar gpg claves como su ssh-agent reenvía claves SSH aquí: https://superuser.com/questions/161973/how-can-i-forward-a-gpg-key-via-ssh-agent .

 2
Author: user2432419,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-28 01:33:53

Simplemente llame a su libro de jugadas con --extra-vars "become_pass=Password"

Become_pass=('ansible_become_password', 'ansible_become_pass')

 1
Author: Crypto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-14 10:59:48

Puede usar la utilidad sshpass como se muestra a continuación,

$ sshpass -p "your pass" ansible pattern -m module -a args \
   -i inventory --ask-sudo-pass
 1
Author: Sachin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-28 01:30:38

Puede escribir la contraseña sudo para su libro de jugadas en el archivo hosts de esta manera:

[host-group-name]
host-name:port ansible_sudo_pass='*your-sudo-password*'
 1
Author: user3343297,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-28 01:31:02

También podemos usar EXPECT BLOCK en ansible para generar bash y personalizarlo según sus necesidades

- 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
Author: Ashish Ranjan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-28 19:45:11

Muy simple, y solo añadir en el archivo de variables:

Ejemplo:

$ vim group_vars/all

Y añadir estos:

Ansible_connection: ssh
Ansible_ssh_user: rafael
Ansible_ssh_pass: password123
Ansible_become_pass: password123
 0
Author: rafaelrms,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-28 01:31:44

Esto funcionó para mí... Archivo creado/etc / sudoers.d / 90-archivo init-users con NOPASSWD

echo "user ALL=(ALL)       NOPASSWD:ALL" > 90-init-users

Donde "user" es su id de usuario.

 -2
Author: ScottM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-15 16:30:16