Si tiene un libro de jugadas grande, puede ser útil ejecutar solo partes específicas del mismo en lugar de ejecutar el libro de jugadas completo. Puede hacer esto con las etiquetas Ansible. El uso de etiquetas para ejecutar u omitir tareas seleccionadas es un proceso de dos pasos:

  1. Agregue etiquetas a sus tareas, ya sea individualmente o con la herencia de etiquetas de un bloque, juego, rol o importación.
  2. Seleccione u omita etiquetas cuando ejecute su libro de jugadas.
  • Agregar etiquetas con la palabra clave tags

    • Agregar etiquetas a tareas individuales
    • Agregar etiquetas a las inclusiones
    • Herencia de etiquetas: agregar etiquetas a varias tareas

      • Agregar etiquetas a bloques
      • Agregar etiquetas a las obras
      • Agregar etiquetas a roles
      • Agregar etiquetas a las importaciones
      • Herencia de etiquetas para incluye: bloques y el apply palabra clave
  • Etiquetas especiales: siempre y nunca
  • Seleccionar u omitir etiquetas cuando ejecuta un libro de jugadas

    • Vista previa de los resultados del uso de etiquetas
    • Ejecución selectiva de tareas etiquetadas en archivos reutilizables
    • Configurar etiquetas globalmente

Agregar etiquetas con la palabra clave tags

Puede agregar etiquetas a una sola tarea o incluirlas. También puede agregar etiquetas a varias tareas definiéndolas en el nivel de un bloque, juego, rol o importación. La palabra clave tags aborda todos estos casos de uso. los tags la palabra clave siempre define etiquetas y las agrega a las tareas; no selecciona ni omite tareas para su ejecución. Solo puede seleccionar u omitir tareas basadas en etiquetas en la línea de comando cuando ejecuta un libro de jugadas. Ver Seleccionar u omitir etiquetas cuando ejecuta un libro de jugadas para más detalles.

Agregar etiquetas a tareas individuales

En el nivel más simple, puede aplicar una o más etiquetas a una tarea individual. Puede agregar etiquetas a las tareas en los libros de jugadas, en los archivos de tareas o dentro de un rol. A continuación, se muestra un ejemplo que etiqueta dos tareas con etiquetas diferentes:

tasks:-name: Install the servers
  ansible.builtin.yum:name:- httpd
    - memcached
    state: present
  tags:- packages
  - webservers

-name: Configure the service
  ansible.builtin.template:src: templates/src.j2
    dest: /etc/foo.conf
  tags:- configuration

Puede aplicar la misma etiqueta a más de una tarea individual. Este ejemplo etiqueta varias tareas con la misma etiqueta, “ntp”:

---# file: roles/common/tasks/main.yml-name: Install ntp
  ansible.builtin.yum:name: ntp
    state: present
  tags: ntp

-name: Configure ntp
  ansible.builtin.template:src: ntp.conf.j2
    dest: /etc/ntp.conf
  notify:- restart ntpd
  tags: ntp

-name: Enable and run ntpd
  ansible.builtin.service:name: ntpd
    state: started
    enabled: yes
  tags: ntp

-name: Install NFS utils
  ansible.builtin.yum:name:- nfs-utils
    - nfs-util-lib
    state: present
  tags: filesharing

Si ejecutó estas cuatro tareas en un libro de jugadas con --tags ntp, Ansible ejecutaría las tres tareas etiquetadas ntp y omita la única tarea que no tiene esa etiqueta.

Agregar etiquetas a las inclusiones

Puede aplicar etiquetas a inclusiones dinámicas en un libro de jugadas. Al igual que con las etiquetas de una tarea individual, las etiquetas de una include_* La tarea se aplica solo a la inclusión en sí, no a ninguna tarea dentro del archivo o rol incluido. Si agrega mytag a una inclusión dinámica, luego ejecute ese libro de jugadas con --tags mytag, Ansible ejecuta el include en sí mismo, ejecuta cualquier tarea dentro del archivo incluido o rol etiquetado con mytagy omite cualquier tarea dentro del archivo o rol incluido sin esa etiqueta. Ver Ejecución selectiva de tareas etiquetadas en archivos reutilizables para más detalles.

Agrega etiquetas a incluye de la misma manera que agrega etiquetas a cualquier otra tarea:

