#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'