Поиск по сайту:

Как использовать теги в Ansible Playbooks

Использование тегов для управления выполнением задач в Ansible Playbooks

В этой статье мы узнаем, что такое теги Ansible и эффективные способы использования тегов в сборниках сценариев Ansible для выполнения только определенных задач.

Что такое теги Ansible?

Когда вы запускаете плейбук, ansible будет читать плейбук сверху вниз и запускать задачи одну за другой. Иногда нам может потребоваться выполнить только определенные задачи. В таких случаях Теги Ansible позволяют запускать или пропускать задачи по вашему желанию.

Для создания тегов следует использовать теги ключевых слов. Теги можно создавать для пьес, отдельных задач, блоков, импорта и ролей.

Теги Ansible уровня задач

Взгляните на книгу по управлению пакетами apt ниже, где я создал две задачи. Обе задачи помечены тегами ключевое слово tags.

- name: Package Installation
  hosts: ubuntu.anslab.com
  gather_facts: false
  become: true

  tasks:

    - name: Updating cache ( sudo apt update )
      apt:
        update_cache: true
      tags: cache_update

    - name: Remove packages - no dependency
      apt:
        autoremove: yes
      tags: remove

Если я запущу эту книгу, ничего, связанного с тегами, не произойдет, и ansible выполнит все задачи как обычно сверху вниз. Вы должны указать ansible, какую задачу с определенным тегом следует запускать, а какую следует пропустить.

Вместе с командой ansible-playbook используйте флаг --tags или -t. и передайте имя тега для запуска только этой конкретной задачи.

ansible-playbook tags_testing.yml --tags <tag names>
ansible-playbook tags_testing.yml --tags cache_update

Пример вывода:

PLAY [Package Installation] ****************************************************************************************************************

TASK [Updating cache ( sudo apt update )] **************************************************************************************************
changed: [ubuntu.anslab.com]

PLAY RECAP *********************************************************************************************************************************
ubuntu.anslab.com          : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

Вы также можете передать более одного тега флагу --tags, разделив значения запятыми.

ansible-playbook tags_testing.yml --tags "cache_update,remove"

Пример вывода:

PLAY [Package Installation] ****************************************************************************************************************

TASK [Updating cache ( sudo apt update )] **************************************************************************************************
changed: [ubuntu.anslab.com]

TASK [Remove packages - no dependency] *****************************************************************************************************
ok: [ubuntu.anslab.com]

PLAY RECAP *********************************************************************************************************************************
ubuntu.anslab.com          : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 

Чтобы пропустить определенные теги и запустить все остальные, вы можете использовать флаг --skip-tags. Аналогично, вы также можете передать несколько тегов в качестве аргументов, разделив их запятыми и флагом --skip-tags.

ansible-playbook tags_testing.yml --skip-tags cache_update
ansible-playbook tags_testing.yml --skip-tags "cache_update,remove"  # MULTIPLE TAGS

Пример вывода:

PLAY [Package Installation] ****************************************************************************************************************

TASK [Remove packages - no dependency] *****************************************************************************************************
ok: [ubuntu.anslab.com]

PLAY RECAP *********************************************************************************************************************************
ubuntu.anslab.com          : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

Мульти-тегирование

К задаче можно присвоить несколько имен, используя формат списка YAML. Если вы видите приведенную ниже схему, к обеим задачам добавляется второй тег (т. е. pkg_mt).

 tasks:

    - name: Updating cache ( sudo apt update )
      apt:
        update_cache: true
      tags: 
          - cache_update
          - pkg_mt

    - name: Remove packages - no dependency
      apt:
        autoremove: yes
      tags: 
          - remove
          - pkg_mt

Вы также можете использовать нотацию списка Python для создания нескольких тегов.

 tasks:

    - name: Updating cache ( sudo apt update )
      apt:
        update_cache: true
      tags: ["cache_update", "pkg_mt"]

    - name: Remove packages - no dependency
      apt:
        autoremove: yes
      tags: ["remove", "pkg_mt"]

Теперь запустите плейбук:

ansible-playbook tags_testing.yml --tags pkg_mt

Пример вывода:

PLAY [Package Installation] ****************************************************************************************************************

TASK [Updating cache ( sudo apt update )] **************************************************************************************************
changed: [ubuntu.anslab.com]

TASK [Remove packages - no dependency] *****************************************************************************************************
ok: [ubuntu.anslab.com]

PLAY RECAP *********************************************************************************************************************************
ubuntu.anslab.com          : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

Получить информацию о тегах

Чтобы получить список тегов из книги воспроизведения, вы можете использовать флаг --list-tags.

ansible-playbook tags_testing.yml --list-tags

