Tags Ansible

Tags

Si vous avez un grand livre de jeu, il peut s’avérer utile de ne pouvoir en exécuter qu’une partie spécifique plutôt que de tout lire dans le livre. Ansible prend en charge un attribut «tags:» pour cette raison.

Lorsque vous exécutez un livre de jeu, vous pouvez filtrer les tâches en fonction des “tags” de deux manières:

  • Sur la ligne de commande, avec les options --tags ou --skip-tags
  • Dans les paramètres de configuration Ansible, avec les options TAGS_RUN et TAGS_SKIP

Les “tags” peuvent être appliqués à de nombreuses structures dans Ansible :

  • tasks:
  • roles:
  • blocks:
  • import_roles:
  • import_tasks:

Mais son utilisation la plus simple est avec des tâches individuelles. Voici un exemple qui balise deux tâches avec des “tags” différentes:

tasks:
  - yum:
      name:
        - httpd
        - memcached
      state: installed
    tags:
     - packages

  - template:
      src: templates/src.j2
      dest: /etc/foo.conf
    tags:
      - configuration

Si vous souhaitez simplement exécuter les parties “configuration” et “packages” d’un très long livre de jeu, vous pouvez utiliser l’option --tags sur la ligne de commande :

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

Si vous souhaitez exécuter un livre de jeu sans certaines tâches marquées, vous pouvez utiliser l’option de ligne de commande --skip-tags :

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

Réutilisation des tags

Vous pouvez appliquer le même “tag” à plusieurs tâches. Lors de l’exécution d’une livre de jeu à l’aide de l’option de ligne de commande --tags, toutes les tâches portant ce nom de “tag” seront exécutées. Cet exemple balise plusieurs tâches avec un “tag” “ntp” :

---
# file: roles/common/tasks/main.yml

- name: be sure ntp is installed
  yum:
    name: ntp
    state: installed
  tags: ntp

- name: be sure ntp is configured
  template:
    src: ntp.conf.j2
    dest: /etc/ntp.conf
  notify:
    - restart ntpd
  tags: ntp

- name: be sure ntpd is running and enabled
  service:
    name: ntpd
    state: started
    enabled: yes
  tags: ntp

Héritage des tags

On peut ajouter des “tags” à un jeu ou à des rôles ou des tâches importées statiquement. Toutes leurs tâches hériterons des ces “tags”.

L’héritage des “tags” ne s’applique pas aux inclusions dynamiques comme include_role et include_tasks.

On peut aussi appliquer des tags aux autres structures que les tâches mais retenons que ces “tags” sont fondamentalement appliqués aux tâches.

Cet exemple identifie toutes les tâches des deux jeux. La première partie dispose de toutes les tâches étiquetées avec “bar”, et la seconde toutes les tâches étiquetées avec “foo” :

- hosts: all
  tags:
    - bar
  tasks:
    ...

- hosts: all
  tags: ['foo']
  tasks:
    ...

On peut aussi appliquer les “tags” aux tâches importées par des rôles :

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

Ainsi que sur les directives import_role: et import_tasks: :

- import_role:
    name: myrole
  tags: [web,foo]

- import_tasks: foo.yml
  tags: [web,foo]

Ces “tags” sont appliqués aux tâches par héritage. Cela sert à exécuter un livre de jeu de manière sélective.

Les “tags” sont appliqués tout au long de la chaîne de dépendance. Pour qu’un “tag” soit hérité des tâches d’un rôle dépendant, il doit être appliqué à la déclaration de rôle ou à l’importation statique, et non à toutes les tâches du rôle.

Vous pouvez voir quelles “tags” sont appliqués aux tâches, aux rôles et aux importations statiques en exécutant ansible-playbook avec l’option --list-tasks. Vous pouvez afficher toutes les balises appliquées aux tâches avec l’option --list-tags.

L’héritage ne fonctionnant pas avec include_tasks, include_roles et les autres “includes” dynamiques, ceux-ci doivent être appliqués sur chaque tâche ou sur des blocks:

Voici un exemple de marquage de tâches de rôle avec le “tag” “mytag”, à l’aide d’une instruction de bloc, à utiliser ensuite avec un “include” dynamique:

- hosts: all
  tasks:
  - include_role:
      name: myrole
    tags: mytag
Role tasks file:

- block:
    - name: First task to run
    ...
    - name: Second task to run
    ...
  tags:
    - mytag

Tags spéciaux

  • “always” : toujours exécuté tant qu’il n’est explicitement évité (--skip-tags always)
  • “never” : jamais exécuté tant qu’il n’est explicitement exécuté (--tags never)
  • “tagged” : exécute uniquement les tâches balisées
  • “untagged” : exécute les tâches qui ne sont pas balisées uniquement.
  • “all” : exécute toutes les tâches balisées ou non

Note : Ansible fonctionne par défaut comme si --tags all était précisé.