Установите доступные факты через сгенерированное имя

Я работаю над доступным сценарием для развертывания некоторой конфигурации служб в другом регионе, и у меня есть начальные переменные, импортированные include_vars следующим образом:

common: [...]
us_local: [...]
uk_local: [...]
us_global: [...]
uk_global: [...]

По сути, я хочу сгенерировать конфигурацию, включив переменные из common, все глобальные конфигурации, а также локальную конфигурацию этого региона, используя переменную {{ site }}, которая определена в hosts.yaml. Например, если развернутый хост - это мы, то я хочу использовать common, us_local, us_global, uk_global.

Я буду использовать шаблон jinja2 для генерации окончательной конфигурации, и, насколько я понимаю, самый простой способ - создать другую переменную с именем current_site_local и скопировать в нее все из {{ site }}_local, чтобы позже я мог напрямую ссылаться на нее внутри шаблона. Однако мне не удается заставить его работать через set_facts.

Любая помощь будет оценена по достоинству.

ОБНОВИТЬ:

Я использовал следующий синтаксис, и он работает:

- name: generate curr_site_local
  set_fact:
    current_site_local: '{{ vars[site + "_local"] }}'

person lordofire    schedule 03.03.2019    source источник


Ответы (1)


Попробуйте использовать фильтр combine.

- name: Set site config '{{ site }}'
  set_fact:
    current_site_local: '{{ common 
      | combine(vars[site + "_global"])
      | combine(vars[site + "_local"]) }}'

В этом случае порядок приоритета таков, что конфигурация local переопределит global, а это переопределит common. Не уверен, что это то, что вы хотели, но это тот порядок, который вы указали в своем вопросе, но <other>_global сейчас не включен.
Если вы хотите, чтобы common имел наивысший приоритет, просто измените порядок.

См. Документацию по combine.

Обновил свой ответ предложением Мэтью Л. Дэниела.

person Thomas Hirsch    schedule 03.03.2019
comment
Хех, похоже, мы ответили с интервалом в несколько секунд друг от друга, но, хотя ваш ответ намного более исчерпывающий, чем мой, я действительно думаю, что наличие блоков when: - неправильный подход к этой проблеме. Если вы обновите свой ответ, чтобы использовать vars и region, я буду рад проголосовать за ваш и удалить свой - person mdaniel; 04.03.2019
comment
Спасибо за ваш ответ. На самом деле, я просто хочу назначить контент из {{site}} _ local, который является списком, другой переменной с именем current_site_local, чтобы позже я мог использовать его в шаблоне, подобном следующему: {% для записи в curr_site_local %} {{entry.name}} xxxx {{entry.value}} {% endfor%} Пробовали ваше решение, но получили ошибку ERROR! в задаче не обнаружено никаких действий. Это часто указывает на неправильное имя модуля или неправильный путь к модулю. - person lordofire; 04.03.2019
comment
Ошибка только из-за моей опечатки, теперь работает. Спасибо! - person lordofire; 04.03.2019