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