Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从ansible中的库存文件中获取值?_Ansible_Jinja2 - Fatal编程技术网

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

如何从ansible中的库存文件中获取值?,ansible,jinja2,Ansible,Jinja2,我正在尝试从清单主机文件获取值,但无法获取值。 使用ansible 2.5。 提前谢谢。 请帮助我在金贾2模板形式的代码只 主机文件: [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

我正在尝试从清单主机文件获取值,但无法获取值。 使用ansible 2.5。 提前谢谢。 请帮助我在金贾2模板形式的代码只

主机文件:

[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 %}
dbs=['a1','s02','a11','s01','a02','s11','a12','s12']
{对于节点,组['nodes']中的sid为%| zip(dbs)%}
{hostvars[node]['hname']中的j的%if hostvars[node]['name'][0]在dbs%}

{%endfor%}
{%endfor%}
所需输出:

对于每个名称值,它应该给出相应的hname

输出应如下所示

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

为主机文件指定以下任务

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

事实上,模板是相同的

{% for item in hostvars|json_query('*.[name[0], hname[0]]') %}
<name = {{ item.0 }}, hname= {{ item.1 }}>
{% endfor %}
{% for item in names %}
<name = {{ item }}, hname= {{ dicts[item] }}>
{% endfor %}
{%用于名称中的项%}
{%endfor%}

(未测试)。

Hi,请您使用我在上述代码中使用的for循环,以jinja2模板形式为我提供解决方案。当然,事实上是相同的。我在代码中使用了dbs列表,因此我需要基于该dbs列表顺序的代码。有这种可能吗?我们应该从dbs列表中获取名称值,然后根据名称值获得hname值。嗨,Vladmir,我不应该使用json_查询。我已经更新了主机和代码数据。你能不能用金卡2表给我推荐一下代码。
- 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 %}