Как использовать теги в 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