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.ymly anular hosts: webdesde server.ymlpara ejecutar este libro de jugadas [droplets].
¿Puedo anularlo como una sola vez, sin editar server.ymldirectamente?
Gracias.
ansible
ansible-playbook
luqo33
fuente
fuente

hosts: "{{ variable_host | default('web')}}"ansible-playbook server.yml --extra-vars "variable_host=newtarget(s)"group_vars/allparece 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.-elugar 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_hostsy no obteniendo los resultados esperados porque olvidé queplay_hostses 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 -lcomando 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_tasky entonces
ansible-playbook playbook.yml -l some_more_strict_host_or_patterny use la--list-hostsbandera para ver en qué hosts se aplicaría esta configuración.fuente
limitla 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 predeterminadowebque 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-hostsbandera 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_groupcontiene hosts en el inventario.- hosts: "{{variable_host | predeterminado ('grupo_vacío')}}"Luego agregue las tareas de registro:
Tareas: - nombre: script de error si falta el parámetro de host variable requerido fallar: msg: "Tienes que agregar el --extra-vars = 'variable_host ='" cuando: (variable_host no está definido) o (variable_host == "")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 allfuente
-i INVENTORY, --inventory=INVENTORY, --inventory-file=INVENTORY specify inventory host path or comma separated host list. --inventory-file is deprecatedSi 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-playbookcomandofuente
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
--limitopción. En este ejemplo, el juego terminará si el libro de jugadas se ejecutó sin ningún host especificado a través de la--limitopción.Esto fue probado en Ansible versión 2.7.10
fuente
Otra solución es usar la variable especial
ansible_limitque es el contenido de la--limitopción CLI para la ejecución actual de Ansible.Si
--limitse omite la opción, Ansible emite una advertencia, pero no hace nada ya que no coincide ningún host.fuente