如何使用Ansible 2.4.4基于键值对合并两个哈希列表
如何在Ansible 2.4.4中基于guid合并两个哈希列表?
在Ansible 2.4.4里要基于guid合并这两个哈希列表其实不难,咱们可以用内置的过滤器和set_fact模块来实现,具体步骤如下:
示例数据
先把你给出的示例数据整理成规范的YAML格式:
foo: - hostname: "web1.example.com" guid: "73e85eb2-2ad5-4699-8a09-adf658a11ff2" - hostname: "web2.example.com" guid: "827025fe-f13c-4fc8-ba51-7ff582596bbd" - hostname: "web3.example.com" guid: "bba27304-c1bb-4889-aa44-125626be8488" bar: - ipaddress: "1.1.1.1" guid: "73e85eb2-2ad5-4699-8a09-adf658a11ff2" - ipaddress: "2.2.2.2" guid: "827025fe-f13c-4fc8-ba51-7ff582596bbd"
解决方案
用set_fact模块结合Jinja2过滤器来实现合并,具体Playbook任务如下:
- name: 基于guid合并foo和bar列表 set_fact: merged_list: > {% set merged = [] %} {% for item in foo %} {% set matched_ip = bar | selectattr('guid', 'equalto', item.guid) | first | default({}) %} {% do merged.append(item | combine(matched_ip)) %} {% endfor %} {{ merged }}
代码解释
- 首先初始化一个空列表
merged用来存放合并后的结果 - 遍历
foo中的每一个条目,针对每个条目:- 用
selectattr过滤器从bar中筛选出guid与当前条目完全匹配的项,first取第一个匹配结果(因为guid是唯一标识,所以只会有一个) default({})用来处理没有匹配项的情况(比如示例中的web3,在bar里没有对应IP,就用空字典合并,避免报错)- 用
combine过滤器把当前foo条目和匹配到的IP条目合并,再添加到merged列表中
- 用
- 最后把合并好的
merged列表赋值给merged_list变量
合并后的结果
执行完上述任务后,merged_list的内容会是:
merged_list: - hostname: "web1.example.com" guid: "73e85eb2-2ad5-4699-8a09-adf658a11ff2" ipaddress: "1.1.1.1" - hostname: "web2.example.com" guid: "827025fe-f13c-4fc8-ba51-7ff582596bbd" ipaddress: "2.2.2.2" - hostname: "web3.example.com" guid: "bba27304-c1bb-4889-aa44-125626be8488"
内容的提问来源于stack exchange,提问作者user9754084
相关产品推荐
相关产品推荐

