如何基于子字典中username键存在性通用过滤Ansible字典
通用型Ansible凭证过滤优化方案
问题背景
原Ansible任务通过硬编码的键名列表筛选需要处理的凭证项,这种方式灵活性不足,无法适配其他结构类似但键名不同的schema。需要实现一种通用方案,仅通过检查子字典中是否存在username键来过滤数据。
优化方案
核心思路是直接在循环中通过属性筛选实现动态过滤,无需指定具体键名:
- 将目标字典转换为键值对列表
- 筛选出值为字典类型的项
- 进一步筛选出包含
username键的子字典项
优化后代码示例
- name: 'Process credentials' ansible.builtin.include_role: name: 'mycollection.generic' tasks_from: 'user/{{ item.value.vault }}.yml' loop: '{{ input_parameters.mssql.setupconfig | dict2items | selectattr("value", "mapping") | selectattr("value.username", "defined") }}'
方案说明
dict2items:将setupconfig字典转换为{key: "...", value: {...}}格式的键值对列表,方便后续筛选操作selectattr('value', 'mapping'):确保仅处理值为字典类型的项,避免非字典结构导致的执行错误selectattr('value.username', 'defined'):精准匹配包含username键的子字典,完全不依赖具体键名,适配任意类似结构的schema
如果需要排除username键存在但值为空的情况,可以追加筛选条件:
loop: '{{ input_parameters.mssql.setupconfig | dict2items | selectattr("value", "mapping") | selectattr("value.username", "defined") | selectattr("value.username", "!=", "") }}'
内容的提问来源于stack exchange,提问作者Daniel Koerner
相关产品推荐
相关产品推荐

