Вопрос: Ответ: Выполнять задачу только при указании тега


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

Можем ли мы ограничить выполнение задачи? только когда указан тег «foo»? Можем ли мы использовать текущие теги в when раздел задачи?


53
2017-08-24 10:08


Источник


это похоже на то, что вам нужно - это установить некоторые задачи, такие как limit_to_tags: foo, которого нет, и я не думаю, что это возможно сейчас. В будущей реализации также должен быть план по объединению И или ИЛИ этих тегов. - dgh
Взгляните на мой anwser в разделе «Ansible - Default / Explicit Tags» stackoverflow.com/questions/28789912/... - sirkubax


Ответы:


Хотя это круговое решение, оно работает.

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

- shell: /bin/true
  register: normal_task_list

- name: Only run when tag is specified
  shell: /bin/echo "Only running because of specified tag"
  when: normal_task_list is not defined
  tags: specified

19
2018-01-13 16:25



действительно хорошая идея - perigee
Вы также можете использовать untagged для этого: - set_fact: untagged_run=true  tags: untagged - Pyzo
Не могли бы вы объяснить немного больше об этом? Реальный пример? - Quintin Par


У меня нет достаточной репутации, чтобы повысить или прокомментировать ответ, предполагающий использование переменных командной строки (--extra-vars), но у меня есть это, чтобы добавить к нему:

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

Вы можете предотвратить проигрыш при отсутствии --extra-vars определяя значение по умолчанию в самой книге воспроизведения:

---
- hosts: ...
# ↓↓↓
  vars:
    thorough: false
# ↑↑↑
  tasks:
  - name: apt - install nfs-common only when thorough is true
    when: thorough | bool
    apt:
      cache_valid_time: 86400
      force: yes
      pkg:
        - nfs-common

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

В результате игра проходит без ошибок, когда thorough не изменяется на true в командной строке.


17
2018-05-08 01:17



То же самое можно достичь, используя thorough | default('no') | bool, - Costi Ciudatu
Или when: thorough is defined and thorough если вы предпочитаете этот синтаксис - KCD
Спасибо, любите is defined and синтаксис больше. больше, чем несколько труб, которые я не чувствую, интуитивно понятны. - Elijah Lynn


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

Используя аргумент extra-vars, вы можете инициировать выполнение вашего условного выражения.

Из прослушиваемой книги --help:

 -e EXTRA_VARS, --extra-vars=EXTRA_VARS
    set additional variables as key=value or YAML/JSON

Пример:

ansible-playbook test.yaml -e "thorough=true"

test.yaml:

...
- name: apt - install nfs-common only when thorough is true
  apt:
    cache_valid_time: 86400
    force: yes
    pkg:
    - nfs-common
  when: thorough | match("true")
...

9
2018-03-12 20:51



Чтобы избежать ошибки, если вы не определяете «тщательный», просто используйте thorough | default("false") | match("true"), По умолчанию не нужно false, просто ничего, что не соответствует true, но улучшает читаемость. - Tom Wilson


Ansible 2.5 поставляется с специальными тегами never а также always, Тег never может использоваться именно для этой цели. Например:

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

В этом примере задача будет выполняться только тогда, когда debug (или never) явно запрашивается. [Ссылка на доступные документы]


7
2018-04-12 10:58





Да. Запуск загрузочной книги с --tags foo флаг гарантирует, что только те задачи, которые отмечены foo выполняются. Например, предположим, что у нас есть playbook, называемый example.yml:

tasks:

  - yum: name={{ item }} state=installed
    with_items:
       - httpd
       - memcached
    tags:
       - packages

  - name: some other task
    ..
    tags:
      - some other tag

Бег:

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

Убедитесь, что выполняется только задание yum.

Так что на самом деле вам не нужно использовать теги в разделе, чтобы условно выполнить задачу. Обратите внимание, что в зависимости от сложности ваших игровых автоматов / ролей вам может понадобиться использовать комбинацию -tags и -skip-тегов для управления тем, какие задачи выполняются. Например, если задачи включения отмечены как «foo», а некоторые задачи внутри включенной в нее книги отмечены как «бар», и вы запускаете

ansible-playbook --tags "foo"

Будет выполнена внутренняя задача (помеченная только как «бар»). Чтобы избежать выполнения всех внутренних задач с меткой «бар», вам необходимо выполнить следующую команду

