用于多个项目的 Terraform 和 Gitlab CI 管道
Posted
技术标签:
【中文标题】用于多个项目的 Terraform 和 Gitlab CI 管道【英文标题】:Terraform and Gitlab CI pipeline for multiple projects 【发布时间】:2021-10-09 06:31:13 【问题描述】:我们有一个现有的适用于 Terraform 的 Gitlab CI EE 管道,可以一次运行一个环境,每个环境都在不同的 AWS 账户中。
但是,我们希望能够为使用 TF 满足其 IaC 要求的不同团队扩展管道。
有办法吗?每个团队有不同的 IaC 存储库/分支,使用相同的管道来处理 TF 部署,使用 S3 作为后端?
还有其他方法吗?我们有 Gitlab CI EE 和 Terraform 开源版本。
【问题讨论】:
【参考方案1】:我做了类似的事情。
每个 terraform 模块都有多个存储库和一个调用每个模块 You can check how to do it here 的主存储库,在这个主存储库中我有这样的东西:
- dev/
- main.tf
- variables.tf
- dev.tfvars
- backend.tf
- test/
- prd/
- .gitlab-ci.yml
每个环境都有自己的文件夹/文件,其中包含运行所需的 s3 和变量。主文件是调用所有其他 repos 的地方。管道在检测到路径更改时触发,并根据提交分支在环境中进行初始化:
include:
- template: Terraform/Base.latest.gitlab-ci.yml
before_script:
- echo "$CI_COMMIT_BRANCH"
- mkdir -p ~/.ssh
- touch ~/.ssh/known_hosts
- echo "$SSH_PUBLIC_KEY" > ~/.ssh/id_rsa.pub #this is to allow the main repository to get the information from the other ones, all of them are private
- echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa
- echo "$KNOWN_HOSTS" > ~/.ssh/known_hosts
- terraform --version
stages:
- init
init:
stage: init
environment: $CI_COMMIT_BRANCH
script:
- terraform init # just an example
rules:
- if: $CI_COMMIT_BRANCH == "dev" || $CI_COMMIT_BRANCH == "tst" || $CI_COMMIT_BRANCH == "prd"
changes:
- dev/*
- tst/*
- prd/*
我必须说这不是最好的方法,有一些“安全”点需要提及,但可以通过一些巧妙的方法来解决,例如:我已经理解 backend.tf 不应该是显式的在每个文件夹中都没有 .tfvars 文件。有人告诉我,使用 terraform Enterprise 可以解决这些问题。另一个“肮脏的事情”是存在重复的代码,因为每个环境文件夹都包含相同的主文件、输出和变量。
到目前为止,我的做法是有效的。我希望这可以给你一个想法:) 祝你好运。
【讨论】:
以上是关于用于多个项目的 Terraform 和 Gitlab CI 管道的主要内容,如果未能解决你的问题,请参考以下文章