Spec-Zone.ru › Ansible 2.8

Теги

Если у вас большой плейбук, может оказаться полезным умение запускать только определённую его часть, а не всё содержимое плейбука. Ansible поддерживает атрибут «tags:» для этой цели.

При выполнении плейбука вы можете фильтровать задачи на основе тегов двумя способами:

  • В командной строке, с помощью опций --tags или --skip-tags
  • В настройках конфигурации Ansible, с помощью опций TAGS_RUN и TAGS_SKIP

Теги могут быть применены к множеству структур в Ansible (см. «Наследование тегов» ниже), но их наиболее простое применение — с отдельными задачами. Вот пример, который применяет разные теги к двум задачам:

tasks:
- yum:
    name: "{{ item }}"
    state: present
  loop:
  - httpd
  - memcached
  tags:
  - packages

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

Если вы хотите запустить только части «configuration» и «packages» очень длинного плейбука, вы можете использовать опцию --tags в командной строке:

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

С другой стороны, если вы хотите запустить плейбук без определённых задач с тегами, вы можете использовать опцию командной строки --skip-tags

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

Повторное использование тегов

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

Этот пример применяет несколько задач с одним тегом «ntp»:

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

- name: be sure ntp is installed
  yum:
    name: ntp
    state: present
  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

Наследование тегов

Добавление tags: к плейбуку или статически импортированным задачам и ролям добавляет эти теги ко всем содержащимся задачам. Это называется наследованием тегов. Наследование тегов не применяется к динамическим включениям, таким как include_role и include_tasks

Когда вы применяете атрибуты tags: к структурам, отличным от задач, Ansible обрабатывает атрибут тега, чтобы применить его ТОЛЬКО к содержащимся в них задачам. Применение тегов в местах, отличных от задач, просто удобство, чтобы вам не приходилось маркировать задачи индивидуально.

В этом примере все задачи в двух плейбуках помечены тегами. Первый плейбук имеет все свои задачи с тегом ‘bar’, а второй — с тегом ‘foo’:

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

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

Вы также можете применить теги к задачам, импортированным с помощью roles:

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

И к import_role: и import_tasks: операторам:

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

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

Все они применяют указанные теги к КАЖДОЙ задаче внутри плейбука, импортированного файла или роли, так что эти задачи можно выборочно запускать при вызове плейбука с соответствующими тегами.

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

Нет способа «импортировать только эти теги»; вы, вероятно, захотите разделить их на более мелкие роли/включения, если вам нужно такое свойство.

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

Вы можете увидеть, какие теги применены к задачам, ролям и статическим импортам, выполнив ansible-playbook с опцией --list-tasks. Вы можете отобразить все теги, применённые к задачам, с помощью опции --list-tags.

Примечание

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

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

Вот пример метки задач роли тегом mytag, используя оператор block, для последующего использования с динамическим включением:

Файл плейбука:

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

Файл задач роли:

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

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

Существует специальный тег always, который всегда выполняет задачу, если её явно не пропустить (--skip-tags always)

Пример:

tasks:
- debug:
    msg: "Always runs"
  tags:
  - always

- debug:
    msg: "runs when you use tag1"
  tags:
  - tag1

Добавлено в версии 2.5.

Другой специальный тег — never, который предотвращает выполнение задачи, если тег не запрошен явно.

Пример:

tasks:
  - debug: msg="{{ showmevar }}"
    tags: [ never, debug ]

В этом примере задача будет выполнена только тогда, когда явно запрошен тег debug или never

Есть ещё 3 специальных ключевых слова для тегов: tagged, untagged и all, которые выполняют только помеченные, только непомеченные и все задачи соответственно.

По умолчанию Ansible работает так, как будто был указан тег --tags all.

См. также

Работа с плейбуками
Введение в плейбуки
Роли
Организация плейбуков по ролям
Список рассылки пользователей
Есть вопросы? Задайте их в группе!
irc.freenode.net
Канал IRC-чата #ansible

© 2012–2018 Michael DeHaan
© 2018–2019 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.8/user_guide/playbooks_tags.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API