Ansible - передача динамических переменных в шаблон Jinja2 - PullRequest
0 голосов
/ 14 октября 2019

У меня проблема с доступом к динамически именуемым переменным 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' %}

1 Ответ

1 голос
/ 14 октября 2019

У вас просто есть проблема с синтаксисом в вашем yaml.

# Wrong
vars:
  domain: tf_result.outputs.{{ item + '_domain' }}.value

Это объявление переменной, значением которой является конкатенация (буквально) "tf_result.outputs.", за которой следует значение текущего item и"_domain.value". То, что вы хотите, это фактическое значение, содержащееся в этой полной переменной. Это правильный синтаксис:

# Correct
vars:
  domain: "{{ tf_result.outputs[item + '_domain'].value }}"
...