如何自动调用配置环境变量的脚本?Jenkins+Git场景技术问询
实现无硬编码IP的环境/应用映射脚本方案
我来给你几个实用的实现思路,都是适配Jenkins环境、能彻底避免硬编码IP的方案,而且都能很好地实现代码复用:
思路1:用代码仓库中的配置文件存储映射关系
这是最直观也最容易维护的方案——把环境+应用对应的IP存在一个单独的配置文件里,和代码一起提交到Git仓库,Jenkins拉取代码时自然会同步这个配置文件。修改IP只需要更新配置文件,不用动脚本本身,完美实现复用。
首先在你的代码仓库里新建一个配置文件,比如env_app_ips.conf:
# env_app_ips.conf 格式:环境_应用=IP地址 stage_app1=192.168.1.10 stage_app2=192.168.1.11 prod_app1=10.0.0.10 prod_app2=10.0.0.11
然后修改你的脚本,整合参数解析和配置读取逻辑:
#!/bin/bash # 初始化变量 ENVIRONMENT="" APPLICATION="" TARGET_IP="" # 解析命令行参数 while [[ $# -gt 0 ]]; do OPTION="$1" case $OPTION in -e|--environment) ENVIRONMENT="$2" shift 2 # 跳过参数名和参数值 ;; -a|--application) APPLICATION="$2" shift 2 ;; *) echo "未知参数: $1" exit 1 ;; esac done # 校验必要参数 if [[ -z "$ENVIRONMENT" || -z "$APPLICATION" ]]; then echo "用法: $0 -e <环境(stage/prod)> -a <应用名称>" exit 1 fi # 读取配置文件获取目标IP CONFIG_FILE="./env_app_ips.conf" if [[ -f "$CONFIG_FILE" ]]; then # 匹配对应的键值对,提取IP TARGET_IP=$(grep "^${ENVIRONMENT}_${APPLICATION}=" "$CONFIG_FILE" | awk -F '=' '{print $2}') else echo "错误:配置文件 $CONFIG_FILE 不存在!" exit 1 fi # 校验IP是否获取成功 if [[ -z "$TARGET_IP" ]]; then echo "错误:未找到环境 ${ENVIRONMENT} 下应用 ${APPLICATION} 的对应IP!" exit 1 fi # 后续就可以用TARGET_IP做你需要的操作了,比如部署、SSH连接等 echo "已获取目标IP: $TARGET_IP"
思路2:利用Jenkins的全局变量/凭据存储
如果你的生产环境IP比较敏感,不想把它放在Git仓库里,那可以用Jenkins的全局变量或者凭据系统来存储IP,脚本直接从Jenkins的环境变量中读取。
全局变量方式:
- 进入Jenkins系统管理 → 系统配置,找到「全局属性」,勾选「环境变量」,添加对应的变量,比如:
STAGE_APP1_IP=192.168.1.10PROD_APP1_IP=10.0.0.10
- 修改脚本中读取IP的部分,替换成:
# 拼接Jenkins环境变量名(通常Jenkins变量用大写) VAR_NAME="${ENVIRONMENT^^}_${APPLICATION^^}_IP" # 间接引用变量获取IP TARGET_IP="${!VAR_NAME}" if [[ -z "$TARGET_IP" ]]; then echo "错误:Jenkins中未配置 ${VAR_NAME} 全局变量!" exit 1 fi
凭据方式(更安全):
- 进入Jenkins凭据管理,添加「Secret text」类型的凭据,ID设为
stage-app1-ip,值填对应IP; - 在你的Jenkins Pipeline中,先把凭据注入为环境变量,再调用脚本:
pipeline { agent any environment { STAGE_APP1_IP = credentials('stage-app1-ip') PROD_APP1_IP = credentials('prod-app1-ip') } stages { stage('Deploy') { steps { sh './script.sh -e stage -a app1' } } } }
脚本部分和全局变量方式一致即可。
思路3:使用内部DNS服务解析IP
如果你们公司有内部DNS服务,可以把环境+应用映射成专属域名(比如app1.stage.internal、app1.prod.internal),脚本通过DNS解析直接获取IP。这种方案不需要维护任何配置文件,IP变更只需要修改DNS记录就行,适合动态IP的场景。
修改脚本中读取IP的部分为:
# 拼接内部域名 DOMAIN="${APPLICATION}.${ENVIRONMENT}.internal" # 用dig解析域名,取第一个IP TARGET_IP=$(dig +short "$DOMAIN" | head -n 1) if [[ -z "$TARGET_IP" ]]; then echo "错误:无法解析域名 ${DOMAIN} 的IP!" exit 1 fi
如果没有dig命令,也可以用nslookup "$DOMAIN" | grep Address | tail -n 1 | awk '{print $2}'来替代。
内容的提问来源于stack exchange,提问作者bonafide
相关产品推荐
相关产品推荐

