如何从库存文件中获取值?

时间:2019-06-19 10:05:33

标签: ansible jinja2

我正在尝试从库存主机文件中获取值,但无法获取这些值。 使用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 %}

必需的输出:

对于每个名称值,都应给出各自的名称。

输出应如下所示。

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

1 个答案:

答案 0 :(得分:1)

将以下任务交给主机文件

- 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 %}

(未经测试)

  

要从dbs列表中获取名称值,然后根据名称值获取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 %}

(未经测试)。