如何用Ansible将VMware集群与主机信息整合成指定字典?
实现集群-主机名映射字典的Ansible方案
根据你已有的VMware集群与主机原始数据,分两种常见场景给出实现方法:
场景1:原始数据是主机列表(含集群名字段)
如果你的原始数据是从vmware_host_info等模块获取的、每条包含主机名和所属集群的列表,比如:
hosts_data: - cluster_name: PQR-CLU01 name: PQR-cn0001.myhost.com - cluster_name: PQR-CLU01 name: PQR-cn0002.myhost.com - cluster_name: ABC-CLU01 name: ABC-cn0002.myhost.com - cluster_name: ABC-CLU01 name: ABC-cn0001.myhost.com
使用Ansible的过滤器组合转换为目标字典:
- name: 生成集群-主机映射字典 set_fact: cluster_hosts_dict: >- {{ hosts_data | groupby('cluster_name') | items2dict(key_name=0, value_name=1) | dict2items | map('combine', {'value': item.value | map(attribute='name') | list}) | items2dict(key_name='key', value_name='value') }} - name: 验证输出结果 debug: var: cluster_hosts_dict
步骤解释:
groupby('cluster_name'):按集群名将主机数据分组,得到(集群名, 该集群下主机条目列表)的元组集合items2dict(...):将分组结果转换为字典,此时值为完整的主机条目列表dict2items:将字典转回条目列表,方便批量处理每个集群的主机数据map('combine', ...):提取每个主机条目里的name字段,替换原字典的值为纯主机名列表items2dict(...):重新转换为目标格式的字典
场景2:原始数据是集群列表(含主机名字段)
如果你的原始数据是从vmware_cluster_info等模块获取的、每条包含集群名和对应主机列表的集合,比如:
clusters_data: - cluster_name: PQR-CLU01 hosts: - PQR-cn0001.myhost.com - PQR-cn0002.myhost.com - cluster_name: ABC-CLU01 hosts: - ABC-cn0002.myhost.com - ABC-cn0001.myhost.com
转换逻辑更简洁,直接用items2dict过滤器提取对应字段:
- name: 生成集群-主机映射字典 set_fact: cluster_hosts_dict: "{{ clusters_data | items2dict(key_name='cluster_name', value_name='hosts') }}" - name: 验证输出结果 debug: var: cluster_hosts_dict
执行后就能得到你需要的格式:
{'PQR-CLU01': ['PQR-cn0001.myhost.com','PQR-cn0002.myhost.com'],'ABC-CLU01':['ABC-cn0002.myhost.com','ABC-cn0001.myhost.com']}
内容的提问来源于stack exchange,提问作者devopstechy
相关产品推荐
相关产品推荐

