Especifique la contraseña de sudo para Ansible

¿Cómo especifico una contraseña de sudo para Ansible de manera no interactiva?

Estoy ejecutando el libro de jugadas de Ansible 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 alguna manera? Quiero automatizar la implementación de mi proyecto tanto como sea posible.

Puede pasar variable en la línea de comando a través de --extra-vars "name=value" . La variable de contraseña de sudo es ansible_sudo_pass . Entonces su comando se vería así:

 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 de los dos parece funcionar.

Los documentos recomiendan encarecidamente que no se establezca la contraseña de sudo en texto sin formato y, en su lugar, que se use --ask-sudo-pass en la línea de comandos cuando se ejecuta ansible-playbook


Actualización 2016:

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

Probablemente la mejor manera de hacerlo, suponiendo que no puede usar la solución NOPASSWD proporcionada por scottod, es utilizar la solución de Mircea Vutcovici en combinación con Ansible Vault .

Por ejemplo, puede tener un libro de jugadas como este:

 - hosts: all vars_files: - secret tasks: - name: Do something as sudo service: name=nginx state=restarted sudo: yes 

Aquí incluimos un archivo llamado secret que contendrá nuestra contraseña de sudo.

Utilizaremos ansible-vault para crear una versión encriptada de este archivo:

 ansible-vault create secret 

Esto le pedirá una contraseña, luego abra su editor predeterminado para editar el archivo. Puedes poner tu ansible_sudo_pass aquí.

por ejemplo: secret :

 ansible_sudo_pass: mysudopassword 

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

La última pieza del rompecabezas es proporcionar a Ansible un --vault-password-file que usará para descifrar su archivo secret .

Cree un archivo llamado vault.txt y allí ponga la contraseña que utilizó al crear su archivo secret . La contraseña debe ser una cadena almacenada como una sola línea en el archivo.

De los Documentos 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 la fuente

Finalmente: ahora puedes ejecutar tu libro de jugadas con algo como

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

Lo anterior está asumiendo el siguiente diseño de directorio:

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

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

Al mirar el código ( runner/__init__.py ), creo que probablemente pueda establecerlo en su archivo de inventario:

 [whatever] some-host ansible_sudo_pass='foobar' 

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

No creo que Ansible te permita especificar una contraseña en las banderas como desees. Puede haber algún lugar en las configuraciones que se pueda establecer, pero esto haría que el uso de ansible sea menos seguro en general y no sería recomendable.

Una cosa que puede hacer es crear un usuario en la máquina de destino y otorgarles privilegios de 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 ingresar una contraseña cuando ejecute algo así como sudo service xxxx start :

 %privilegedUser ALL= NOPASSWD: /usr/bin/service 

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 

La contraseña de 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 inventory//hosts ( inventory//hosts )

 [server] 10.0.0.0 ansible_sudo_pass=foobar 

Por grupo, en su archivo de grupos de inventory//groups ( inventory//groups )

 [server:vars] ansible_sudo_pass=foobar 

Por grupo, en grupos vars ( group_vars//ansible.yml )

 ansible_sudo_pass: "foobar" 

Por grupo, encriptado ( ansible-vault create group_vars//ansible.yml )

 ansible_sudo_pass: "foobar" 

Me estaba arrancando los pelos 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 var-file encriptado como ese:

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

con contenido

 ansible_sudo_pass: "my_sudo_pass_for_host_node-0" 

cómo organizas la contraseña de la bóveda (ingresa por –ask-vault-pass) o por cfg depende de ti

basándome en esto, sospecho que puedes encriptar todo el archivo de hosts …

Puede usar la bóveda ansible que codificará su contraseña en la bóveda cifrada. Después de eso puedes usar la variable de la bóveda en los libros de jugadas.

Alguna documentación sobre la bóveda ansible:
http://docs.ansible.com/playbooks_vault.html

Lo estamos utilizando como bóveda por entorno. Para editar la bóveda tenemos el comando como:
ansible-vault edit inventories/production/group_vars/all/vault

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

Sí, estamos almacenando la contraseña de la bóveda en el directorio local en texto plano, pero no es más peligrosa, como la contraseña del administrador de la tienda para cada sistema. La contraseña de root está dentro del archivo de vault o puede tenerlo como un archivo sudoers para su usuario / grupo.

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

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

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

Ansible ha apoyado esta opción desde 1.3 .

Ansible Vault se ha sugerido un par de veces aquí, pero prefiero git-crypt para encriptar archivos confidenciales en mis libros de jugadas. Si usas git para guardar tus libros de jugadas de ansible, es muy fácil. El problema que he encontrado con Ansible Vault es que inevitablemente me encuentro con copias encriptadas del archivo con el que quiero trabajar y tengo que descifrarlo antes de poder trabajar. git-crypt ofrece un IMO de flujo de trabajo más agradable.

https://github.com/AGWA/git-crypt

Usando esto, puedes poner tus contraseñas en una var en tu libro de jugadas, y marcar tu libro de jugadas como un archivo encriptado en .gitattributes como este:

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

su libro de jugadas se encriptará 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 buenas preguntas y respuestas sobre el reenvío de claves gpg como su ssh-agent reenvía las claves ssh aquí: https://superuser.com/questions/161973/how-can-i-forward-a-gpg-key-via-ssh-agent

puedes escribir la contraseña de sudo para tu libro de jugadas en el archivo de hosts como este

[host-group-name] nombre-host: puerto ansible_sudo_pass = ‘ su-sudo-contraseña

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

$ sshpass -p “su pase” patrón ansible -m moduel -a args -i inventario -ask-sudo-pass

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

become_pass = (‘ansible_become_password’, ‘ansible_become_pass’)

Chicos, muy simple, y solo agreguen el archivo variable:

Ejemplo: Vim group_vars / all

Ansible_connection: ssh Ansible_ssh_user: rafael Ansible_ssh_pass: password123 Ansible_become_pass: password123

También podemos usar EXPECT BLOCK en ansible spawn 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 

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

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

donde “usuario” es su ID de usuario.