【问题标题】:How to combine a key: list-value dict to a list of key:value with jmespath and/or ansible jinja filters?如何将 key:list-value dict 与 jmespath 和/或 ansible jinja 过滤器结合到 key:value 列表中?
【发布时间】:2021-01-29 11:10:21
【问题描述】:

我有这本词典:

{
  "key1": [
    "value1",
    "value2"
  ],
  "key2": [
    "value3"
  ]
}

我想要这个结果:

[
  {"key1": "value1"},
  {"key1": "value2"},
  {"key2": "value3"}
]

你知道怎么做吗?

编辑:实际上,我正在尝试使用 jmespath,但我在 ansible playbook 中,因此它也可以使用 jinja/ansible 过滤器。

【问题讨论】:

    标签: ansible ansible-filter


    【解决方案1】:

    您可以结合使用过滤器 dict2itemssubelements 来实现此目的。

    鉴于剧本:

    - hosts: all
      gather_facts: no
    
      tasks:
        - set_fact: 
            list: "{{ list | default([]) + [{ item.0.key: item.1 }] }}"
          loop: "{{ dict | dict2items | subelements('value') }}"
          vars: 
            dict:
              key1:
                - value1
                - value2
              key2:
                - value3
        
        - debug:
            var: list
    

    这将产生回顾:

    PLAY [all] **********************************************************************************************************
    
    TASK [set_fact] *****************************************************************************************************
    ok: [localhost] => (item=[{'key': 'key1', 'value': ['value1', 'value2']}, 'value1'])
    ok: [localhost] => (item=[{'key': 'key1', 'value': ['value1', 'value2']}, 'value2'])
    ok: [localhost] => (item=[{'key': 'key2', 'value': ['value3']}, 'value3'])
    
    TASK [debug] ********************************************************************************************************
    ok: [localhost] => {
        "list": [
            {
                "key1": "value1"
            },
            {
                "key1": "value2"
            },
            {
                "key2": "value3"
            }
        ]
    }
    
    PLAY RECAP **********************************************************************************************************
    localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    

    【讨论】:

    • 不错。我尝试过这种过滤器组合,但没有看到我的输出中有我需要的一切。谢谢。
    猜你喜欢
    • 2018-06-26
    • 1970-01-01
    • 2018-07-07
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-24
    相关资源
    最近更新 更多