Ansible теги могут использоваться для запуска только подмножества задач / ролей. Это означает, что по умолчанию все задачи выполняются, и мы можем только предотвратить выполнение некоторых задач.
Можно ли ограничить выполнение задачи только тогда, когда указан тег «foo»? Можем ли мы использовать текущие теги в when
разделе задачи?
Ответы:
Ansible 2.5 поставляется со специальными тегами
never
иalways
. Тегnever
можно использовать именно для этой цели. Например:В этом примере задача будет запускаться только тогда, когда тег
debug
(илиnever
) явно запрашивается. [Ссылка на ансамбль документов]источник
Хотя это обходное решение, оно работает.
Внутри списка задач зарегистрируйте переменную при нормальном выполнении. Затем добавьте условие when, которое проверяет эту переменную в тегированной задаче.
источник
untagged
для этого:- set_fact: untagged_run=true
tags: untagged
У меня недостаточно репутации, чтобы сказать или прокомментировать ответ, предлагающий использовать переменные командной строки (
--extra-vars
), но у меня есть это, чтобы добавить к нему:Вы можете предотвратить сбой воспроизведения при отсутствии
--extra-vars
определения, определив значение по умолчанию в самой книге:Переопределение через via
--extra-vars
будет по-прежнему работать, потому что переменные, определенные в командной строке, имеют приоритет над всеми другими определениями.В результате игра запускается без ошибок, если
thorough
она не измененаtrue
на командную строку.источник
thorough | default('no') | bool
.when: thorough is defined and thorough
если вы предпочитаете этот синтаксисis defined and
синтаксис больше. больше, чем множество труб, которые я не чувствую, интуитивно понятны.Вы можете использовать условные выражения для защиты от случайно запускаемых задач, которые в противном случае выполнялись бы, если бы вы не указали тег. Предостережение этому методу состоит в том, что воспроизведение будет давать ошибку и завершится ошибкой, если вы не определите эту дополнительную переменную.
Используя аргумент extra-vars, вы можете запустить условное условие.
Из ansible-playbook --помощь:
Пример:
test.yaml:
источник
thorough | default("false") | match("true")
. По умолчанию не должно бытьfalse
, просто ничего не совпадаетtrue
, но это улучшает читаемость.Проверка переменной 'tags' не работает в Ansible 2.1.1.0. Смотрите ниже для теста. У меня есть другая идея, чтобы выполнить задачу, только когда тег определен, работая для Ansible 1.9.X и 2.XY:
При этом при запуске playbook без каких-либо тегов переменная 'foo' будет установлена в true, а затем в false, поэтому ничего не выполняется. Если вы добавите тег 'bar', будет применен только первый параметр, поэтому переменная 'foo' будет иметь значение true, тогда ваша задача будет выполнена. Наслаждайтесь!
А вот тест на переменную 'tags' в Ansible 2.1.1.0:
Вот книга игр:
И вот вывод:
источник
Да. Запуск ansible-playbook с этим
--tags foo
флагом обеспечит выполнение только тех задач, которые помеченыfoo
. Например, предположим, что у нас есть playbook с именем example.yml:Бег:
Убедитесь, что выполняется только задание yum.
Так что на самом деле вам не нужно использовать теги в секции when для условного выполнения задачи. Обратите внимание, что в зависимости от сложности ваших книг / ролей вам может понадобиться комбинация --tags и --skip-tags, чтобы контролировать, какие задачи будут выполняться. Например, если включаемая задача помечена как «foo», а какая-то задача во включенной пьесе помечена как «bar», и вы запускаете
Внутренняя задача (помеченная только как 'bar') будет выполнена. Чтобы избежать выполнения всех внутренних задач, помеченных как «bar», вам нужно будет выполнить следующую команду
источник
ansible-playbook
параметры, но я думаю, что OP запрашивает способ аннотировать задачу, чтобы она не выполнялась, если вansible-playbook
команде явно не добавлен конкретный тег .Существует специальный тег «никогда» , который будет препятствовать выполнению задачи, если тег не запрошен специально.
источник
когда предложение не может оценить наличие тегов. В качестве обходного пути я использую переменные и теги вместе для запуска задач, специфичных для этого тега / переменной.
Пример: представьте себе книгу с книгами и инвентарь
При таком подходе вы используете тег для выбора только задач в uninstall.yml, но вам также нужно установить переменную 'uninstall_links' в какое-либо значение, чтобы включить ее. Так что если вы запустите playbook без каких-либо параметров, по умолчанию будет запущена задача установки. Чтобы удалить, вы можете установить тэг 'uninstall' для вашей книги воспроизведения (или cmdline) и ДОЛЖНЫ установить переменную. Если вы не установите тег, он будет запускать все (устанавливать и удалять) в указанном порядке, что хорошо для тестирования всего процесса.
Как все запустить (установит и удалит):
$
ansible-playbook -i inventory site.yml -l dev -s -k -e "uninstall_links=true"
Как запустить только тег «удалить» в группе разработчиков
$
ansible-playbook -i inventory site.yml -l dev -s -k -e "uninstall_links=true" -t uninstall
Следовательно, переменные и теги также могут находиться в файлах site.yml / инвентаризации, что позволяет вам зафиксировать в своем SCM и записать свое намерение.
источник
Ноотал прав, мой подход не работает - проигнорируйте его :( Теперь я использую «когда: myvar определен» и переключатель командной строки «-e» myvar = X »для выполнения задач только по явному запросу.
Еще проще (хотя бы с ansible 2.1.1.0):
-> будет выполняться, только если были предоставлены теги И теги включают "foo"
источник
На
Ansible 2.3.2.0
, вот мое решение проблемы:Он начинается с установки
in_tag
наTrue
тогда, когда есть,set_fact
который устанавливает его обратно,False
когда вы не указываете ни одинtags
изansible-playbook
.Когда вы указываете теги,
in_tag
остаетсяTrue
иfail
задача запускается.PS: вы можете добавить логику для любых задач, которые вы хотите
PS2: вы также можете расширить логику и жестко закодировать все имеющиеся у вас теги и, конечно,
set_fact: in_tag_blah=True
в сочетании с нимиtags: ["blah"]
.источник