Gitlab CI/CD动态创建并保存SSH密钥对为项目变量的方案问询
问题2:Terraform方案的高效工作流与循环避免
高效工作流步骤
- 生成SSH密钥:在CI job的脚本阶段生成密钥对:
ssh-keygen -b 4096 -N '' -q -f ~/.ssh/id_rsa <<< y - 动态生成Terraform配置:根据服务器名称生成
gitlab_ssh_keys.tf文件,写入gitlab_project_variable资源定义,关联生成的密钥:cat <<EOF > ${serverName}/gitlab_ssh_keys.tf resource "gitlab_project_variable" "${serverName}_ssh_private_key" { project = "${CI_PROJECT_ID}" key = "${serverName}_private_ssh_key" value = chomp(file("~/.ssh/id_rsa")) protected = true type = "file" } resource "gitlab_project_variable" "${serverName}_ssh_public_key" { project = "${CI_PROJECT_ID}" key = "${serverName}_ssh_public_key" value = chomp(file("~/.ssh/id_rsa.pub")) protected = true } EOF - 初始化Terraform:配置GitLab Provider并初始化,使用项目访问令牌作为认证凭据:
cat <<EOF > provider.tf provider "gitlab" { token = "${PROJECT_ACCESS_TOKEN}" } EOF terraform init - 应用配置并提交文件:执行
terraform apply创建CI/CD变量,随后将生成的Terraform配置文件提交到仓库:
销毁基础设施时,Terraform会自动删除对应的terraform apply -auto-approve git config user.name "CI Pipeline Bot" git config user.email "ci-bot@example.com" git add ${serverName}/gitlab_ssh_keys.tf git commit -m "Add SSH key config for ${serverName} [skip ci]" git push https://oauth2:${PROJECT_ACCESS_TOKEN}@${CI_REPOSITORY_URL#*@} HEAD:${CI_COMMIT_BRANCH}gitlab_project_variable资源,同步清理CI变量,无需额外脚本处理。
避免管道循环的方案
[skip ci]提交标记:这是最直接且仍有效的方案,GitLab会自动跳过包含该标记的提交触发的管道,从根源避免循环。- CI工作流规则过滤:在
.gitlab-ci.yml中配置规则,排除动态生成的Terraform文件变更触发管道:workflow: rules: - if: '$CI_COMMIT_MESSAGE =~ /\[skip ci\]/' when: never - if: '$CI_PIPELINE_SOURCE == "push"' changes: - 'iac/**/*.tf' - '!.gitlab-ci.yml' - '!iac/server*/gitlab_ssh_keys.tf' - 独立分支管理:将动态生成的配置提交到专门的辅助分支(如
ci-configs),而非主分支,主分支仅在手动触发或核心配置变更时运行管道,避免自动循环。
内容的提问来源于stack exchange,提问作者user658182
相关产品推荐
相关产品推荐

