将 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 }" ) }}

pastebin

提供了简单的 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"
    }
]