如何使用调试或设置事实模块在ansible中使用Jinja2获得dict键值格式



我有以下输出

TASK [debug] *******************************************************************
ok: [1.1.1.1] => {
"msg": [
{
"DESCRIP": "server-abc",
"PORT": "Po3",
"PROTOCOL": "up",
"STATUS": "up"
},
{
"DESCRIP": "Leaf-1",
"PORT": "Po4",
"PROTOCOL": "up",
"STATUS": "up"
},
{
"DESCRIP": "server-xyz",
"PORT": "Po1",
"PROTOCOL": "up",
"STATUS": "up"
},  
{
"DESCRIP": "Leaf-2",
"PORT": "Po2",
"PROTOCOL": "up",
"STATUS": "up"
}             
]
}

我只想得到/打印包含";"叶子";在DESCRIP中;Po";在PORT中,我用jinj2进行了以下调试

- debug:
msg: >-
{%- for item in output.parsed -%}
{%- if ('Leaf' in item.DESCRIP) and ('Po' in item.PORT) -%}
"DESCRIP": {{item.DESCRIP}},
"PORT": {{item.PORT}}
{%- endif -%}
{%- endfor -%}

我得到的输出是以单行打印所有内容:

TASK [debug] *******************************************************************
ok: [10.2.4.1] => {
"msg": ""DESCRIP": Leaf-1,n  "PORT": Po4""DESCRIP": Leaf-2,n  "PORT": Po2"
}

我想要的是dict键值格式/json格式。如下所示:

[{
"DESCRIP": "Leaf-1",
"PORT": "Po4",
},
{
"DESCRIP": "Leaf-2",
"PORT": "Po2",
} ]

如何/在我的代码调试消息部分修改什么以获得以上输出

实现这一点的一种方法是在when条件下使用set_fact

在下面的示例中,我们创建一个新的变量serv_list(最初为空列表(,然后在条件匹配时附加DESCRIPPORT

- set_fact:
serv_list: '{{ serv_list | default([]) + [ { "DESCRIP": item.DESCRIP, "PORT": item.PORT } ] }}'
loop: "{{ output.parsed }}"
when:
- item.DESCRIP is search('Leaf')
- item.PORT is search('Po')
- debug:
var: serv_list

产品:

ok: [localhost] => {
"serv_list": [
{
"DESCRIP": "Leaf-1",
"PORT": "Po4"
},
{
"DESCRIP": "Leaf-2",
"PORT": "Po2"
}
]
}

最新更新