Рейтинг:1

Блоки с when и include_tasks

флаг ru

Я столкнулся с немного странным поведением, которое я не совсем понимаю, и до сих пор мне не удалось найти что-то полезное в документации.

Когда у вас есть «блок:» с условием «когда», это условие в самом блоке, кажется, попадает во включенные задачи, почему?

Пример:

#playbook.yml
- хосты: локальный
  задачи:
    - блокировать:
      - имя: Включить материал
        include_tasks: "set-x.yml"
      когда: x не определен
#set-x.yml
- название: Установить факт
  set_fact:
    х: фу

- название: тест
  отлаживать:
    переменная: х

Если вы запустите приведенный выше пример, оператор отладки вообще не запустится, и это не то, что я ожидал. Насколько я понимаю, условие when в блоке будет применяться только к тому, должен ли выполняться сам блок или нет. Ясно, что условие переносится в файл include_tasks, и, насколько я понимаю, включение должно работать не так.

Что мне не хватает?

Рейтинг:3
флаг br

Цитата из Условные выражения с включением:

Когда вы используете условное выражение в операторе include_*, оно применяется только к самой задаче включения, а не к каким-либо другим задачам во включенных файлах.

Это работает так, как ожидалось

    - include_tasks: set-x.yml
      когда: x не определен

Никакая задача из включенного файла не будет использоваться

ЗАДАЧА [include_tasks] **************************************************** **
включено: /export/scratch/tmp8/set-x.yml для локального хоста

Иная ситуация с блоки. Цитата из Группировка задач блоками:

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

Если вы положите include_tasks в блок

    - блокировать:
        - include_tasks: set-x.yml
      когда: x не определен

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

ЗАДАЧА [include_tasks] **************************************************** ***
включено: /export/scratch/tmp8/set-x.yml для локального хоста

ЗАДАЧА [set_fact] **************************************************** ********
хорошо: [локальный хост]

ЗАДАЧА [отладка] **************************************************** ***********
пропуск: [локальный хост]

Откройте проблема если вы думаете, что это ошибка.

user3973227 avatar
флаг ru
Ну... это немного странное поведение, и оно становится еще более странным, потому что не только когда: условие из блока попадает в сам оператор include_tasks, оно ТАКЖЕ делает его в каждом операторе внутри включенного файла и далее включается файлы тоже. я узнал об этом только потому, что у меня было мета: reset_connection, вызывающее предупреждение на два уровня ниже блока о том, что не поддерживается условие when для мета:
флаг br
Точно, в этом суть!

Ответить или комментировать

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