1

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

4

1 回答 1

6

JMESPath内置了将列表转换为字符串的连接。

- 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"
    }
]
于 2017-09-29T06:40:32.317 回答