Las etiquetas de Ansible se pueden usar para ejecutar solo un subconjunto de tareas / roles. Esto significa que, de forma predeterminada, todas las tareas se ejecutan y solo podemos evitar que se ejecuten algunas tareas.
¿Podemos limitar la ejecución de una tarea solo cuando se especifica la etiqueta "foo"? ¿Podemos usar etiquetas actuales en la when
sección de una tarea?
Respuestas:
Ansible 2.5 viene con etiquetas especiales
never
yalways
. La etiquetanever
se puede usar exactamente para este propósito. P.ej:En este ejemplo, la tarea solo se ejecutará cuando se solicite explícitamente la etiqueta
debug
(onever
). [Referencia sobre documentos ansibles]fuente
Aunque esta es una solución indirecta, funciona.
Dentro de la lista de tareas, registre una variable cuando se ejecute la ejecución normal. Luego, agregue una condición when que verifique esa variable a la tarea etiquetada.
fuente
untagged
para lograr esto:- set_fact: untagged_run=true
tags: untagged
No tengo suficiente reputación para votar o comentar sobre la respuesta que sugiere el uso de variables de línea de comandos (
--extra-vars
), pero tengo que agregar esto:Puede evitar el fracaso del juego en ausencia de una
--extra-vars
definición definiendo un valor predeterminado en el libro de jugadas en sí:Anular vía
--extra-vars
seguirá funcionando porque las variables definidas en la línea de comando tienen prioridad sobre todas las demás definiciones.El resultado es que la reproducción se ejecuta sin error cuando
thorough
no se cambia atrue
en la línea de comando.fuente
thorough | default('no') | bool
.when: thorough is defined and thorough
si prefiere esa sintaxisis defined and
sintaxis más. más que las múltiples tuberías que no siento son intuitivas.Puede usar condicionales para protegerse contra la ejecución accidental de tareas que de otro modo se ejecutarían si no especifica una etiqueta. La advertencia de este método es que la reproducción fallará y fallará si no define esa variable adicional.
Usando el argumento extra-vars, puede activar la ejecución de su condicional.
De ansible-playbook --help:
Ejemplo:
test.yaml:
fuente
thorough | default("false") | match("true")
. El valor predeterminado no tiene que serfalse
, simplemente cualquier cosa que no coincidatrue
, pero mejora la legibilidad.Comprobar la variable 'etiquetas' no funciona en Ansible 2.1.1.0. Vea a continuación la prueba. Tengo otra idea para ejecutar la tarea solo cuando se define una etiqueta, que funciona tanto para Ansible 1.9.X como para 2.XY:
Con eso, cuando se ejecuta el libro de jugadas sin ninguna etiqueta, la variable 'foo' se establecerá en verdadero y luego en falso, por lo que no se ejecuta nada. Si agrega la etiqueta 'barra', solo se aplicará la primera configuración, por lo que la variable 'foo' será verdadera, entonces su tarea se ejecutará. ¡Disfrutar!
Y aquí está la prueba sobre la variable 'etiquetas' en Ansible 2.1.1.0:
Aquí está el libro de jugadas:
Y aquí está el resultado:
fuente
Si. Ejecutar ansible-playbook con la
--tags foo
bandera asegurará que solofoo
se ejecuten las tareas etiquetadas . Por ejemplo, supongamos que tenemos un libro de jugadas llamado example.yml:corriendo:
Se asegurará de que solo se ejecute la tarea yum.
Entonces, en realidad no es necesario usar etiquetas en la sección when para ejecutar condicionalmente una tarea. Tenga en cuenta que, según la complejidad de sus libros de jugadas / roles, es posible que necesite usar una combinación de --tags y --skip-tags para controlar qué tareas se ejecutan. Por ejemplo, si una tarea de inclusión se etiqueta como 'foo' y alguna tarea dentro del libro de jugadas incluido se etiqueta como 'barra' y ejecuta
La tarea interna (etiquetada solo como 'barra') se ejecutará. Para evitar la ejecución de todas las tareas internas etiquetadas como 'barra', deberá ejecutar el siguiente comando
fuente
ansible-playbook
opciones correctas , pero creo que el OP está pidiendo una forma de anotar una tarea para que no se ejecute a menos que se agregue explícitamente una etiqueta específica en elansible-playbook
comando.Hay una etiqueta especial: "nunca" , que impedirá que se ejecute una tarea a menos que se solicite específicamente una etiqueta.
fuente
cuando la cláusula no puede evaluar la presencia de etiquetas. Como solución alternativa, utilizo variables y etiquetas juntas para ejecutar tareas específicas de esa etiqueta / variable.
Ej: imagina un libro de jugadas e inventario
Con este enfoque, utiliza la etiqueta para seleccionar solo las tareas en uninstall.yml, pero también necesita establecer la variable 'uninstall_links' en algo para habilitarla. Entonces, si ejecuta el libro de jugadas sin ningún parámetro, de forma predeterminada, ejecutará la tarea de instalación. Para desinstalar, puede configurar la etiqueta 'desinstalar' en su libro de jugadas (o cmdline) y DEBE configurar la variable. Si no configura la etiqueta, ejecutará todo (instalar y desinstalar) en ese orden, lo cual es bueno para probar todo el proceso.
Cómo ejecutar todo (se instalará y desinstalará):
PS
ansible-playbook -i inventory site.yml -l dev -s -k -e "uninstall_links=true"
Cómo ejecutar solo la etiqueta 'desinstalar' en el grupo de desarrollo
PS
ansible-playbook -i inventory site.yml -l dev -s -k -e "uninstall_links=true" -t uninstall
Por lo tanto, las variables y las etiquetas también pueden estar en los archivos site.yml / Inventory, lo que le permite comprometerse en su SCM y registrar su intención.
fuente
nootal es correcto, mi enfoque no funciona - ignórelo :( Ahora uso "cuando: myvar está definido" y el interruptor de línea de comando "-e" myvar = X "para ejecutar tareas solo cuando se solicita explícitamente.
Aún más fácil (al menos con ansible 2.1.1.0):
-> solo se ejecutará cuando se hayan proporcionado etiquetas Y las etiquetas incluyen "foo"
fuente
Encendido
Ansible 2.3.2.0
, aquí está mi solución al problema:Se inicia estableciendo
in_tag
aTrue
continuación, hay unaset_fact
que pone de nuevo aFalse
cuando no se especifica ningunatags
deansible-playbook
.Cuando especifica etiquetas,
in_tag
permanece enTrue
y sefail
ejecuta la tarea.PD: puedes agregar la lógica a cualquier tarea que desees
PS2: también puedes extender la lógica y codificar todas las etiquetas que tienes y
set_fact: in_tag_blah=True
en combinación con,tags: ["blah"]
por supuesto.fuente