簡體   English   中英

將對象列表(字符串,字符串)轉換為字典(字符串,列表 <string> )在Ansible

[英]Convert list of objects (string, string) into Dictionary (string, list<string>) in Ansible

我有一個對象列表(每個對象包含兩個string類型的屬性),我需要將其轉換為Dictionary。 對象的第一個屬性將成為鍵,對象的第二個屬性必須組合成一個字符串列表。

我經歷了幾個解決方案,但找不到我需要的東西。

輸入示例:

[
    {
        "name": "AAA",
        "value": "111"
    },
    {
        "name": "AAA",
        "value": "222"
    },
    {
        "name": "BBB",
        "value": "333"
    },
    {
        "name": "BBB",
        "value": "444"
    },
    {
        "name": "CCC",
        "value": "555"
    }
]

期望的輸出(任一個工作):

[
    {
        "name": "AAA",
        "value": [ "111", "222" ]
    },
    {
        "name": "BBB",
        "value": [ "333", "444" ]
    },
    {
        "name": "CCC",
        "value": [ "555" ]
    }
]
[
    "AAA": [ "111", "222" ],
    "BBB": [ "333", "444" ],
    "CCC": [ "555" ]
]

以下任務

- set_fact:
    my_list: "{{ my_list|default([]) +
                 [{item.0: item.1|json_query('[].value')}] }}"
  loop: "{{ input|groupby('name') }}"
- debug:
    var: my_list

"my_list": [
    {
        "AAA": [
            "111", 
            "222"
        ]
    }, 
    {
        "BBB": [
            "333", 
            "444"
        ]
    }, 
    {
        "CCC": [
            "555"
        ]
    }
]

這就是我如何處理這個問題。 解決方案主要基於json_query過濾器的使用

首先,您需要一個對象列表中所有唯一名稱的列表,以便您可以遍歷它並提取相應的值。 這是通過使用以下jinja2模板表達式過濾input變量來完成的{{ input | json_query("[].name") | unique }} {{ input | json_query("[].name") | unique }}

現在我們只需循環遍歷該列表並再次過濾input變量。 這次我們想要為具有給定名稱的所有對象提取所有值的平面列表。 這是通過以下示例jinja2表達式完成的: {{ input | json_query("[?name=='a_unique_name'].value") }} {{ input | json_query("[?name=='a_unique_name'].value") }}

剩下的就是正確設置事實,無論是在新列表中還是在您請求的hashmap中。 我在下面的示例劇本中做了兩個。

注意:我在本例中使用帶有空格控制( >- )的yaml折疊塊來簡化寫入(限制引號轉義...)和讀取(長行分割...)。 如果您不熟悉它們,可以查看https://yaml-multiline.info/以獲取所有選項的完整概述。

劇本

---
- name: Rearrange var example
  hosts: localhost
  gather_facts: false

  vars:

     input: [
      { "name": "AAA", "value": "111" },
      { "name": "AAA", "value": "222" },
      { "name": "BBB", "value": "333" },
      { "name": "BBB", "value": "444" },
      { "name": "CCC", "value": "555" }
     ]

  tasks:

    - name: Create list and dict vars
      vars:
        jsquery: >-
          [?name=='{{ item }}'].value
      set_fact:
        list_var: >-
          {{
            list_var | default([])
            +
            [{'name': item, 'value': input | json_query(jsquery)}]
          }}
        dict_var: >-
          {{
            dict_var | default({})
            | combine ({ item: input | json_query(jsquery)})
          }}
      loop: "{{ input | json_query('[].name') | unique }}"


    - name: Show calculated list and dict vars
      debug:
        var: "{{ item }}"
      loop:
        - list_var
        - dict_var

這使:

PLAY [Rearrange var example]  ************************************************

TASK [Create list and dict vars] *********************************************
ok: [localhost] => (item=AAA)
ok: [localhost] => (item=BBB)
ok: [localhost] => (item=CCC)

TASK [Show calculated vars] **************************************************
ok: [localhost] => (item=list_var) => {
    "ansible_loop_var": "item",
    "item": "list_var",
    "list_var": [
        {
            "name": "AAA",
            "value": [
                "111",
                "222"
            ]
        },
        {
            "name": "BBB",
            "value": [
                "333",
                "444"
            ]
        },
        {
            "name": "CCC",
            "value": [
                "555"
            ]
        }
    ]
}
ok: [localhost] => (item=dict_var) => {
    "ansible_loop_var": "item",
    "dict_var": {
        "AAA": [
            "111",
            "222"
        ],
        "BBB": [
            "333",
            "444"
        ],
        "CCC": [
            "555"
        ]
    },
    "item": "dict_var"
}

PLAY RECAP *******************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   


暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM