簡體   English   中英

將 ansible 字典列表值轉換為鍵,將鍵轉換為值

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

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