tower - ansible tutorial
Crear y usar grupo sin reiniciar (4)
Intenta eliminar la carpeta de socket durante la reproducción, funciona de mi lado (no sé si es la solución más fina). Curiosamente, meta: reset_connection
no funciona con Ansible 2.4
- name: reset ssh connection
local_action:
module: file
path: "~/.ansible/cp"
state: absent
Tengo una tarea, eso crea un grupo.
- name: add user to docker group
user: name=USERNAME groups=docker append=yes
sudo: true
En otro libro de jugadas, necesito ejecutar un comando que se basa en tener el permiso del nuevo grupo. Lamentablemente, esto no funciona porque el nuevo grupo solo se carga después de que cierre sesión y vuelva a iniciar sesión.
He intentado algunas cosas como:
su -l USERNAME
o
newgrp docker; newgrp
Pero nada funcionó. ¿Hay algún cambio para obligar a Ansible a reconectarse con el host y hacer un relogin? Un reinicio sería la última opción.
Otra opción que he encontrado sería utilizar async:
para poner en cola la destrucción de sshd
en segundo plano, sin depender de una conexión abierta. Se siente increíblemente raro, pero parece funcionar de manera confiable tanto en Ansible 1.9 como en 2.0.
- name: Kill SSH
shell: sleep 1; pkill -u {{ ansible_ssh_user }} sshd
async: 3
poll: 2
Pausa por 1 segundo, luego mata sshd
. Comience a verificar que el trabajo esté terminado después de 2 segundos, el tiempo máximo permitido es de 3 segundos. En mis pruebas limitadas, parece resolver el problema de actualizar los grupos de usuarios actuales con solo un retraso mínimo.
Para Ansible 2 creé un rol de Galaxy: https://galaxy.ansible.com/udondan/ssh-reconnect/
Uso:
- name: add user to docker group
user: name=USERNAME groups=docker append=yes
sudo: true
notify:
- Kill all ssh connections
Si necesita inmediatamente el nuevo grupo, puede llamar al módulo usted mismo:
- name: Kill own ssh connections
ssh-reconnect: all=True
O, alternativamente, ejecute los controladores cuando sea necesario
- meta: flush_handlers
Para Ansible <1.9 ver esta respuesta:
¿Usas tomas de control ssh? Si tiene ControlMaster
activado en su configuración ssh, esto explicaría el comportamiento. Ansible se vuelve a conectar para cada tarea, por lo que el usuario debe tener el rol correcto asignado en la siguiente tarea. Sin embargo, cuando utiliza el uso compartido de sesiones de ssh, Ansible volvería a utilizar la conexión abierta ssh y, por lo tanto, no volverá a iniciar sesión.
Puede desactivar la sesión compartida en su ansible.cfg
:
[ssh_connection]
ssh_args= -S "none"
Dado que compartir la sesión es bueno para acelerar las jugadas de Ansible, existe una alternativa. Ejecuta una tarea que mata todas las conexiones ssh para tu usuario actual.
- name: add user to docker group
user: name=USERNAME groups=docker append=yes
sudo: true
register: user_task
- name: Kill open ssh sessions
shell: "ps -ef | grep sshd | grep `whoami` | awk ''{print /"kill -9/", $2}'' | sh"
when: user_task | changed
failed_when: false
Esto obligará a Ansible a volver a iniciar sesión en la siguiente tarea.
Para la versión 2.3 o posterior de Ansible, use el meta: reset_connection
:
- user: name={{ansible_user}} groups=input - name: reset ssh connection to allow user changes to affect ''current login user'' meta: reset_connection