¿Cómo especifico una contraseña de sudo para Ansible de manera no interactiva?
Estoy ejecutando el libro de jugadas Ansible de esta manera:
$ 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.
Respuestas:
Puede pasar variable en la línea de comando a través de
--extra-vars "name=value"
. La variable de contraseña de sudo esansible_sudo_pass
. Entonces su comando se vería así:Actualización 2017 : Ansible 2.2.1.0 ahora usa la var
ansible_become_pass
. Cualquiera parece funcionar.fuente
history -c
después de la ejecución del yml..bash_history
.Los documentos recomiendan enfáticamente no establecer la contraseña de sudo en texto sin formato y, en su lugar, usarla
--ask-sudo-pass
en la línea de comando cuando se ejecutaansible-playbook
Actualización 2016:
Ansible 2.0 (no 100% cuando) marcado
--ask-sudo-pass
como obsoleto. Los documentos ahora recomiendan usar en su--ask-become-pass
lugar, al mismo tiempo que cambian el uso desudo
en sus libros de jugadas conbecome
.fuente
Probablemente la mejor manera de hacerlo, suponiendo que no pueda usar la solución NOPASSWD proporcionada por scottod es usar la solución de Mircea Vutcovici en combinación con la bóveda Ansible .
Por ejemplo, puede tener un libro de jugadas como este:
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:
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
::Guarde y salga, ahora tiene un
secret
archivo cifrado que Ansible puede descifrar cuando ejecuta su libro de jugadas. Nota: puede editar el archivo conansible-vault edit secret
(e ingresar la contraseña que utilizó al crear el archivo)La pieza final del rompecabezas es proporcionar a Ansible una
--vault-password-file
que usará para descifrar susecret
archivo.Cree un archivo llamado
vault.txt
y en ese lugar coloque la contraseña que utilizó al crear susecret
archivo. La contraseña debe ser una cadena almacenada como una sola línea en el archivo.De los documentos de Ansible:
Finalmente: ahora puedes ejecutar tu libro de jugadas con algo como
Lo anterior supone el siguiente diseño de directorio:
Puede leer más sobre Ansible Vault aquí: https://docs.ansible.com/playbooks_vault.html
fuente
ansible-vault create group_vars/all/ansible.yml
y agregaransible_sudo_pass: yourpassword
allí. No es necesario cambiar los libros de jugadas o el inventariofatal: [localhost]: FAILED! => {"changed": false, "failed": true, "module_stderr": "sudo: a password is required\n", "module_stdout": "", "msg": "MODULE FAILURE", "parsed": false}
Mirando el código (
runner/__init__.py
), creo que probablemente pueda configurarlo en su archivo de inventario:Parece que también hay alguna disposición en el
ansible.cfg
archivo de configuración, pero no implementada en este momento (constants.py
).fuente
host_vars
orgroup_vars
y luego cifrar el archivo usando ansible-vaultNo creo que ansible le permita especificar una contraseña en las banderas como desee. Puede haber algún lugar en las configuraciones que se puede configurar, 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 otorgarles privilegios de sudo sin contraseña para todos los comandos o una lista restringida de comandos.
Si ejecuta
sudo visudo
e ingresa una línea como la siguiente, entonces el usuario 'usuario privilegiado' no debería tener que ingresar una contraseña cuando ejecuta algo comosudo service xxxx start
:fuente
La contraseña de sudo se almacena como una variable llamada
ansible_sudo_pass
. Puede configurar esta variable de varias maneras:Por host, en su archivo de hosts de inventario (
inventory/<inventoryname>/hosts
)Por grupo, en su archivo de grupos de inventario (
inventory/<inventoryname>/groups
)Por grupo, en grupo vars (
group_vars/<groupname>/ansible.yml
)Por grupo, encriptado (
ansible-vault create group_vars/<groupname>/ansible.yml
)fuente
Puede establecer la contraseña para un grupo o para todos los servidores a la vez:
fuente
Me estaba arrancando el pelo sobre este, ahora encontré una solución que hace lo que quiero:
1 archivo encriptado por host que contiene la contraseña de sudo
/ etc / ansible / hosts:
luego crea para cada host un archivo var cifrado de esta manera:
con contenido
cómo organiza la contraseña de la bóveda (ingrese a través de --ask-vault-pass) o mediante cfg
basado en esto, sospecho que puede cifrar todo el archivo de hosts ...
fuente
ansible-playback
. Tuve que usar-e @vault/filename.ext
para usar la bóveda con miansible-playbook
llamada.Una forma más inteligente de hacer esto es almacenar su
sudo
contraseña en una bóveda segura como LastPass o KeePass y luego pasarla aansible-playbook
usar el-e@
pero, en lugar de codificar el contenido en un archivo real, puede usar la construcción-e@<(...)
para ejecutar un comando en un sub-shell y redirige su salida (STDOUT) a un descriptor de archivo anónimo, alimentando efectivamente la contraseña al-e@<(..)
.Ejemplo
Lo anterior está haciendo varias cosas, vamos a desglosarlo.
ansible-playbook -i /tmp/hosts pb.yml
- obviamente, ejecutar un libro de jugadas a través de ansible-playbook$(lpass show folder1/item1 --password)"
- ejecuta la CLI de LastPasslpass
y recupera la contraseña para usarecho "ansible_sudo_pass: ...password..."
- toma la cadena 'ansible_sudo_pass:' y la combina con la contraseña proporcionada porlpass
-e@<(..)
- pone todo lo anterior junto, y conecta la subshell de<(...)
como un descriptor de archivo paraansible-playbook
consumir.Futuras mejoras
Si prefiere no escribir eso cada vez, simplemente puede hacer cosas así. Primero crea un alias en tu
.bashrc
like así:Ahora puedes ejecutar tu libro de jugadas así:
Referencias
fuente
--extra-vars @<(echo ansible_become_pass: $(op get item <item name> | jq --raw-output '.details.sections[0].fields[] | select(.t=="password").v'))
/dev/fd/63
si la contraseña se encuentra en un descriptor de archivo temporal, no se revela.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 ha admitido esta opción desde 1.3 .
fuente
puede escribir la contraseña de sudo para su libro de jugadas en el archivo de hosts de esta manera:
fuente
Se ha sugerido la bóveda de Ansible un par de veces aquí, pero prefiero git-crypt para cifrar archivos confidenciales en mis libros de jugadas. Si está utilizando git para mantener sus libros de jugadas ansibles, es muy fácil. El problema que he encontrado con Ansible Vault es que inevitablemente encuentro copias cifradas del archivo con el que quiero trabajar y tengo que descifrarlo antes de poder trabajar.
git-crypt
ofrece un mejor flujo de trabajo de la OMI.Con esto, puede poner sus contraseñas en una variable en su libro de jugadas y marcar su libro de jugadas como un archivo encriptado de
.gitattributes
esta manera:Su libro de jugadas se cifrará de forma transparente en Github. Luego solo necesita instalar su clave de cifrado en el host que utiliza para ejecutar ansible, o seguir las instrucciones en la documentación para configurarlo
gpg
.Hay un buen Q&A sobre el reenvío de
gpg
claves como lasssh-agent
claves SSH de reenvío aquí: /superuser/161973/how-can-i-forward-a-gpg-key-via-ssh-agent .fuente
Puede usar la
sshpass
utilidad de la siguiente manera,fuente
Usando ansible 2.4.1.0 y lo siguiente funcionará:
Y simplemente ejecute el libro de jugadas con este inventario como:
fuente
Mi truco para automatizar esto fue usar una variable de entorno y acceder a ella a través de
--extra-vars="ansible_become_pass='{{ lookup('env', 'ANSIBLE_BECOME_PASS') }}'"
.Exporte una var env, pero evite el historial de bash / shell (anteponer un espacio u otros métodos). P.ej:
Busque la
ansible_become_pass
variable env mientras pasa la variable adicional aansible-playbook
, por ejemplo:Buenas respuestas alternativas:
ansible_become_pass
. Esto es decente. Sin embargo, para los equipos paranoicos que necesitan compartir contraseñas de bóveda ansible y ejecutar jugadas ansibles con cuentas individuales, podrían usar la contraseña de bóveda compartida para revertir la contraseña del sistema operativo (robo de identidad). Podría decirse que necesita confiar en su propio equipo?@
@ slm se genera en el descriptor de archivo temporal y utiliza el prefijo para leer la variable ansible del descriptor de archivo . Evita la historia de bash al menos. No estoy seguro, pero espero que el eco subshell no quede atrapado y expuesto en el registro de auditoría (por ejemplo, auditado).fuente
Puedes usar la bóveda ansible que codificará su contraseña en la bóveda encriptada. Después de eso, puedes usar variables de vault en playbooks.
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 comando como:
ansible-vault edit inventories/production/group_vars/all/vault
Si desea llamar a la 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 peligroso como almacenar la contraseña de root para cada sistema. La contraseña de root está dentro del archivo de almacenamiento o puede tenerla como un archivo sudoers para su usuario / grupo.
Estoy recomendando usar el archivo sudoers en el servidor. Aquí hay un ejemplo para el administrador del grupo:
%admin ALL=(ALL) NOPASSWD:ALL
fuente
Simplemente llame a su libro de jugadas con
--extra-vars "become_pass=Password"
Become_pass = ('ansible_become_password', 'ansible_become_pass')
fuente
Después de cinco años, puedo ver que este sigue siendo un tema muy relevante. Algo similar a la respuesta de leucos, que encuentro la mejor en mi caso, usando solo herramientas ansibles (sin autenticación centralizada, tokens o lo que sea). Esto supone que tiene el mismo nombre de usuario y la misma clave pública en todos los servidores. Si no lo hace, por supuesto necesitaría ser más específico y agregar las variables correspondientes al lado de los hosts:
Añadir:
Luego:
Al menos de esta manera, no tiene que escribir más las variables que apuntan a las contraseñas.
fuente
La solución anterior de @ toast38coza funcionó para mí; solo ese sudo: sí está obsoleto en Ansible ahora. Uso convertirse y become_user lugar.
fuente
también podemos usar EXPECT BLOCK en ansible para generar bash y personalizarlo según sus necesidades
fuente
Muy simple, y solo agregue en el archivo variable:
Ejemplo:
Y agregue estos:
fuente
Solo un apéndice, para que nadie más pase por la molestia que hice recientemente:
AFAIK, la mejor solución es una de las líneas generales de tostadas38coza de arriba. Si tiene sentido vincular sus archivos de contraseña y su libro de jugadas de forma estática, siga su plantilla con
vars_files
(oinclude_vars
). Si desea mantenerlos separados, puede proporcionar el contenido de la bóveda en la línea de comando de la siguiente manera:Eso es obvio en retrospectiva, pero aquí están las trampas:
Ese sangriento signo @ . Si lo deja fuera, el análisis fallará en silencio , y ansible-playbook procederá como si nunca hubiera especificado el archivo en primer lugar.
Debe importar explícitamente el contenido de la bóveda, ya sea con una línea de comandos --extra-vars / -e o dentro de su código YAML. El
--ask-vault-pass
indicador no hace nada por sí mismo (además de pedirle un valor que puede o no usarse más adelante).Puede incluir sus "@" y ahorrar una hora.
fuente
Esto funcionó para mí ... Archivo creado /etc/sudoers.d/90-init-users archivo con NOPASSWD
donde "user" es su ID de usuario.
fuente