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-pass
o ansible_ssh_pass
configurado, Ansible ni siquiera intentará usar la autenticación de clave pública
ssh
authentication
ansible
petr0
fuente
fuente
Respuestas:
Puede probar la
PreferredAuthentications
opció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-o
o el clientessh_config
puede evitar esto.Es posible que pueda usar un script de envoltura. Por ejemplo, con esto dentro
key_or_password.sh
y otropass.sh
que proporciona la contraseña, se ejecutarábash key_or_password.sh root@host
una 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_user
es diferente para la 'primera ejecución' del libro de jugadas (por ejemplo, si solo tiene unroot
usuario y va a configurar un nuevo usuario con una clave SSH):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.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.ansible_user_first_run
para el usuario que va a usar para la 'primera ejecución' del libro de jugadas, por ejemploroot
.ignore_errors
ychanged_when: False
ansible_user
el valor deansible_user_first_run
Aquí está el código:
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ícitamentesetup
a su rol antes de acceder a cualquiera de los datos normalmente disponibles en lugares comoansible_devices
, etc. Una buena forma de hacerlo es llamarsetup
con unawhen
cláusula que verifique si el hecho de que está usando está vacío o no antes de llamarlo en su rol.fuente
gather_facts: no
para detener ansible el intentar conectarse al iniciar el libro de jugadas :)Puedes usar
--ask-pass
cuando 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_conf
o insertando una línea en el archivo conf.fuente