[英]Convert ansible dictionary list values to keys and keys to values
我有一個場景,我需要在 Ansible 劇本中將此字典dict1
轉換為dict2
,如下所示
dict1 = {'a':[1,2,3],'b':[4,5,6]}
dict2 = {1: 'a', 2: 'a', 3: 'a', 4: 'b', 5: 'b', 6: 'b'}
我試過with_nested
, with_items
但無法使其工作。
有點難看,但無需在任務中使用set_fact
即可完成這項工作,該任務使您可以自由地在任何地方聲明 var(例如,庫存、劇本、角色默認值或變量、外部文件...)。
該解決方案使用json_query
(需要在控制器上安裝額外的集合和 pip 模塊,請參閱文檔),因為items2dict
無法使用嵌套元素作為鍵/值引用。
解決方案中的map('flatten')
是 jmespath(由json_query
使用的庫map('flatten')
中的“錯誤”的解決方法,該錯誤無法直接解決subelements
返回的元組:它將每個元素轉換為一個列表,其中索引可以正確使用json_query
我沒有花時間看看索引是否可以像您要求的那樣轉換為整數。 按items2dict
,最終的items2dict
將它們轉換回字符串表示形式。 如果這是不可接受的,您將不得不進一步搜索。
注意:以下示例適用於 ansible >= 2.10。 對於舊版本,您必須在dict2
表達式中粘貼一些中間list
過濾器。
劇本:
- hosts: localhost
gather_facts: false
vars:
dict1: {'a':[1,2,3],'b':[4,5,6]}
transform_q: >-
[*].{"key": [1], "value": [0].key}
dict2: "{{ dict1 | dict2items | subelements('value') | map('flatten')
| json_query(transform_q) | items2dict }}"
tasks:
- debug:
var: dict2
給出:
PLAY [localhost] *******************************************************************************************
TASK [debug] ***********************************************************************************************
ok: [localhost] => {
"dict2": {
"1": "a",
"2": "a",
"3": "a",
"4": "b",
"5": "b",
"6": "b"
}
}
PLAY RECAP *************************************************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
例如
- set_fact:
dict2: "{{ dict2|d({})|
combine(dict(item.value|product([item.key]))) }}"
loop: "{{ dict1|dict2items }}"
給
dict2:
1: a
2: a
3: a
4: b
5: b
6: b
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.