如何在YAML中使用if-else?基于ENV变量选择执行Ansible Playbook
基于环境变量ENV实现条件执行的方案
方案1:在Shell命令中嵌入条件判断
这是通用方案,适用于所有支持Shell执行的YAML环境(比如各类CI/CD系统)。通过在script中编写Shell的if逻辑,控制对应playbook的执行:
script: - ansible-playbook -i <dir> pqr.yaml --verbose -f 10 -e "ENV=${ENV}.... " # 仅当ENV为abc时执行abc.yaml - | if [ "${ENV}" = "abc" ]; then ansible-playbook -i <dir> abc.yaml --verbose -f 10 -e "ENV=${ENV}.... " fi # 仅当ENV为xyz时执行xyz.yaml - | if [ "${ENV}" = "xyz" ]; then ansible-playbook -i <dir> xyz.yaml --verbose -f 10 -e "ENV=${ENV}.... " fi - ansible-playbook -i <dir> hjk.yaml --verbose -f 10 -e "ENV=${ENV}.... "
- 用
|定义多行Shell命令,实现完整的条件判断逻辑; pqr.yaml和hjk.yaml不受环境变量影响,始终执行;- 确保
ENV变量已正确传递到执行环境中。
方案2:利用CI/CD系统原生YAML条件(以GitLab CI为例)
如果使用的是GitLab CI、GitHub Actions这类自带条件支持的CI/CD工具,可以将playbook执行拆分为独立Job,通过原生条件语法控制执行:
stages: - deploy deploy-pqr: stage: deploy script: - ansible-playbook -i <dir> pqr.yaml --verbose -f 10 -e "ENV=${ENV}.... " deploy-abc: stage: deploy script: - ansible-playbook -i <dir> abc.yaml --verbose -f 10 -e "ENV=${ENV}.... " rules: - if: '$ENV == "abc"' deploy-xyz: stage: deploy script: - ansible-playbook -i <dir> xyz.yaml --verbose -f 10 -e "ENV=${ENV}.... " rules: - if: '$ENV == "xyz"' deploy-hjk: stage: deploy script: - ansible-playbook -i <dir> hjk.yaml --verbose -f 10 -e "ENV=${ENV}.... "
- 每个playbook对应一个独立Job,通过
rules中的if条件判断是否执行; - 不同CI/CD系统的条件语法有差异:比如GitHub Actions使用
if: env.ENV == 'abc',需根据实际环境调整; - 此方案便于单独监控每个Job的执行状态,符合CI/CD最佳实践。
内容的提问来源于stack exchange,提问作者Shivani
相关产品推荐
相关产品推荐

