Esto es lo que hago si ansible_user
es diferente para la 'primera ejecución' del libro de jugadas (por ejemplo, si solo tiene un root
usuario y va a configurar un nuevo usuario con una clave SSH):
- Guarde la contraseña
ansible_pass
como lo haría si estuviera usando los inicios de sesión de contraseña (recuerde usar Vault), esta debería ser la contraseña del usuario que está usando para la 'primera ejecución' del libro de jugadas.
- Establezca
ansible_user
el nombre de usuario del usuario que desea usar después de la primera ejecución cuando los usuarios estén configurados correctamente en el servidor.
- Establezca una variable
ansible_user_first_run
para el usuario que va a usar para la 'primera ejecución' del libro de jugadas, por ejemplo root
.
- Use un comando local para intentar conectarse al servidor con la clave SSH correcta, usando
ignore_errors
ychanged_when: False
- Si eso falla, actualice
ansible_user
el valor deansible_user_first_run
Aquí está el código:
---
- name: Check if connection is possible
command: ssh -o User={{ ansible_user }} -o ConnectTimeout=10 -o PreferredAuthentications=publickey -o PubkeyAuthentication=yes {{ inventory_hostname }} echo "Worked"
register: result
connection: local
ignore_errors: yes
changed_when: False
- name: If no connection, change user_name
connection: local
set_fact:
ansible_user: "{{ ansible_user_first_run }}"
when: result|failed
Nota: Vale la pena configurarlo transport = ssh
ya que paramiko puede fallar inesperadamente al iniciar sesión en el servidor en algunas configuraciones (por ejemplo, cuando el servidor está configurado para no aceptar contraseñas, y está intentando primero con una clave y luego una contraseña ... ¡extraño!) También el transporte ssh es más rápido, por lo que vale la pena de todos modos.
Nota adicional: si está utilizando este método, debe especificar gather_facts: false
en su archivo de definición de libro de jugadas para que las tareas de configuración / recopilación de datos no se ejecuten automáticamente antes de llegar a la etapa de prueba de contraseñas. Si necesita alguno de los hechos ansibles, deberá llamar explícitamente setup
a su rol antes de acceder a cualquiera de los datos normalmente disponibles en lugares como ansible_devices
, etc. Una buena forma de hacerlo es llamar setup
con una when
cláusula que verifique si el hecho de que está usando está vacío o no antes de llamarlo en su rol.