将 JMESpath 多选过滤器的结果元素与变量连接起来
Concatenate result element of JMESpath multiselect filter with a variable
我在 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
平面数组(注意每个 name
中的 1
):
- name: foo1
param: rock
- name: bar1
param: paper
- name: baz1
param: scissors
我像这样使用 Jinja 过滤器 json_query
(在内部使用 JMESPath 查询语言 Python) :
{{ my_groups|json_query( "[*].users[*].{ name: name, param: param }" ) }}
上面提到的 returns 数组,当然名称中没有 1
。有什么方法可以用一个简单的字符串实现所需的连接吗?由于文档和示例,我尝试了一些变体但没有运气,即:
{{ my_groups|json_query( "[*].users[*].{ name: name + '1', param: param }" ) }}
提供了简单的 Ansible 剧本
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"
}
]
我在 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
平面数组(注意每个 name
中的 1
):
- name: foo1
param: rock
- name: bar1
param: paper
- name: baz1
param: scissors
我像这样使用 Jinja 过滤器 json_query
(在内部使用 JMESPath 查询语言 Python) :
{{ my_groups|json_query( "[*].users[*].{ name: name, param: param }" ) }}
上面提到的 returns 数组,当然名称中没有 1
。有什么方法可以用一个简单的字符串实现所需的连接吗?由于文档和示例,我尝试了一些变体但没有运气,即:
{{ my_groups|json_query( "[*].users[*].{ name: name + '1', param: param }" ) }}
提供了简单的 Ansible 剧本
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"
}
]