---# file: roles/common/tasks/main.yml-name: Dynamic re-use of database tasks
  include_tasks: db.yml
  tags: db

Puede agregar una etiqueta solo a la inclusión dinámica de un rol. En este ejemplo, el foo etiqueta será not aplicar a tareas dentro del bar papel:

----hosts: webservers
  tasks:-name: Include the bar role
      include_role:name: bar
      tags:- foo

Con jugadas, bloques, el role palabra clave y static importa, Ansible aplica la herencia de etiquetas, agregando las etiquetas que usted define a cada tarea dentro de la obra, bloque, rol o archivo importado. Sin embargo, la herencia de etiquetas no no aplicar a la reutilización dinámica con include_role y include_tasks. Con la reutilización dinámica (inclusiones), las etiquetas que defina se aplican solo a la inclusión en sí. Si necesita herencia de etiquetas, use un static importar. Si no puede utilizar una importación porque el resto de los usos de su libro de jugadas incluye, consulte Herencia de etiquetas para incluye: bloques y la palabra clave aplicar para encontrar formas de evitar este comportamiento.

Herencia de etiquetas: agregar etiquetas a varias tareas

Si desea aplicar la misma etiqueta o etiquetas a varias tareas sin agregar una tags línea a cada tarea, puede definir las etiquetas al nivel de su juego o bloque, o cuando agrega un rol o importa un archivo. Ansible aplica las etiquetas a lo largo de la cadena de dependencia a todas las tareas secundarias. Con roles e importaciones, Ansible agrega las etiquetas establecidas por el roles sección o importar a cualquier etiqueta establecida en tareas individuales o bloques dentro del rol o archivo importado. Esto se llama herencia de etiquetas. La herencia de etiquetas es conveniente, porque no es necesario etiquetar todas las tareas. Sin embargo, las etiquetas se siguen aplicando a las tareas de forma individual.

Agregar etiquetas a bloques

Si desea aplicar una etiqueta a muchas, pero no a todas, las tareas de su juego, utilice un cuadra y definir las etiquetas en ese nivel. Por ejemplo, podríamos editar el ejemplo de NTP que se muestra arriba para usar un bloque:

# myrole/tasks/main.ymltasks:-name: ntp tasks
  tags: ntp
  block:-name: Install ntp
    ansible.builtin.yum:name: ntp
      state: present

  -name: Configure ntp
    ansible.builtin.template:src: ntp.conf.j2
      dest: /etc/ntp.conf
    notify:- restart ntpd

  -name: Enable and run ntpd
    ansible.builtin.service:name: ntpd
      state: started
      enabled: yes

-name: Install NFS utils
  ansible.builtin.yum:name:- nfs-utils
    - nfs-util-lib
    state: present
  tags: filesharing

Agregar etiquetas a las obras

Si todas las tareas de una obra deben tener la misma etiqueta, puede agregar la etiqueta al nivel de la obra. Por ejemplo, si tuvieras una jugada con solo las tareas NTP, podrías etiquetar toda la jugada:

-hosts: all
  tags: ntp
  tasks:-name: Install ntp
    ansible.builtin.yum:name: ntp
      state: present

  -name: Configure ntp
    ansible.builtin.template:src: ntp.conf.j2
      dest: /etc/ntp.conf
    notify:- restart ntpd

  -name: Enable and run ntpd
    ansible.builtin.service:name: ntpd
      state: started
      enabled: yes

-hosts: fileservers
  tags: filesharing
  tasks:...

Agregar etiquetas a roles

Hay tres formas de agregar etiquetas a los roles:

  1. Agregue la misma etiqueta o etiquetas a todas las tareas del rol configurando etiquetas en roles. Vea ejemplos en esta sección.
  2. Agregue la misma etiqueta o etiquetas a todas las tareas en el rol estableciendo etiquetas en un static import_role en su libro de jugadas. Ver ejemplos en Agregar etiquetas a las importaciones.
  3. Agregue una etiqueta o etiquetas a tareas o bloques individuales dentro del rol en sí. Este es el único enfoque que le permite seleccionar u omitir algunas tareas dentro del rol. Para seleccionar u omitir tareas dentro del rol, debe tener etiquetas configuradas en tareas o bloques individuales, use la dinámica include_role en su libro de jugadas y agregue la misma etiqueta o etiquetas a la inclusión. Cuando usa este enfoque y luego ejecuta su libro de jugadas con --tags foo, Ansible ejecuta el include en sí mismo más cualquier tarea en el rol que también tenga la etiqueta foo. Ver Agregar etiquetas a las inclusiones para detalles.

