用于多个项目的 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 管道的主要内容,如果未能解决你的问题,请参考以下文章

使用 terraform 创建多个 GCP 存储桶

在 Terraform 管理的 AWS EC2 SSH 堡垒实例上处理多个用户的 SSH 密钥

使用 Azure 市场的 Terraform

从另一个 terraform 项目获取 VPC id

Terraform - 具有多个环境(区域)的多个帐户

如何使用一个 terraform 脚本和不同的变量值管理多个不同环境的部署