将 JMESpath 多选过滤器的结果元素与变量连接起来

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 获得

Kon*_*rov 6

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)