如何使用Ansible Jinja2过滤Molecule中指定分组的平台配置条目
实现方案
1. 核心过滤逻辑
通过Ansible Jinja2过滤器组合即可实现按分组过滤需求,逻辑分为两步:
- 读取
MOLECULE_GROUP环境变量,兼容未传变量的场景(默认不过滤所有配置) - 筛选
groups字段包含指定分组的platform条目
2. 编排文件修改示例
以create.yml为例,在文件最开头添加变量覆写逻辑,destroy.yml、converge.yml等其余自定义编排文件添加相同逻辑即可:
--- - name: Create hosts: localhost connection: local gather_facts: false vars: # 读取环境变量,未设置时默认值为空 MOLECULE_GROUP: "{{ lookup('env', 'MOLECULE_GROUP') | default('', true) }}" pre_tasks: - name: 按分组过滤platforms配置 set_fact: # 覆写molecule_yml的platforms字段 molecule_yml: "{{ molecule_yml | combine({'platforms': filtered_platforms}) }}" vars: filtered_platforms: >- {% if MOLECULE_GROUP | length > 0 %} {{ molecule_yml.platforms | selectattr('groups', 'contains', MOLECULE_GROUP, default=[]) | list }} {% else %} {{ molecule_yml.platforms }} {% endif %} # 后续保留molecule原有执行逻辑即可 roles: - role: molecule.default.create
低版本Jinja2兼容写法
如果运行环境Jinja2版本低于2.11,不支持selectattr的default参数,可替换过滤逻辑为:
{{ molecule_yml.platforms | map('combine', {'groups': []}) | list | selectattr('groups', 'contains', MOLECULE_GROUP) | list }}
3. 验证使用
执行命令时添加环境变量前缀即可按分组执行:MOLECULE_GROUP=testme molecule test
- 未指定
MOLECULE_GROUP时默认保留所有platform配置,不影响原有使用逻辑 - 指定不存在的分组时会得到空platform列表,Molecule自动跳过执行符合预期
内容的提问来源于stack exchange,提问作者HeyMegabyte
相关产品推荐
相关产品推荐

