如何用Ansible的set_fact模块重组VM列表为指定结构?
使用Ansible将VM列表按订阅ID聚合重组
你可以通过groupby过滤器结合set_fact模块实现这个需求,同时对VM列表做反转排序来匹配目标结构:
原始数据
"myVms": [ { "SubscriptionId": "564aba40-77683-4426-84ac-d195769c826c", "VirtualMachine": "K606WS625" }, { "SubscriptionId": "564aba40-77683-4426-84ac-d195769c826c", "VirtualMachine": "K606WS626" }, { "SubscriptionId": "564aba40-77683-4426-84ac-d195769c826c", "VirtualMachine": "K606WS812" }, { "SubscriptionId": "564aba40-77683-4426-84ac-d195769c826c", "VirtualMachine": "K606WS817" } ]
目标结构
"myVmsModified": [ { "SubscriptionId": "564aba40-77683-4426-84ac-d195769c826c", "MyBeautifulVms": [ "K606WS817", "K606WS812", "K606WS626", "K606WS625" ] } ]
实现Playbook示例
原生Ansible写法(无需额外集合)
- name: 聚合VM列表 hosts: localhost vars: myVms: - SubscriptionId: "564aba40-77683-4426-84ac-d195769c826c" VirtualMachine: "K606WS625" - SubscriptionId: "564aba40-77683-4426-84ac-d195769c826c" VirtualMachine: "K606WS626" - SubscriptionId: "564aba40-77683-4426-84ac-d195769c826c" VirtualMachine: "K606WS812" - SubscriptionId: "564aba40-77683-4426-84ac-d195769c826c" VirtualMachine: "K606WS817" tasks: - name: 生成聚合后的VM列表 set_fact: myVmsModified: >- {% set aggregated = [] %} {% for sub_id, vm_entries in myVms | groupby('SubscriptionId') %} {% set vm_names = vm_entries | map(attribute='VirtualMachine') | reverse | list %} {% set _ = aggregated.append({ 'SubscriptionId': sub_id, 'MyBeautifulVms': vm_names }) %} {% endfor %} {{ aggregated }} - name: 输出结果 debug: var: myVmsModified
核心逻辑说明
groupby('SubscriptionId'):将原始列表按订阅ID分组,得到(订阅ID, [该订阅下的所有VM条目])格式的分组对map(attribute='VirtualMachine'):从每个VM条目中提取名称字段reverse:反转VM名称列表的顺序,匹配目标结构的排序要求- 遍历分组结果,将订阅ID和处理后的VM名称列表组装成字典,最终汇总为目标格式的列表
内容的提问来源于stack exchange,提问作者KWC
相关产品推荐
相关产品推荐