ansible-playbook --tags foo --skip-tags bar

3
2017-08-24 16:49



Это неверно: «Указание тега в задаче означает, что только тогда, когда этот тег явно передается команде ansible-playbook, эта задача будет выполнена». - gimboland
Прикомандированный, утверждение неверно. - Chris
Вы правы. Я перефразировал. Благодаря! - Shahar
да, вы можете добиться такого поведения, гарантируя, что вы всегда будете использовать правильное ansible-playbook варианты, но я думаю, что ОП запрашивает способ аннотировать задачу так, чтобы она не выполнялась, если конкретный тег явно не добавлен в ansible-playbook команда. - dgh
Да, это не отвечает на вопрос ОП. - Allen Luce


Проверка переменной «теги» не работает в Ansible 2.1.1.0. См. Ниже тест. У меня есть другая идея выполнить задачу только при определении тега, работающего как для Ansible 1.9.X, так и для 2.X.Y:

- set_fact: foo=true
  tags: bar
- set_fact: foo=false
- name: do something when 'bar' tag is defined
  debug: var=foo
  when: foo
  tags: bar

При этом при запуске playbook без какого-либо тега переменная 'foo' будет установлена ​​в true, а затем на false, поэтому ничего не будет выполнено. Если вы добавите тег «bar», будет применен только первый параметр, поэтому переменная «foo» будет true, тогда ваша задача будет выполнена. Наслаждайтесь!


И вот тест о переменной «tags» в Ansible 2.1.1.0:

Вот плей-лист:

- hosts: localhost
  connection: local
  tasks:
    - name: display tags variable
      debug: var=tags
      tags: foo

    - name: do something only when tag 'foo' is provided
      debug: var=tag
      when: tags is defined
      tags: foo

И вот вывод:

$ ansible-playbook --version ; ansible-playbook ./test.yml -t foo
ansible-playbook 2.1.1.0
  config file = /home/nootal/projects/ivy/src/ansible/ansible.cfg
  configured module search path = Default w/o overrides

PLAY [localhost] ***************************************************************

TASK [display tags variable] ***************************************************
ok: [localhost] => {
    "tags": "VARIABLE IS NOT DEFINED!"
}

TASK [do something only when tag 'foo' is provided] ****************************

PLAY RECAP *********************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0   

2
2017-09-29 07:30





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

Пример: Представьте себе книгу и инвентарь

# инвентарь
[DEV]
192.168.1.1

# site.yml
- хосты: dev
  роли:
    - {role: common}

и совместно / tasks / main.yml

# role / common / tasks / main.yaml
- имя: Установить ссылки
  apt: name = links state = present

- включить: uninstall.yml
  когда: uninstall_links определено
  теги:
    - удалить

# role / common / tasks / uninstall.yml
- name: Удалить ссылки
  apt: name = links state = отсутствует

При таком подходе вы используете тег, чтобы выбрать только задачи в uninstall.yml, но вам также нужно установить переменную «uninstall_links» для включения этого параметра. Поэтому, если вы запустите playbook без каких-либо параметров, он по умолчанию запускает задачу установки. Чтобы удалить, вы можете установить тег 'uninstall' в свою playbook (или cmdline) и ДОЛЖЕН установите переменную. Если вы не установите тег, он будет запускать все (устанавливать и удалять) в этом порядке, что хорошо для тестирования всего процесса.

Как запустить все (он будет устанавливать и удалять):

$ ansible-playbook -i inventory site.yml -l dev -s -k -e "uninstall_links=true"

Как запустить только тег 'uninstall' в группе dev

$ ansible-playbook -i inventory site.yml -l dev -s -k -e "uninstall_links=true" -t uninstall

Поэтому переменные и теги могут также находиться в файлах site.yml / inventory, позволяя вам зафиксировать ваш SCM и записать ваше намерение.


0
2018-04-18 18:35





nootal прав, мой подход не работает - игнорируй это :( Теперь я использую «когда: myvar определен» и переключатель командной строки «-e» myvar = X »для выполнения задач только при явном запросе.

Еще проще (по крайней мере, с невозможным 2.1.1.0):

- name: do something only when tag 'foo' is provided
  when: tags is defined
  tags: foo

-> будет выполняться только при наличии тегов, а теги включают в себя "foo"


0
2017-08-23 21:27