Ansible, когда условие не является условием пропуска, когда ложно и выдает ошибку

#ansible #ansible-2.x

#ансибль #ансибль-2.x

Вопрос:

Вот мои ансибельные задачи в рамках роли

 - name: include tcrj01 variables from prefix_lists  include_vars:  file: "../collection-data/output/{{ market_input | lower }}tcrj01_prefix_lists.yml"  name: prefix01  delegate_to: localhost  when: '"target1" in market_input or "target2" in market_input'  - name: include dsrj01 variables from prefix_lists  include_vars:  file: "../collection-data/output/{{ market_input | lower }}dsrj01_prefix_lists.yml"  name: prefix01  delegate_to: localhost  when: '"target1" not in market_input or "target2" not in market_input'  

market_input == «цель1»

Ошибка, которую я получаю "Could not find or access '../collection-data/output/targetdsrj01_prefix_lists.yml' , правильна, потому что этот файл не существует и не должен существовать, потому target что строка находится в/равна market_input переменной. Он должен искать файл tcrj, который существует для этой целевой строки, а не файл dsrj, о котором он выдает ошибку. Я не могу понять, почему задача dsrj не пропускается. Это работает для других целевых строк, но не для той, которую я сейчас запускаю. Я предоставлю более подробную информацию или ясность, если потребуется. Большое спасибо!

Ответ №1:

Если вам не нужен текст для сравнения строк, и достаточно точного совпадения-лучшим способом написать when условия было бы фактически сопоставить строковый элемент в списке, т. Е. market_input in ["target1", "target2"] .

Исходя из этой структуры, задачи будут выглядеть следующим образом:

 - name: include tcrj01 variables from prefix_lists  include_vars:  file: "../collection-data/output/{{ market_input | lower }}tcrj01_prefix_lists.yml"  name: prefix01  delegate_to: localhost  when: market_input | lower in ["target1", "target2"]  - name: include dsrj01 variables from prefix_lists  include_vars:  file: "../collection-data/output/{{ market_input | lower }}dsrj01_prefix_lists.yml"  name: prefix01  delegate_to: localhost  when: market_input | lower not in ["target1", "target2"]  

Теперь, когда market_input=target1 будет пропущено второе задание include dsrj01 variables... , задание будет пропущено.

Ответ №2:

 when: '"target1" not in market_input or "target2" not in market_input'  

Вторая часть этого условия истинна ( "target2" not in "target1" ), поэтому задача выполняется. Вы хотите пропустить задачу, когда какая-либо часть является ложной , поэтому вы должны использовать and , а не or .

 when: '"target1" not in market_input and "target2" not in market_input'