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 whensección de una tarea?

Respuestas:
Ansible 2.5 viene con etiquetas especiales
neveryalways. La etiquetaneverse 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
untaggedpara lograr esto:- set_fact: untagged_run=truetags: untaggedNo 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-varsdefinición definiendo un valor predeterminado en el libro de jugadas en sí:Anular vía
--extra-varsseguirá 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
thoroughno se cambia atrueen la línea de comando.fuente
thorough | default('no') | bool.when: thorough is defined and thoroughsi prefiere esa sintaxisis defined andsintaxis 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 foobandera asegurará que solofoose 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-playbookopciones 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-playbookcomando.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
# inventario [dev] 192.168.1.1 # site.yml - hosts: dev roles: - {rol: común} y en común / tareas / main.yml # roles / common / tareas / main.yaml - nombre: Instalar enlaces apt: nombre = estado de enlaces = presente - incluye: uninstall.yml cuando: uninstall_links está definido etiquetas: - desinstalar # roles / common / tareas / uninstall.yml - nombre: desinstalar enlaces apt: nombre = estado de los enlaces = ausenteCon 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 uninstallPor 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_tagaTruecontinuación, hay unaset_factque pone de nuevo aFalsecuando no se especifica ningunatagsdeansible-playbook.Cuando especifica etiquetas,
in_tagpermanece enTruey sefailejecuta 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=Trueen combinación con,tags: ["blah"]por supuesto.fuente