能否基于自定义类别运行Ansible Molecule的部分场景?
Molecule场景级类别筛选实现方案
可以实现类似Ansible tags的场景筛选功能,Molecule本身没有内置--category参数,但通过给场景添加自定义标签+命令行筛选/脚本封装,就能满足你的需求,具体操作如下:
1. 给场景添加类别标签
在每个场景目录下的molecule.yml中,给scenario节点添加自定义tags字段,用来标记场景所属类别:
- scenario-1的
molecule.yml:
scenario: name: scenario-1 tags: - long-running
- scenario-3的
molecule.yml:
scenario: name: scenario-3 tags: - push - os-a
其他场景按同样方式配置对应的标签即可。
2. 命令行筛选场景
直接用jq工具筛选(无需脚本)
利用jq解析场景配置文件,提取符合标签的场景名称后传给Molecule:
筛选push类别场景
molecule test --scenario-name $(find molecule -name "molecule.yml" -exec jq -r '.scenario.tags[] as $tag | select($tag == "push") | .scenario.name' {} \; | sort -u)
该命令会自动匹配scenario-3和scenario-5并运行。
筛选os-a类别场景
molecule test --scenario-name $(find molecule -name "molecule.yml" -exec jq -r '.scenario.tags[] as $tag | select($tag == "os-a") | .scenario.name' {} \; | sort -u)
自动匹配scenario-2和scenario-3并运行。
筛选多个类别(或逻辑)
如果要同时匹配long-running和weekend类别(OR逻辑):
molecule test --scenario-name $(find molecule -name "molecule.yml" -exec jq -r '(.scenario.tags[] | select(. == "long-running" or . == "weekend")) as $tag | .scenario.name' {} \; | sort -u)
自动匹配scenario-1和scenario-4并运行。
封装脚本简化命令
为了避免每次输入长命令,可封装一个shell脚本molecule-category.sh:
#!/bin/bash CATEGORIES=$1 IFS=':' read -ra CAT_ARRAY <<< "$CATEGORIES" JQ_CONDITION="" for i in "${!CAT_ARRAY[@]}"; do if [ $i -eq 0 ]; then JQ_CONDITION=". == \"${CAT_ARRAY[$i]}\"" else JQ_CONDITION="$JQ_CONDITION or . == \"${CAT_ARRAY[$i]}\"" fi done SCENARIOS=$(find molecule -name "molecule.yml" -exec jq -r '(.scenario.tags[] | select('"$JQ_CONDITION"')) as $tag | .scenario.name' {} \; | sort -u) molecule test --scenario-name "$SCENARIOS"
给脚本添加执行权限:
chmod +x molecule-category.sh
之后就能用你期望的简洁命令调用:
- 运行push类别:
./molecule-category.sh push - 运行os-a类别:
./molecule-category.sh os-a - 运行long-running或weekend:
./molecule-category.sh long-running:weekend
3. 替代方案:环境变量控制
如果不想用外部工具,也可以在场景molecule.yml中通过env变量标记类别,再在playbook中加条件判断,但这种方式只能在provision阶段控制,不如直接筛选场景彻底,一般不推荐。
内容的提问来源于stack exchange,提问作者cdscap
相关产品推荐
相关产品推荐

