У меня проблема с доступом к динамически именуемым переменным Ansible в шаблоне Jinja2. У меня есть список арендаторов, подобных этому:
tenants:
- liamtest1
- liamtest2
В своей книге игр я создаю файлы конфигурации terraform для каждого из этих арендаторов, например:
- name: Generate a .tf file for each tenant in list
template:
src: templates/tenant.tf.j2
dest: "{{ enviro }}/terraform/{{ item }}.tf"
with_items: "{{ hostvars[inventory_hostname][enviro]['tenants'] }}"
Позже в книге игр я используюМодуль terraform, чтобы применить мою конфигурацию и зарегистрировать выходные данные в переменной:
- name: Run terraform
terraform:
project_path: "{{ enviro }}/terraform/"
state: present
register: tf_result
Я поставил перед своими выходами terraform имя арендатора, чтобы я не получал дубликаты. Этот бит работает нормально, и я могу отобразить эти выходные данные с помощью задачи отладки, например, tenant _domain:
- debug:
var: tf_result.outputs.{{ item + '_domain' }}.value
with_items: "{{ hostvars[inventory_hostname][enviro]['tenants'] }}"
Производит этот вывод:
ok: [localhost] => (item=liamtest1) => {
"ansible_loop_var": "item",
"item": "liamtest1",
"tf_result.outputs.liamtest1_domain.value": "liamtest1.mydomain.com"
}
ok: [localhost] => (item=liamtest2) => {
"ansible_loop_var": "item",
"item": "liamtest2",
"tf_result.outputs.liamtest2_domain.value": "liamtest2.mydomain.com"
}
Мне кажется, что я не могу создать еще один набор файлов (на этот раз javascript-файлов для mongodb) из другого шаблона Jinja2.
Я пробовал это:
- name: Generate a .js file for each tenant in list
vars:
domain: tf_result.outputs.{{ item + '_domain' }}.value
template:
src: templates/tenant.js.j2
dest: "{{ enviro }}/mongodb/{{ item }}.js"
with_items: "{{ hostvars[inventory_hostname][enviro]['tenants'] }}"
Если я ссылаюсь на это в моем шаблоне Jinja2, используя {{ domain }}
, он заканчивается только строкой, например tf_result.outputs.liamtest1_domain.value
в первом файле и tf_result.outputs.liamtest2_domain.value
во втором файле.
Я также пытался использовать lookup
в шаблоне Jinja2, как это:
{{ lookup('vars', domain) }}
Что дает мне:
"AnsibleUndefinedVariable: No variable found with this name: tf_result.outputs.liamtest1_domain.value"
Я также пробовал некоторые другие варианты, такие как:
{{ lookup(hostvars[inventory_hostname], domain) }}
IЯ также попробовал несколько других вещей, я не уверен, что все они заслуживают упоминания, поскольку ни одна из них не сработала, но, например, я попытался установить переменную внутри шаблона Jinja, а не на уровне задач, например, так:
{% set domain = lookup('vars', 'tf_result.outputs.' + item + '_domain' %}