【问题标题】:Terraform and Gitlab CI pipeline for multiple projects用于多个项目的 Terraform 和 Gitlab CI 管道
【发布时间】:2021-10-09 06:31:13
【问题描述】:

我们有一个现有的适用于 Terraform 的 Gitlab CI EE 管道,可以一次运行一个环境,每个环境都在不同的 AWS 账户中。

但是,我们希望能够为使用 TF 满足其 IaC 要求的不同团队扩展管道。

有办法吗?每个团队有不同的 IaC 存储库/分支,使用相同的管道来处理 TF 部署,使用 S3 作为后端?

还有其他方法吗?我们有 Gitlab CI EE 和 Terraform 开源版本。

【问题讨论】:

    标签: amazon-web-services gitlab terraform gitlab-ci pipeline


    【解决方案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 可以解决这些问题。另一个“肮脏的事情”是存在重复的代码,因为每个环境文件夹都包含相同的主文件、输出和变量。

    到目前为止,我的做法是有效的。我希望这可以给你一个想法:) 祝你好运。

    【讨论】:

      猜你喜欢
      • 2022-01-19
      • 2021-05-06
      • 2021-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-15
      • 2020-06-21
      • 1970-01-01
      相关资源
      最近更新 更多