Ansible教程:如何合并字典列表?
Ansible 合并字典列表为单字典用于API调用
需求:将一组字典列表合并为单个字典,仅Host字段值不同,需将所有Host值合并为列表,其余字段取最后一个字典的对应值。
输入示例
[ { "Batch_number": "Batch1", "Date": "20221228", "Host": "Host1", "Job_Template_ID": 7, "Patch_Cycle": 30, "Patch_Day": "Day1", "RRule": "INTERVAL=1;COUNT=1;FREQ=MINUTELY", "Recurrency": "Once", "Start_Time": "17:00:00", "Technical_Tower": "Unix", "Timezone": "Asia/Culcutta" }, { "Batch_number": "Batch1", "Date": "20221230", "Host": "Host11", "Job_Template_ID": 7, "Patch_Cycle": 30, "Patch_Day": "Day2", "RRule": "INTERVAL=1;COUNT=1;FREQ=MINUTELY", "Recurrency": "Once", "Start_Time": "17:00:00", "Technical_Tower": "Unix", "Timezone": "Asia/Culcutta" }, { "Batch_number": "Batch1", "Date": "20230101", "Host": "Host21", "Job_Template_ID": 7, "Patch_Cycle": 30, "Patch_Day": "Day3", "RRule": "INTERVAL=1;COUNT=1;FREQ=MINUTELY", "Recurrency": "Once", "Start_Time": "17:00:00", "Technical_Tower": "Unix", "Timezone": "Asia/Culcutta" }, { "Batch_number": "Batch1", "Date": "20230103", "Host": "Host31", "Job_Template_ID": 7, "Patch_Cycle": 30, "Patch_Day": "Day4", "RRule": "INTERVAL=1;COUNT=1;FREQ=MINUTELY", "Recurrency": "Once", "Start_Time": "17:00:00", "Technical_Tower": "Unix", "Timezone": "Asia/Culcutta" } ]
预期输出
{ "Batch_number": "Batch1", "Date": "20230103", "Host": ["Host1","Host11","Host21","Host31"], "Job_Template_ID": 7, "Patch_Cycle": 30, "Patch_Day": "Day4", "RRule": "INTERVAL=1;COUNT=1;FREQ=MINUTELY", "Recurrency": "Once", "Start_Time": "17:00:00", "Technical_Tower": "Unix", "Timezone": "Asia/Culcutta" }
实现方案
通过Ansible的set_fact结合过滤器完成合并:
- name: 合并字典列表为单字典 hosts: localhost vars: input_list: [ { "Batch_number": "Batch1", "Date": "20221228", "Host": "Host1", "Job_Template_ID": 7, "Patch_Cycle": 30, "Patch_Day": "Day1", "RRule": "INTERVAL=1;COUNT=1;FREQ=MINUTELY", "Recurrency": "Once", "Start_Time": "17:00:00", "Technical_Tower": "Unix", "Timezone": "Asia/Culcutta" }, { "Batch_number": "Batch1", "Date": "20221230", "Host": "Host11", "Job_Template_ID": 7, "Patch_Cycle": 30, "Patch_Day": "Day2", "RRule": "INTERVAL=1;COUNT=1;FREQ=MINUTELY", "Recurrency": "Once", "Start_Time": "17:00:00", "Technical_Tower": "Unix", "Timezone": "Asia/Culcutta" }, { "Batch_number": "Batch1", "Date": "20230101", "Host": "Host21", "Job_Template_ID": 7, "Patch_Cycle": 30, "Patch_Day": "Day3", "RRule": "INTERVAL=1;COUNT=1;FREQ=MINUTELY", "Recurrency": "Once", "Start_Time": "17:00:00", "Technical_Tower": "Unix", "Timezone": "Asia/Culcutta" }, { "Batch_number": "Batch1", "Date": "20230103", "Host": "Host31", "Job_Template_ID": 7, "Patch_Cycle": 30, "Patch_Day": "Day4", "RRule": "INTERVAL=1;COUNT=1;FREQ=MINUTELY", "Recurrency": "Once", "Start_Time": "17:00:00", "Technical_Tower": "Unix", "Timezone": "Asia/Culcutta" } ] tasks: - name: 提取所有Host值组成列表 set_fact: host_list: "{{ input_list | map(attribute='Host') | list }}" - name: 以最后一个字典为基础合并生成目标字典 set_fact: merged_dict: "{{ input_list[-1] | combine({'Host': host_list}) }}" - name: 输出合并后的结果 debug: var: merged_dict
逻辑说明
- 使用
map(attribute='Host')过滤器从输入列表的每个字典中提取Host值,再转为列表; - 取输入列表的最后一个字典
input_list[-1]作为基础结构; - 用
combine方法将基础字典的Host字段替换为合并后的host_list,得到最终的目标字典。
内容的提问来源于stack exchange,提问作者Koushik Padmanaban
相关产品推荐
相关产品推荐

