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.
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.
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
.
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
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
).
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
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
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"
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...
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
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
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 .
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')
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
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*'
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
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
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.
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