Cuando incorporas un rol en tu libro de jugadas de forma estática con el roles palabra clave, Ansible agrega cualquier etiqueta que defina a todas las tareas en el rol. Por ejemplo:

roles:-role: webserver
    vars:port:5000tags:[ web, foo ]

o:

----hosts: webservers
  roles:-role: foo
      tags:- bar
        - baz
    # using YAML shorthand, this is equivalent to:# -  role: foo, tags: ["bar", "baz"] 

Agregar etiquetas a las importaciones

También puede aplicar una etiqueta o etiquetas a todas las tareas importadas por el static import_role y import_tasks declaraciones:

----hosts: webservers
  tasks:-name: Import the foo role
      import_role:name: foo
      tags:- bar
        - baz

    -name: Import tasks from foo.yml
      import_tasks: foo.yml
      tags:[ web, foo ]

Herencia de etiquetas para incluye: bloques y el apply palabra clave

De forma predeterminada, Ansible no se aplica herencia de etiquetas para reutilización dinámica con include_role y include_tasks. Si agrega etiquetas a una inclusión, se aplican solo a la inclusión en sí, no a ninguna tarea en el archivo o rol incluido. Esto le permite ejecutar tareas seleccionadas dentro de un rol o archivo de tareas; consulte Ejecución selectiva de tareas etiquetadas en archivos reutilizables cuando ejecuta su libro de jugadas.

Si desea la herencia de etiquetas, probablemente desee utilizar importaciones. Sin embargo, el uso de inclusiones e importaciones en un solo libro de jugadas puede generar errores difíciles de diagnosticar. Por esta razón, si su libro de jugadas usa include_* para reutilizar roles o tareas, y necesita la herencia de etiquetas en una inclusión, Ansible ofrece dos soluciones. Puedes usar el apply palabra clave:

-name: Apply the db tag to the include and to all tasks in db.yaml
  include_tasks:file: db.yml
    # adds 'db' tag to tasks within db.ymlapply:tags: db
  # adds 'db' tag to this 'include_tasks' itselftags: db

O puedes usar un bloque:

-block:-name: Include tasks from db.yml
     include_tasks: db.yml
  tags: db

Etiquetas especiales: siempre y nunca

Ansible reserva dos nombres de etiquetas para un comportamiento especial: siempre y nunca. Si asigna el always etiqueta a una tarea o juego, Ansible siempre ejecutará esa tarea o juego, a menos que lo omitas específicamente (--skip-tags always).

Por ejemplo:

tasks:-name: Print a message
  ansible.builtin.debug:msg:"Always runs"tags:- always

-name: Print a message
  ansible.builtin.debug:msg:"runs when you use tag1"tags:- tag1

Advertencia

  • La recopilación de datos está etiquetada con “siempre” de forma predeterminada. Solo se omite si aplica una etiqueta y luego usa una etiqueta diferente en --tags o la misma etiqueta en --skip-tags.

Nuevo en la versión 2.5.

Si asigna el never etiqueta a una tarea o juego, Ansible se saltará esa tarea o juego a menos que usted lo solicite específicamente (--tags never).

Por ejemplo:

tasks:-name: Run the rarely-used debug task
    ansible.builtin.debug:msg:' showmevar 'tags:[ never, debug ]

La tarea de depuración que se usa con poca frecuencia en el ejemplo anterior solo se ejecuta cuando solicita específicamente la debug o never etiquetas.

Seleccionar u omitir etiquetas cuando ejecuta un libro de jugadas

Una vez que haya agregado etiquetas a sus tareas, incluye, bloques, juegos, roles e importaciones, puede ejecutar u omitir tareas de manera selectiva en función de sus etiquetas cuando ejecuta ansible-playbook. Ansible ejecuta u omite todas las tareas con etiquetas que coinciden con las etiquetas que pasa en la línea de comando. Si ha agregado una etiqueta en el nivel de bloque o de juego, con roles, o con una importación, esa etiqueta se aplica a todas las tareas dentro del bloque, juego, rol o rol o archivo importado. Si tiene un rol con muchas etiquetas y desea llamar a subconjuntos del rol en diferentes momentos, úsalo con incluye dinámicaso dividir el rol en varios roles.

