Сложная структура переменных с Jinja2

Я пытаюсь выяснить сложную структуру переменных с помощью шаблона jinja2 в Ansible. Я пробовал разные решения с dictsort и «if» внутри цикла «for», но я не вижу никакого прогресса. Любая помощь будет оценена.

Я пытаюсь напечатать virtual_ro_id на основе ansible_hostname. Имена хостов: server1.dc1.com и server2.dc1.com, то же самое для dc2. Файл var приведен ниже.

datacenters:
  dc1:
    server1:
      - virtual_ro_id: "60"
    server2:
      - virtual_ro_id: "60"
  dc2:
    server1:
      - virtual_ro_id: "61"
    server2:
      - virtual_ro_id: "61"

Вот как выглядит мой синтаксис шаблона:

    {% for dc in lookup('dict', datacenters) %}
    {% set dc_name=ansible_fqdn.split(.)[1] %}
      {% if 'dc' == dc_name %}
        ID: {{ dc.ansible_hostname.virtual_ro_id }}
      {% endif %}
    {% endfor %}

Обычно я получаю синтаксическую ошибку или шаблон не получает значения. Заранее спасибо.


person jpolara2016    schedule 23.03.2020    source источник


Ответы (1)


Учитывая инвентарь

shell> cat hosts
server1.dc1.com
server2.dc1.com
server1.dc2.com
server2.dc2.com

задание

    - debug:
        var: datacenters[mydomain][myhost][0]['virtual_ro_id']
      vars:
        myhost: "{{ inventory_hostname.split('.').0 }}"
        mydomain: "{{ inventory_hostname.split('.').1 }}"

дает

ok: [server1.dc1.com] => {
    "datacenters[mydomain][myhost][0]['virtual_ro_id']": "60"
}
ok: [server2.dc1.com] => {
    "datacenters[mydomain][myhost][0]['virtual_ro_id']": "60"
}
ok: [server1.dc2.com] => {
    "datacenters[mydomain][myhost][0]['virtual_ro_id']": "61"
}
ok: [server2.dc2.com] => {
    "datacenters[mydomain][myhost][0]['virtual_ro_id']": "61"
}

Вероятно, это то, что вы ищете?

person Vladimir Botka    schedule 23.03.2020
comment
Большое спасибо за ответ @ vladimir-botka. Я тестировал его локально, и он работал :) - person jpolara2016; 25.03.2020