我在Ansible(YAML格式)中有以下变量结构:
my_groups:
- name: g1
users:
- name: foo
param: rock
junk: whatever
- name: bar
param: paper
junk: whatever
- name: g2
users:
- name: baz
param: scissors
junk: whatever
我需要将其转换为users
的平面数组,如下所示(请注意每个1
中的name
):
- name: foo1
param: rock
- name: bar1
param: paper
- name: baz1
param: scissors
我使用 Jinja 过滤器json_query
(在Python内部使用 JMESPath 查询语言),如下所示:
{{ my_groups|json_query( "[*].users[*].{ name: name, param: param }" ) }}
返回上面提到的数组但当然没有1
的名称。有没有办法如何用简单的字符串实现所需的连接?由于文档和示例,我尝试了一些变体,但没有运气,例如:
{{ my_groups|json_query( "[*].users[*].{ name: name + '1', param: param }" ) }}
简单的Ansible剧本可在pastebin
获得答案 0 :(得分:3)
JMESPath内置join将列表转换为字符串。
- debug:
msg: "{{ my_groups | json_query(qry) }}"
vars:
qry: "[*].users[*][].{ name: join('',[name,'1']), param: param }"
请在[]
之后注意users[*]
以展平列表。
结果:
"msg": [
{
"name": "foo1",
"param": "rock"
},
{
"name": "bar1",
"param": "paper"
},
{
"name": "baz1",
"param": "scissors"
}
]