【问题标题】:ansible - list with item index as hashansible - 以项目索引作为哈希的列表
【发布时间】:2021-06-25 11:19:57
【问题描述】:

我正在尝试将列表元素索引添加为哈希,最好不使用 with_indexed_items,因为稍后将过滤结果。

我想转换这个:

vmware_disks:
- datastore: "datastores0"
  size_gb: 24
- datastore: "datastores0"
  size_gb: 397
  storage_policy: "vSAN standard cluster RAID-1"

到这样的事情:

vmware_disks:
- datastore: "datastores0"
  size_gb: 24
  nr: 0
- datastore: "datastores0"
  size_gb: 397
  storage_policy: "vSAN standard cluster RAID-1"
  nr: 1

到目前为止,我能够:

  • 使用"{{ vmware_disks | zip(range(0,2)) }}"
    [     
      {   
        "datastore": "datastores0",
        "size_gb": 24
      },  
      0   
    ],    
    [     
      {   
        "datastore": "datastores0",
        "size_gb": 397,
        "storage_policy": "vSAN standard cluster RAID-1"
      },  
      1   
    ]     
    
  • "{{ vmware_disks | map('combine', {'nr':0}) }}"
    [
      {
        "datastore": "datastores0",
        "nr": 0,
        "size_gb": 24
      },
        {
          "datastore": "datastores0",
        "nr": 0,
        "size_gb": 397,
        "storage_policy": "vSAN standard cluster RAID-1"
      }
    ]
    

请帮助我将两者结合起来以获得所需的结果。

【问题讨论】:

    标签: list dictionary indexing ansible


    【解决方案1】:

    您可以使用set_fact 创建另一个字典并将索引添加到:

    - set_fact: 
        indexed_vmware_disks: >-
          {{ 
            indexed_vmware_disks | default([]) 
              + [ item | combine( { 'nr': index } ) ] 
          }}
      loop: "{{ vmware_disks }}"
      loop_control:
        index_var: index
    

    然后,如果您确实需要字典具有以前的确切名称,则可以将其重新分配到另一个 set_fact

    所以一个示例剧本:

    - hosts: all
      gather_facts: no
      vars:
        vmware_disks:
          - datastore: "datastores0"
            size_gb: 24
          - datastore: "datastores0"
            size_gb: 397
            storage_policy: "vSAN standard cluster RAID-1"
    
      tasks:
        - set_fact: 
            indexed_vmware_disks: >-
              {{ 
                indexed_vmware_disks | default([]) 
                  + [ item | combine( { 'nr': index } ) ] 
              }}
          loop: "{{ vmware_disks }}"
          loop_control:
            index_var: index
    
        - set_fact: 
            vmware_disks: "{{ indexed_vmware_disks }}"
    
        - debug:
            var: vmware_disks
    

    会产生回顾:

    PLAY [all] *******************************************************************************************************
    
    TASK [set_fact] **************************************************************************************************
    ok: [localhost] => (item={'datastore': 'datastores0', 'size_gb': 24})
    ok: [localhost] => (item={'datastore': 'datastores0', 'size_gb': 397, 'storage_policy': 'vSAN standard cluster RAID-1'})
    
    TASK [set_fact] **************************************************************************************************
    ok: [localhost]
    
    TASK [debug] *****************************************************************************************************
    ok: [localhost] => 
      vmware_disks:
      - datastore: datastores0
        nr: 0
        size_gb: 24
      - datastore: datastores0
        nr: 1
        size_gb: 397
        storage_policy: vSAN standard cluster RAID-1
    
    PLAY RECAP *******************************************************************************************************
    localhost                  : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    

    【讨论】:

    • 我希望有“oneline”解决方案,因为它在其他列表(即网络接口)中可能非常有用。你提议的那个可以完成这项工作,谢谢。
    猜你喜欢
    • 2016-04-25
    • 2011-06-19
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    • 2012-01-03
    • 1970-01-01
    • 1970-01-01
    • 2017-03-26
    相关资源
    最近更新 更多