Ansible: правильный способ использования переменных в условных проверках «когда» - PullRequest
0 голосов
/ 28 декабря 2018

Мы используем AWX / Tower для запуска наших игровых книжек в растущей инфраструктуре и поддерживаем общий инвентарь на самом сервере AWX, используя интеллектуальный инвентарь .

Это проблема, которую мы имеем:

Из 200+ серверов мы хотим, чтобы только небольшое подмножество исключало определенную задачу.В настоящее время мы работаем над тем, чтобы определить переменные в файле, например,

http_conf_ignore:
   vmhost01: false
   vmhost02: false

, а затем в файле yml мы имеем условную проверку следующим образом:

tasks:
  - include_tasks: http_config.yml
when: http_conf_ignore.{{ inventory_hostname }} is not defined

Thisработает, однако, мы получаем предупреждающее сообщение, говорящее «Когда оператор не должен использовать шаблонизаторы jinja2, такие как {{}} и {%%}» , и я не фанат подавления предупреждений.Кроме того, мы не хотели бы иметь несколько отдельных инвентаризаций

Может кто-нибудь подсказать, какие рекомендации лучше всего использовать при использовании переменных таким способом.

Спасибо!

1 Ответ

0 голосов
/ 28 декабря 2018

Аргумент к директиве when является условным выражением Jinja.Поскольку уже интерпретируется как выражение Jinja, вам не нужны маркеры {{...}}.Вот почему вы можете ссылаться на переменную типа http_conf_ignore вне маркеров.Переменная inventory_hostname ничем не отличается.Вам нужно что-то вроде:

when: http_conf_ignore[inventory_hostname] is not defined

(Если бы вы написали что-то вроде http_conf_ignore.inventory_hostname, вы бы запросили значение буквального ключа inventory_hostname. Используя синтаксис variable[key],что напоминает доступ к словарю Python, так это то, как вы разыменовываете словарь, используя значение переменной key.

Кстати, другой способ приблизиться к этому - установить переменную http_conf_ignore на определенных хостах в вашеминвентарь.Например, в вашем инвентаре:

vmhost01 http_conf_ignore=true

Это позволит вашему when состоянию быть:

when: not http_conf_ignore|default(false)
...