Mi colega y yo usamos Ansible para administrar un grupo de servidores.
Usamos el archivo .ansible.cfg en nuestros directorios de inicio locales para configurar nuestros entornos locales y mantener nuestros libros de jugadas en un repositorio de git.
Al autenticarme en servidores, yo uso el usuario1 y él usa el usuario2. El 95% de nuestros servidores tienen estas cuentas, pero históricamente, algunos servidores solo tienen una cuenta de "usuario".
Estamos usando host_vars para configurar la variable remote_user para la minoría de servidores en cuestión.
Sin embargo, en nuestros manuales, generalmente usamos "todos" para estipular a qué servidores queremos acceder y usamos el parámetro --limit en la línea de comando para especificar exactamente qué servidores deben recibir la actualización. Nuestra granja de servidores es un legado de servidores mal diseñados que deben mantenerse en línea hasta que se retiren dentro de unos años, y hemos descubierto que este enfoque se adapta mejor a nuestras necesidades.
Nuestro problema es que nuestro parámetro usuario_remoto está configurado en nuestro archivo .ansible.cfg, donde se expone como una variable de entorno en lugar de una variable de script.
Eso significa que si nuestra tarea contiene:
remote_user: "{{ remote_user }}"
Sólo funcionará para hosts para los cuales esa variable esté definida
Para el 95% de los hosts para los que no definimos esta variable, la tarea falla.
¿Hay alguna manera de usar la variable solo si está definida?
p.ej
Si usuario_remoto está definido, úselo; si no, use la variable de entorno establecida en .ansible.cfg
Nota: sé que puedo usar:
- name: Do something
remote_user: "{{ remote_user }}"
when: remote_user is defined
En una definición de tarea, pero eso solo se aplicará a esa tarea y no quiero tener que actualizar todas las tareas.
Cuando realmente necesito es que esa condición esté disponible en la definición de hosts, es decir:
---
- hosts: all
remote_user: "{{ remote_user }}"
when: remote_user is defined
Pero eso es ilegal en Ansible.
Respuesta1
Como de costumbre, después de pasar 2 horas posponiendo hacer la pregunta aquí, ¡encuentro la respuesta 5 minutos después de publicar la pregunta!
Es realmente simple. Para configurar un usuario_remoto diferente para sistemas individuales sin tener que aplicar muchos trucos a los libros de estrategias existentes, simplemente agregue la var al host en su inventario:
[web_servers]
server1 ansible_ssh_user=user
server2
En este caso, cada vez que una reproducción incluya el servidor1, se utilizará "usuario" como usuario ssh. Para el servidor2, se utilizará el valor de usuario_remoto de su archivo ansible.cfg (por ejemplo, usuario1, usuario2, etc., según el entorno local).