playbook: tags_testing.yml

  play #1 (ubuntu.anslab.com): Package Installation    TAGS: [pkg_mt]
      TASK TAGS: [cache_update, pkg_mt, remove]

Чтобы получить список задач с определенными тегами, вы можете объединить флаги --tags и --list-tasks.

ansible-playbook tags_testing.yml --list-tasks --tags remove

playbook: tags_testing.yml

  play #1 (ubuntu.anslab.com): Package Installation    TAGS: [pkg_mt]
    tasks:
      Remove packages - no dependency    TAGS: [pkg_mt, remove]

Вы также можете использовать только тег --list-tasks, который будет печатать как имена тегов, так и имена задач/воспроизведений.

ansible-playbook tags_testing.yml --list-tasks

playbook: tags_testing.yml

  play #1 (ubuntu.anslab.com): Package Installation    TAGS: [pkg_mt]
    tasks:
      Updating cache ( sudo apt update )    TAGS: [cache_update, pkg_mt]
      Remove packages - no dependency    TAGS: [pkg_mt, remove]

Теги уровней игры

Теги также можно применять на уровне игры. Этот тег будет унаследован всеми задачами в игре. В приведенном ниже плейбуке я добавил в плей тег pkg_mt.

- name: Package Installation
  hosts: ubuntu.anslab.com
  gather_facts: false
  become: true
  tags: pkg_mt

  tasks:

    - name: Updating cache ( sudo apt update )
      apt:
        update_cache: true
      tags: cache_update

    - name: Remove packages - no dependency
      apt:
        autoremove: yes
      tags: remove

Вы можете запустить --list-tasks и увидеть, что тег "pkg_mt" наследуется всеми задачами в игре.

ansible-playbook tags_testing.yml --list-tasks

playbook: tags_testing.yml

  play #1 (ubuntu.anslab.com): Package Installation    TAGS: [pkg_mt]
    tasks:
      Updating cache ( sudo apt update )    TAGS: [cache_update, pkg_mt]
      Remove packages - no dependency    TAGS: [pkg_mt, remove]

Специальные теги

Есть два специальных тега: Always и Never.

  • ВСЕГДА — всегда запускайте задачу, если только вы явно не используете --skip-tags, чтобы остановить выполнение задачи.
  • НИКОГДА — задача никогда не будет запущена, если вы явно не используете флаг --tags для ее запуска.

В любом случае, если вы хотите пропустить задачи, помеченные тегом "всегда", вам придется использовать теги пропуска.

ansible-playbook tags_testing --skip-tags always

В любом случае, если вы хотите запускать задачи, помеченные тегом "никогда", явно передайте его флагу --tags.

ansible-playbook tags_testing --tags never

Тег против Untag

Playbook может состоять из задач с тегами и без тегов. Вы можете выбрать запуск задач без тегов или хотя бы с одним или несколькими тегами.

Чтобы запускать задачи без тегов, передайте без тегов флаг --tags. Таким образом, ansible будет проверять и запускать задачи, которым в плейбуке не сопоставлены теги.

ansible-playbook tags_testing --tags untagged

Чтобы запустить задачи, которым сопоставлен хотя бы один тег, передайте tagged в флаг --tags.

ansible-playbook tags_testing --tags tagged

Применить теги к блокам

Блоки позволяют логически группировать задачи. Block-rescue-always используются для обработки исключений в ansible. Вместо применения тегов к каждой задаче в игре вы можете группировать задачи по блокам и применять теги к блокам.

Ниже приведен псевдокод для запуска сценария оболочки и отправки электронного письма. Здесь я применил тег "pipeline" на уровне блока. Когда я запускаю playbook с тегом конвейера, все задачи в блоке будут выполняться.

- block:

   - name: Trigger Pipeline script
     script: /home/dev/project1/trigger_pipeline.sh

   - name: Send email to dev team
     mail:
       host: smtp.dummy.com
       port: 587
       username: username@dummy.com
       to: devteam@dummy.com
       subject: Pipeline triggered.
       body: Input file generated for today. Pipeline triggered.
     delegate_to: localhost


 tags: pipeline

Заключение

В этой статье мы обсудили, что такое теги Ansible и как использовать теги на уровне игры и задачи в сборнике пьес. Мы также узнали о предопределенных тегах «всегда» и «никогда» и о том, как их использовать в сборнике сценариев. Наконец, мы рассмотрели, как использовать теги с блоками.

Теги могут показаться базовой концепцией, но они очень полезны для группировки задач и позволяют нам структурировать сборник сценариев таким образом, чтобы мы могли контролировать, какая задача должна выполняться и как она должна выполняться.

Ресурс:

  • Официальная документация по тегам Ansible

Статьи по данной тематике