代码之家  ›  专栏  ›  技术社区  ›  Vojta Myslivec

用变量连接JMESpath多选滤波器的结果元素

  •  1
  • Vojta Myslivec  · 技术社区  · 7 年前

    我有以下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
    

    滤器 json_query (内部使用 JMESPath公司 Python中的查询语言)如下所示:

    {{ my_groups|json_query( "[*].users[*].{ name: name, param: param }" ) }}
    

    1.

    {{ my_groups|json_query( "[*].users[*].{ name: name + '1', param: param }" ) }}
    

    Simple Ansible playbook可从以下网站获得: pastebin

    1 回复  |  直到 7 年前
        1
  •  6
  •   Konstantin Suvorov    7 年前

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