[英]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.