Este es un fragmento de un libro de jugadas que estoy usando ( server.yml
):
- name: Determine Remote User
hosts: web
gather_facts: false
roles:
- { role: remote-user, tags: [remote-user, always] }
Mi archivo de hosts tiene diferentes grupos de servidores, p. Ej.
[web]
x.x.x.x
[droplets]
x.x.x.x
Ahora quiero ejecutar ansible-playbook -i hosts/<env> server.yml
y anular hosts: web
desde server.yml
para ejecutar este libro de jugadas [droplets]
.
¿Puedo anularlo como una sola vez, sin editar server.yml
directamente?
Gracias.
ansible
ansible-playbook
luqo33
fuente
fuente
hosts: "{{ variable_host | default('web')}}"
ansible-playbook server.yml --extra-vars "variable_host=newtarget(s)"
group_vars/all
parece estar analizadas después de lahosts:
línea del libro de jugadas. Sin embargo, ¿las variables envars:
y las variables envars_files:
se analizan antes de lahosts:
línea? NOTA estoy no preguntando acerca de prioridad.-e
lugar de--extra-vars
.Para cualquiera que venga a buscar la solución.
Libro de juego
Inventario
Comando:
ansible-playbook deplyment.yml -i hosts --extra-vars "host=droplets"
para que pueda especificar el nombre del grupo en las variables extrafuente
play_hosts
y no obteniendo los resultados esperados porque olvidé queplay_hosts
es una var interna de Ansible para todos los hosts en el juego actual.Esto es un poco tarde, pero creo que podrías usar el
--limit or -l
comando para limitar el patrón a hosts más específicos. (versión 2.3.2.0)Podrías tener
- hosts: all (or group) tasks: - some_task
y entonces
ansible-playbook playbook.yml -l some_more_strict_host_or_pattern
y use la--list-hosts
bandera para ver en qué hosts se aplicaría esta configuración.fuente
limit
la lista de hosts afectados, el libro de jugadas puede causar mucho daño.--extra-vars "variable_host=newtarget(s)"
la solución aceptada es tan peligrosa como una solución más complicada. Utiliza un host predeterminadoweb
que podría aplicarse aquí también en lugar deall
. Puede usar un grupo de hosts estricto como predeterminado para evitar cometer un error y usar la--list-hosts
bandera para tener una comprensión clara de a qué hosts está afectando.--limit
(de lo contrario, afectará a todos los hosts posibles, que pueden no ser el comportamiento que desea)Usamos una tarea de falla simple para obligar al usuario a especificar la opción de límite de Ansible , de modo que no se ejecute en todos los hosts de forma predeterminada / accidental.
La forma más fácil que encontré es esta:
Ahora debemos usar la opción
-l
(=--limit
) cuando ejecutamos el libro de jugadas, por ejemploLimitar los documentos de opciones :
fuente
Estoy usando otro enfoque que no necesita ningún inventario y funciona con este simple comando:
Para realizar eso, necesita un libro de jugadas con dos jugadas:
Un ejemplo de trabajo (cópielo y ejecútelo con el comando anterior):
fuente
Cambié el mío por defecto a ningún host y tengo una verificación para detectarlo. De esa manera, el usuario o cron se ve obligado a proporcionar un solo host o grupo, etc. Me gusta la lógica del comentario de @wallydrag. los
empty_group
contiene hosts en el inventario.Luego agregue las tareas de registro:
fuente
Acabo de encontrar una solución en Google. De hecho, hay uno en Ansible 2.5. Puede especificar su archivo de inventario con
--inventory
, así:ansible --inventory configs/hosts --list-hosts all
fuente
-i INVENTORY, --inventory=INVENTORY, --inventory-file=INVENTORY specify inventory host path or comma separated host list. --inventory-file is deprecated
Si desea ejecutar una tarea que está asociada con un host, pero en un host diferente, debe probar delegate_to .
En su caso, debe delegar en su localhost (ansible master) y llamar al
ansible-playbook
comandofuente
Estoy usando ansible 2.5 (2.5.3 exactamente), y parece que el archivo vars se carga antes de que se ejecute el parámetro de hosts. Entonces puede configurar el host en un archivo vars.yml y simplemente escribir
hosts: {{ host_var }}
en su libro de jugadasPor ejemplo, en mi playbook.yml:
Y dentro de vars / project.yml:
fuente
Aquí hay una solución genial que se me ocurrió para especificar hosts de forma segura a través de la
--limit
opción. En este ejemplo, el juego terminará si el libro de jugadas se ejecutó sin ningún host especificado a través de la--limit
opción.Esto fue probado en Ansible versión 2.7.10
fuente
Otra solución es usar la variable especial
ansible_limit
que es el contenido de la--limit
opción CLI para la ejecución actual de Ansible.Si
--limit
se omite la opción, Ansible emite una advertencia, pero no hace nada ya que no coincide ningún host.fuente