如何解决Ansible自定义Python过滤器追加参数被覆盖及重复键更新问题
问题根源
- 原有代码缩进错误,且
parameters判断逻辑完全错误:你尝试捕获的是全局作用域的parameters变量,而非当前遍历条目下的parameters属性,导致每次命中目标order_number时都会触发NameError,强制新建空的parameters列表,原有参数自然被覆盖。 - 原有代码只将命中
order_number的条目加入返回结果,其余未命中的条目会被丢弃,存在数据丢失风险。 - 没有重复键检测逻辑,即使参数键已存在也会直接追加新字典,导致同键重复。
修正后的Python过滤器代码
#!/usr/bin/python class FilterModule(object): def filters(self): return { 'add_item': self.add_item } def add_item(self, obj, order_number, parameter_key, parameter_value): result = [] for r in obj: # 不匹配目标序号的条目直接保留 if r['order_number'] != order_number: result.append(r) continue # 匹配到目标条目,处理参数 # 先获取已有的parameters列表,没有则初始化 if 'parameters' not in r: parameters = [] else: parameters = r['parameters'] # 检查是否已存在对应键,存在则更新 key_existed = False for param in parameters: if parameter_key in param: param[parameter_key] = parameter_value key_existed = True break # 键不存在则追加新条目 if not key_existed: parameters.append({parameter_key: parameter_value}) # 更新条目的parameters属性 r['parameters'] = parameters result.append(r) return result
逻辑说明
- 所有未命中目标
order_number的条目直接原样保留,避免原有数据丢失 - 优先读取目标条目已有的
parameters列表,不存在才初始化空列表,不会覆盖原有参数 - 追加新参数前先遍历现有参数列表,检测到相同键直接更新值,不会生成重复键条目
- 多次调用过滤器时会在原有参数基础上追加,符合需求
内容的提问来源于stack exchange,提问作者ZZTest
相关产品推荐
相关产品推荐

