Voj*_*vec 1 python jinja2 ansible jmespath
我在 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
Run Code Online (Sandbox Code Playgroud)
我需要将它转换为users看起来像这样的平面数组(注意1每个name):
- name: foo1
param: rock
- name: bar1
param: paper
- name: baz1
param: scissors
Run Code Online (Sandbox Code Playgroud)
我使用Jinja过滤器json_query(它内部使用Python 中的JMESPath查询语言),如下所示:
{{ my_groups|json_query( "[*].users[*].{ name: name, param: param }" ) }}
Run Code Online (Sandbox Code Playgroud)
它返回上面提到的数组,但1当然没有名字。有什么方法可以用简单的字符串实现所需的连接吗?由于文档和示例,我尝试了一些变体,但没有运气,即:
{{ my_groups|json_query( "[*].users[*].{ name: name + '1', param: param }" ) }}
Run Code Online (Sandbox Code Playgroud)
简单的 Ansible playbook 可在pastebin 获得
JMESPath内置了join来将列表转换为字符串。
- debug:
msg: "{{ my_groups | json_query(qry) }}"
vars:
qry: "[*].users[*][].{ name: join('',[name,'1']), param: param }"
Run Code Online (Sandbox Code Playgroud)
还要注意[]在users[*]展平列表之后。
结果:
"msg": [
{
"name": "foo1",
"param": "rock"
},
{
"name": "bar1",
"param": "paper"
},
{
"name": "baz1",
"param": "scissors"
}
]
Run Code Online (Sandbox Code Playgroud)