ansible-playbook ofrece cinco opciones de línea de comandos relacionadas con etiquetas:

  • --tags all – ejecutar todas las tareas, ignorar las etiquetas (comportamiento predeterminado)
  • --tags [tag1, tag2] – ejecutar solo tareas con las etiquetas tag1 y tag2
  • --skip-tags [tag3, tag4] – ejecutar todas las tareas excepto aquellas con las etiquetas tag3 y tag4
  • --tags tagged – ejecutar solo tareas con al menos una etiqueta
  • --tags untagged – ejecutar solo tareas sin etiquetas

Por ejemplo, para ejecutar solo tareas y bloques etiquetados configuration y packages en un libro de jugadas muy largo:

ansible-playbook example.yml --tags "configuration,packages"

Para ejecutar todas las tareas excepto las etiquetadas packages:

ansible-playbook example.yml --skip-tags "packages"

Vista previa de los resultados del uso de etiquetas

Cuando ejecuta un rol o un libro de jugadas, es posible que no sepa o recuerde qué tareas tienen qué etiquetas, o qué etiquetas existen en absoluto. Ansible ofrece dos indicadores de línea de comandos para ansible-playbook que lo ayudan a administrar los libros de jugadas etiquetados:

  • --list-tags – generar una lista de etiquetas disponibles
  • --list-tasks – cuando se usa con --tags tagname o --skip-tags tagname, generar una vista previa de las tareas etiquetadas

Por ejemplo, si no sabe si la etiqueta para las tareas de configuración es config o conf en un libro de jugadas, rol o archivo de tareas, puede mostrar todas las etiquetas disponibles sin ejecutar ninguna tarea:

ansible-playbook example.yml --list-tags

Si no sabe qué tareas tienen las etiquetas configuration y packages, puede pasar esas etiquetas y agregar --list-tasks. Ansible enumera las tareas pero no ejecuta ninguna de ellas.

ansible-playbook example.yml --tags "configuration,packages" --list-tasks

Estos indicadores de línea de comandos tienen una limitación: no pueden mostrar etiquetas o tareas dentro de archivos o roles incluidos dinámicamente. Ver Comparación de inclusiones e importaciones: dinámicas y static reutilizar para obtener más información sobre las diferencias entre static importaciones e incluye dinámicas.

Ejecución selectiva de tareas etiquetadas en archivos reutilizables

Si tiene un rol o un archivo de tareas con etiquetas definidas en el nivel de tarea o bloque, puede ejecutar u omitir selectivamente esas tareas etiquetadas en un libro de jugadas. si usa una inclusión dinámica en lugar de una static importar. Debe utilizar la misma etiqueta en las tareas incluidas y en la propia declaración de inclusión. Por ejemplo, puede crear un archivo con algunas tareas etiquetadas y otras sin etiquetar:

# mixed.ymltasks:-name: Run the task with no tags
  ansible.builtin.debug:msg: this task has no tags

-name: Run the tagged task
  ansible.builtin.debug:msg: this task is tagged with mytag
  tags: mytag

-block:-name: Run the first block task with mytag
    ...-name: Run the second block task with mytag
    ...tags:- mytag

Y puede incluir el archivo de tareas anterior en un libro de jugadas:

# myplaybook.yml-hosts: all
  tasks:-name: Run tasks from mixed.yml
    include_tasks:name: mixed.yml
    tags: mytag

Cuando ejecuta el libro de jugadas con ansible-playbook -i hosts myplaybook.yml --tags "mytag", Ansible omite la tarea sin etiquetas, ejecuta la tarea individual etiquetada y ejecuta las dos tareas en el bloque.

Configurar etiquetas globalmente

Si ejecuta u omite determinadas etiquetas de forma predeterminada, puede utilizar el TAGS_RUN y TAGS_SKIP opciones en la configuración de Ansible para establecer esos valores predeterminados.

Ver también

Introducción a los libros de jugadas

Introducción a los libros de jugadas

Roles

Organización del libro de jugadas por roles

Lista de correo de usuarios

¿Tengo una pregunta? ¡Pasa por el grupo de google!

irc.freenode.net

Canal de chat de IRC #ansible