Esto es lo que hago si ansible_useres diferente para la 'primera ejecución' del libro de jugadas (por ejemplo, si solo tiene un rootusuario y va a configurar un nuevo usuario con una clave SSH):
- Guarde la contraseña
ansible_passcomo 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_userel 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_runpara 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_errorsychanged_when: False
- Si eso falla, actualice
ansible_userel 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 = sshya 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: falseen 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 setupa 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 setupcon una whencláusula que verifique si el hecho de que está usando está vacío o no antes de llamarlo en su rol.