如何在Azure Pipeline中遍历变量模板文件内的所有变量
动态遍历YAML变量批量替换文件值的实现方案
推荐使用yq(YAML专用命令行处理工具)实现需求,整个逻辑不需要单独指定任何变量名,新增变量仅需在test_env_template.yml中添加对应条目即可,适配任意数量的动态变量。
前置准备:安装yq
各系统安装命令参考:
- Debian/Ubuntu:
sudo apt install yq - macOS:
brew install yq - Windows:
winget install mikefarah.yq
通用Shell场景实现
以下脚本会遍历模板中所有变量,批量替换目标文件中的对应占位符,可直接使用:
#!/bin/bash # 定义目标文件路径,替换成你自己的文件路径 TARGET_FILE="your_config_template.conf" # 遍历YAML中的所有变量做批量替换 while IFS='=' read -r var_name var_value; do # 此处匹配的是{{变量名}}格式的占位符,可根据你的实际占位符格式修改匹配规则 sed -i "s|{{${var_name}}}|${var_value}|g" "${TARGET_FILE}" done < <(yq eval '.variables[] | .name + "=" + .value' test_env_template.yml)
CI/CD场景实现(GitLab CI/GitHub Actions通用)
如果是在CI流水线中使用,可以直接将模板变量导出为环境变量,配合envsubst实现零配置批量替换:
# CI配置片段示例 deploy_job: script: # 将YAML模板中的所有变量导出为当前Shell的环境变量 - eval $(yq eval '.variables[] | "export " + .name + "=\"" + .value + "\""' test_env_template.yml) # 直接替换目标文件中所有${变量名}/$变量名格式的占位符,无需指定单个变量 - envsubst < config_template.conf > final_config.conf
无额外依赖实现方案(不推荐,仅适用于YAML格式固定的场景)
如果不想安装额外工具,可以用awk实现基础遍历替换,稳定性弱于yq方案:
awk ' /^- name: / { cur_var = $3 } /^ value: / { cur_val = substr($0, 10) system("sed -i \"s/{{" cur_var "}}/" cur_val "/g\" your_target_file") } ' test_env_template.yml
内容的提问来源于stack exchange,提问作者JCDani
相关产品推荐
相关产品推荐

