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

时间:2017-09-29 00:30:05

标签: python ansible jinja2 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

我需要将其转换为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

获得

1 个答案:

答案 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"
    }
]