博客 / 詳情

返回

3 步集成 Terraform + 極狐GitLab CI ,實現基礎設施自動化管理

本文來自:極狐GitLab 開發者社區
作者:KaliArch

利用極狐GitLab CI 實現基礎設施編排自動化後,用户就可以使用極狐GitLab 進行基礎設施管理:提交基礎設施變更後,會觸發 MR 進行極狐GitLab CI 流水線執行,從而實現基礎設施 DevOps 流程。

Terraform + 極狐GitLab CI 架構解析

流程圖

圖片

流程詳解開發或運維人員編寫基於 Terraform 的目標雲資源清單文件,同時項目內管理極狐GitLab CI 流程,在 K8s 不同 NS 下注冊有對應的 Runner,在不同分支下可以觸發不同 NS 下的 CI 流程:

  1. 開發或運維人員提交代碼;
  2. 部署在對應名稱空間下的 Runner 執行流程,創建運行單個 Stage 的 Pod 來運行 Terraform 對應命令,例如 init/fmt/play/apply 等;
  3. 如果要對雲上資源進行變更,修改代碼,再次提交 MR,觸發更新流水線;
  4. 如果需要銷燬,根據 CI 文件配置提交 Build 為 Destroy,觸發雲上銷燬動作。

Terraform + 極狐GitLab CI 預置條件

  • 極狐GitLab 服務器;
  • 註冊有項目的極狐GitLab Runner;
  • K8s 集羣;
  • 騰訊雲 AK 賬號。

開啓極狐GitLab CI + Terraform 實戰

極狐GitLab CI 配置

.gitlab.yaml
variables:# PHASE: BUILD|DESTROYPHASE: DESTROY#  PROXY: http://squiduser:xxzx789@43.134.199.162:3128#  PROXY: http://squiduser:xxzx789@43.154.230.17:3128REGION: "ap-guangzhou"PLAN_JSON: plan.jsonBACKEND_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.0entrypoint: [""]
  when: manualstage: deployretry: 2tags:- gitlab-runner-k8s-newscript:- terraform init -backend-config=${BACKEND_CONF}- terraform apply -auto-approve -input=false plan.binonly:variables:- $PHASE == "BUILD"environment:name: snunvDestroy:image:name: hashicorp/terraform:0.14.0entrypoint: [""]
  stage: deployretry: 2tags:- gitlab-runner-k8s-newscript:- terraform init -backend-config=${BACKEND_CONF}- terraform destroy -auto-approve -var region=${REGION}only:variables:- $PHASE == "DESTROY"

環境配置

利用極狐GitLab CI/CD 的 Environment 進行環境管理。

圖片

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-1253xxxx830"
prefix = "samxxxxitlab/dexxxxxt"

測試

  • Init

圖片

  • Plan

圖片

  • 手動應用 Apply

圖片

圖片

查看應用創建出的 VPC。

圖片

  • 製品下載

圖片

  • 銷燬

修改極狐GitLab CI文件,銷燬。

圖片

圖片

圖片

注意事項

  • 需要 K8s 集羣配置 PV 存儲捲來實現跨 Stage 的任務 Cache;
  • 使用極狐GitLab CI 環境管理來對執行 CI/CD 的人員隱藏密鑰信息;
  • 後期可以使用極狐GitLab 來進行變量管理;

通過以上 3 步,就能實現簡單的 Terraform + 極狐GitLab CI 基礎設施編排集成,開啓基礎設施自動化管理啦。

user avatar tantudafangdepaobuxie 頭像
1 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.