Terraform集成简单Gitlab CI方案详解

 更新时间:2022年07月05日 12:16:53   作者:kaliarch  
这篇文章主要为大家介绍了Terraform + Gitlab CI简单集成方案,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

一 背景

利用Gitlab CI实现基础设施编排自动化,用户后续针对基础设施的管理使用Gitlab完成,提交基础设施变更后,会出发pr进行Gitlab CI流水线执行,从而实现基础设施DevOPS流程。

二 流程架构

2.1 架构图

2.2 流程

运维研发编写目标云的基于Terraform的资源清单文件,同事项目内管理Gitlab CI流程,在K8s不同NS下注册有对应的runner,当在不同分支下可以触发不同ns下的CI流程。

  • 开发或运维人员提交代码。
  • 部署在对应名称空间下的runner执行流程,创建运行单个Stage的POD来运行Terraform对应命令,例如init/fmt/play/apply等。
  • 如果要对云上资源进行变更,修改代码,再次提交pr,出发更新流水线。
  • 如果需要销毁,根据CI文件配置提交BUILD为destroy,触发云上销毁动作。

三 预置条件

  • Gitlab 服务器
  • 注册有项目的gitlab-runner
  • K8s集群
  • 腾讯云AK账号

四 配置

4.1 Gitlab CI配置

4.1.1 .gitlab.yaml

variables:
  # PHASE: BUILD|DESTROY
  PHASE: DESTROY
#  PROXY: http://squiduser:xxzx789@43.134.199.162:3128
#  PROXY: http://squiduser:xxzx789@43.154.230.17:3128
  REGION: "ap-guangzhou"
  PLAN_JSON: plan.json
  BACKEND_CONF: "backend_oss.conf"
#
before_script:
#  - apk add --no-cache curl git jq
  - apk add --no-cache jq
  - export http_proxy=${SQUID_PROXY}
  - export https_proxy=${SQUID_PROXY}
  - export TENCENTCLOUD_SECRET_KEY=${TENCENTCLOUD_SECRET_KEY}
  - export TENCENTCLOUD_SECRET_ID=${TENCENTCLOUD_SECRET_ID}
  - export TF_REGISTRY_CLIENT_TIMEOUT=120000
  - export CHECKPOINT_TIMEOUT=500000
  - export TF_REGISTRY_DISCOVERY_RETRY=5
  - alias convert_report="jq -r '([.resource_changes[]?.change.actions?]|flatten)|{\"create\":(map(select(.==\"create\"))|length),\"update\":(map(select(.==\"update\"))|length),\"delete\":(map(select(.==\"delete\"))|length)}'"
