Spec-Zone.ru › Ansible 2.7

Теги

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

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

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

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

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

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

Если вы хотите запустить только часть «настройка» и «пакеты» очень длинного плейбука, вы можете использовать опцию --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: 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

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

Добавление 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.7/user_guide/playbooks_tags.html

Spec-Zone.ru

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