Mis nuevas instancias de servidor están configuradas para iniciar sesión en root a través de ssh con contraseña. Quiero que mi libro de jugadas de Ansible lo reconfigure para que use claves en su lugar y desactive el inicio de sesión raíz con contraseña en la primera ejecución, por lo que necesito algo como esto:
- intenta iniciar sesión con la clave
si no puede iniciar sesión con la clave:
- iniciar sesión con contraseña
- añadir clave a claves_autorizadas
- deshabilitar el inicio de sesión raíz con contraseña
- opcionalmente reconectarse usando la llave
hacer otras tareas
¿Cómo puedo lograr eso?
EDITAR : Para ser claros, no estoy preguntando cómo agregar una clave o deshabilitar la raíz, eso es solo por contexto. Estoy preguntando cómo recurrir a la contraseña si no se puede autenticar con la clave. Con --ask-passo ansible_ssh_passconfigurado, Ansible ni siquiera intentará usar la autenticación de clave pública
ssh
authentication
ansible
petr0
fuente
fuente

Respuestas:
Puede probar la
PreferredAuthenticationsopción, configurándola enpublickey,password. El valor predeterminado incluye estos en este orden, junto con otras opciones, por lo que ansible presumiblemente está configurando esto. Agregarlo a través de-oo el clientessh_configpuede evitar esto.Es posible que pueda usar un script de envoltura. Por ejemplo, con esto dentro
key_or_password.shy otropass.shque proporciona la contraseña, se ejecutarábash key_or_password.sh root@hostuna clave pública seguida de un inicio de sesión de contraseña no interactivo.El registro indica con qué método tuvo éxito, p. Ej.
fuente
Esto es lo que hago si
ansible_useres diferente para la 'primera ejecución' del libro de jugadas (por ejemplo, si solo tiene unrootusuario y va a configurar un nuevo usuario con una clave SSH):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.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.ansible_user_first_runpara el usuario que va a usar para la 'primera ejecución' del libro de jugadas, por ejemploroot.ignore_errorsychanged_when: Falseansible_userel valor deansible_user_first_runAquí está el código:
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ícitamentesetupa su rol antes de acceder a cualquiera de los datos normalmente disponibles en lugares comoansible_devices, etc. Una buena forma de hacerlo es llamarsetupcon unawhencláusula que verifique si el hecho de que está usando está vacío o no antes de llamarlo en su rol.fuente
gather_facts: nopara detener ansible el intentar conectarse al iniciar el libro de jugadas :)Puedes usar
--ask-passcuando ejecutes ansible-playbook.Para otras tareas que solicitó, se puede lograr por varios medios, por ejemplo, copiar el módulo.
La desactivación del inicio de sesión raíz también se puede hacer, p. creando plantillas
sshd_confo insertando una línea en el archivo conf.fuente