# 配置缓存
cache:
  paths:
    - ${CI_PROJECT_DIR}/.terraform/*
stages:
  - init
  - validate
  - plan
  - deploy
Init:
  image:
    name: hashicorp/terraform:0.14.0
    entrypoint: [""]
  stage: init
  retry:
    max: 2
    when:
      - script_failure
  tags:
    - gitlab-runner-k8s-new
  script:
    - terraform version
    - terraform init -backend-config=${BACKEND_CONF}
  only:
    - dev
Validate:
  image:
    name: hashicorp/terraform:0.14.0
    entrypoint: [""]
  stage: validate
  tags:
    - gitlab-runner-k8s-new
  retry: 2
  script:
    - terraform init -backend-config=${BACKEND_CONF}
    - terraform validate
    - terraform fmt -check -recursive || echo 0
  cache:
    paths:
      - ${CI_PROJECT_DIR}/.terraform/*
    policy: pull
  allow_failure: true
Plan:
  image:
    name: hashicorp/terraform:0.14.0
    entrypoint: [""]
  stage: plan
  retry: 2
  tags:
    - gitlab-runner-k8s-new
  artifacts:
    paths:
      - plan.bin
      - app_config.zip
    expire_in: 2 week
  script:
    - terraform init -backend-config=${BACKEND_CONF}
    - terraform plan -input=false -out=plan.bin -var region=${REGION}
    - terraform show --json "plan.bin" | convert_report > ${PLAN_JSON}
    - cat ${PLAN_JSON}
  only:
    variables:
      - $PHASE == "BUILD"
Apply:
  image:
    name: hashicorp/terraform:0.14.0
    entrypoint: [""]
  when: manual
  stage: deploy
  retry: 2
  tags:
    - gitlab-runner-k8s-new
  script:
    - terraform init -backend-config=${BACKEND_CONF}
    - terraform apply -auto-approve -input=false plan.bin
  only:
    variables:
      - $PHASE == "BUILD"
  environment:
    name: snunv
Destroy:
  image:
    name: hashicorp/terraform:0.14.0
    entrypoint: [""]
  stage: deploy
  retry: 2
  tags:
    - gitlab-runner-k8s-new
  script:
    - terraform init -backend-config=${BACKEND_CONF}
    - terraform destroy -auto-approve -var region=${REGION}
  only:
    variables:
      - $PHASE == "DESTROY"

4.1.2 环境配置

利用Gitlab CI/CD的Environment进行环境管理。

4.2 Terraform资源

provider "tencentcloud" {
  region = var.region
}
terraform {
  required_providers {
    tencentcloud = {
      source  = "registry.terraform.io/tencentcloudstack/tencentcloud"
      version = ">=1.61.5"
    }
  }
  backend "cos" {}
}
# 输入变量
variable "region" {
  type = string
}
# 再次仅为一个查询示例
data "tencentcloud_instances" "cvm" {
}
# 输出
output "result" {
  value = {
    cvm_result = { for k, v in data.tencentcloud_instances.cvm : k => v },
    count      = data.tencentcloud_instances.cvm.instance_list[*]
  }
}

为了terraform后端backend安全,将其存储为单独文件,可不同分支或环境进行修改

region = "ap-beijing"
bucket = "tfproject-1253329830"
prefix = "samxxxxitlab/dexxxxxt"

五 测试

  • init

  • validate

  • Plan

  • 手动应用apply

查看应用创建出的vpc

  • 制品下载

  • 销毁

修改gitlabci文件,销毁

六 注意事项

  • 需要K8s集群配置pv存储卷来实现跨stage的任务cache。
  • 使用gitlab ci 环境管理来对执行ci/cd的人员隐藏密钥信息。
  • 后期可以使用gitlab 来进行变量管理。

本文仅实现简单的Terraform + Gitlab CI 基础设施编排集成,未将Gitlab CI的配置文件进行抽离模版化,未与Ansible进行集成实施配置管理。

以上就是Terraform集成简单Gitlab CI方案详解的详细内容,更多关于Terraform集成Gitlab CI的资料请关注脚本之家其它相关文章!

相关文章

  • 微信小程序开发实例详解

    微信小程序开发实例详解

    这篇文章主要介绍了微信小程序开发实例详解的相关资料,需要的朋友可以参考下
    2016-09-09
  • 本地部署DeepSeek-R大模型的详细教程

    本地部署DeepSeek-R大模型的详细教程

    今天我来分享一篇超级详细的教程,教你如何在本地部署 DeepSeek-R1 大模型,让你的电脑也能成为一个强大的 AI 工作站!这篇文章会从零开始,手把手带你完成所有步骤,适合小白操作,废话不多说,咱们直接开始吧
    2025-02-02
  • ceph集群RadosGW对象存储使用详解

    ceph集群RadosGW对象存储使用详解

    这篇文章主要为大家介绍了ceph集群RadosGW对象存储使用详解,有需要的,朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • DeepSeek Window本地私有化部署教程

    DeepSeek Window本地私有化部署教程

    本文介绍了如何在Windows电脑上本地部署DeepSeekR1大模型,包括安装Ollama工具、下载DeepSeekR1模型、安装图形化交互界面CherryStudio等步骤,部署过程中强调了隐私安全和响应速度快的优势
    2025-02-02
  • 荐书|程序员书单必不可少系列之算法篇

    荐书|程序员书单必不可少系列之算法篇

    在学习编程的道路上,算法是必不可少的一门课,最近就在重温算法,所以下面这篇文章主要给各位程序员们推荐了几本关于算法的相关书籍,需要的朋友们可以下载学习,相信会对大家具有一定的参考学习价值的,下面来一起看看吧。
    2017-07-07
  • MobaXterm详细使用图文教程(MobaXterm连接Linux服务器)

    MobaXterm详细使用图文教程(MobaXterm连接Linux服务器)

    这篇文章主要介绍了MobaXterm详细使用教程,介绍一下如何设置并用MobaXterm来连接Linux服务器,本文介绍了三种连接方式:SSH,FTP,serial,以及几个有用的设置和命令,需要的朋友可以参考下
    2023-05-05
  • 深入浅析ELK原理与简介

    深入浅析ELK原理与简介

    ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件。这篇文章主要介绍了ELK原理与介绍,需要的朋友可以参考下
    2021-09-09
  • ChatGpt无法访问或错误码1020的几种解决方案

    ChatGpt无法访问或错误码1020的几种解决方案

    ChatGPT是一种语言模型,它被训练来对对话进行建模,下面这篇文章主要给大家介绍了关于ChatGpt无法访问或错误码1020的几种解决方案,文中介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • 使用ffmpeg 合并aac格式音频文件的方法

    使用ffmpeg 合并aac格式音频文件的方法

    FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。这篇文章主要介绍了使用ffmpeg 合并aac格式音频文件的方法,需要的朋友可以参考下
    2020-03-03
  • Win10下配置VScode远程开发ssh-remote(免密登录)

    Win10下配置VScode远程开发ssh-remote(免密登录)

    在开发或者做实验的过程中,我们经常会用到远程服务器或者Github的项目,本文详细介绍的VScode配置免密ssh+remote,一旦连接成功,我们就可以在本地自己喜欢的IDE上操作远程服务器端的项目了
    2021-08-08

最新评论