Как получить значения из файла инвентаризации в ansible? - PullRequest
0 голосов
/ 19 июня 2019

Я пытаюсь получить значения из файла инвентаризации, но не могу получить значения. Использование ansible 2.5. Заранее спасибо. Пожалуйста, помогите мне с кодом только в шаблонной форме jinja2.

Файл хоста:

[all]
F01 name='["a1","a11"]'  hname='["F01"]'
F02 name='["s01","s11"]' hname='["F02"]'
F03 name='["a02","a12"]' hname='["F03"]'
F04 name='["s02","s12"]' hname='["F04"]'
[nodes]
F01
F02
F03
F04

Код, который я использовал, приведен ниже:

dbs это список

dbs = ['a1', 's02', 'a11', 's01', 'a02', 's11', 'a12', 's12']
{% for node, sid in groups['nodes']|zip(dbs) %}
{% for j in hostvars[node]['hname'] if hostvars[node]['name'][0] in dbs %}
< name = "{{ sid }}", hname = "{{ j }}" >
{% endfor %}
{% endfor %}

Требуемый вывод:

Для каждого значения имени должен быть указан соответствующий hname.

Вывод должен быть как ниже.

<name = a1, hname= F01>
<name = s02, hname= F04>
<name = a11, hname= F01>
<name = s01, hname= F02>

1 Ответ

1 голос
/ 19 июня 2019

Учитывая файл хоста, задача ниже

- debug:
    msg: "<name = {{ item.0 }}, hname= {{ item.1 }}>"
  loop: "{{ hostvars|json_query('*.[name[0], hname[0]]') }}"

дает то, что вы хотите

"msg": "<name = s02, hname= F04>"
"msg": "<name = a1, hname= F01>"
"msg": "<name = a02, hname= F03>"
"msg": "<name = s01, hname= F02>"

Шаблон, по сути, тот же

{% for item in hostvars|json_query('*.[name[0], hname[0]]') %}
<name = {{ item.0 }}, hname= {{ item.1 }}>
{% endfor %}

(не проверено)

Чтобы взять значение имени из списка баз данных, а затем на основе значения имени получить значение hname

Задачи ниже

- set_fact: # get list of names
    names: "{{ hostvars|json_query('*.name[0]') }}"
- set_fact: # get list of hashes {name,hname}
    hashes: "{{ hostvars|json_query('*.{name: name[0], hname: hname[0]}') }}"
- set_fact: # get list of dict name:hname
    dicts: "{{ dicts|default({})|combine({item: hashes|json_query(query)}) }}"
  vars:
    query: "[?name=='{{ item }}'].hname|[0]"
  loop: "{{ names }}"
- debug: # get hname for given name
    msg: "{{ item }}: {{ dicts[item] }}"
  loop: "{{ names }}"

дай

"msg": "s02: F04"
"msg": "a1: F01"
"msg": "a02: F03"
"msg": "s01: F02"

Шаблон, по сути, тот же

{% for item in names %}
<name = {{ item }}, hname= {{ dicts[item] }}>
{% endfor %}

(не тестировался).

...