Gitlab CI/CD如何根据目标服务器动态调用对应SSH密钥文件变量
GitLab CI/CD 多服务器SSH连接优化方案
核心思路
既然GitLab 15.7之后禁用了文件变量间的直接引用,我们可以通过脚本动态读取对应密钥变量的内容,写入临时文件后再用于SSH连接,完全避免重复编写流水线代码。
可行方案步骤
1. 预定义服务器对应变量
在项目/组的CI/CD变量中,为每个服务器创建对应的文件变量:
- 密钥变量:
SSH_KEY_1、SSH_KEY_2...SSH_KEY_100,分别存储对应服务器的私钥内容 - 可选主机变量:
HOST_1、HOST_2...HOST_100,存储对应服务器的IP/域名
2. 编写通用流水线配置
只需要一套流水线代码,触发时通过手动输入的变量指定目标服务器:
deploy: stage: deploy variables: # 手动触发时填写目标服务器的标识(如1、2...100) TARGET_SERVER_ID: "" before_script: # 拼接对应密钥的变量名 - KEY_VAR="SSH_KEY_${TARGET_SERVER_ID}" # 将对应密钥变量的内容写入临时文件 - printenv "${KEY_VAR}" > /tmp/deploy_key # 设置SSH要求的密钥文件权限 - chmod 600 /tmp/deploy_key # 可选:动态读取目标主机地址 - HOST_VAR="HOST_${TARGET_SERVER_ID}" - export TARGET_HOST=$(printenv "${HOST_VAR}") script: # 使用临时密钥文件连接目标服务器执行命令 - ssh -o StrictHostKeyChecking=no -i /tmp/deploy_key -l user "${TARGET_HOST}" "ls -al" # 限制仅手动触发时运行(避免自动触发出错) rules: - if: $CI_PIPELINE_SOURCE == "web"
3. 触发流水线时指定目标
手动触发流水线时,在「变量」区域填写TARGET_SERVER_ID的值(比如1),流水线会自动读取SSH_KEY_1和HOST_1的内容完成连接。
其他可选优化
- 如果服务器数量多,可以把服务器标识、主机地址维护在项目内的配置文件(如
servers.yml),流水线中读取配置文件动态获取信息,减少CI/CD变量的数量 - 若需要批量部署,可结合GitLab的矩阵策略,一次性指定多个
TARGET_SERVER_ID值,同时部署多台服务器
内容的提问来源于stack exchange,提问作者posthumecaver
相关产品推荐
相关产品推荐

