網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
一 背景
利用Gitlab CI實(shí)現(xiàn)基礎(chǔ)設(shè)施編排自動(dòng)化,用戶后續(xù)針對(duì)基礎(chǔ)設(shè)施的管理使用Gitlab完成,提交基礎(chǔ)設(shè)施變更后,會(huì)出發(fā)pr進(jìn)行Gitlab CI流水線執(zhí)行,從而實(shí)現(xiàn)基礎(chǔ)設(shè)施DevOPS流程。
二 流程架構(gòu)
2.1 架構(gòu)圖
2.2 流程
運(yùn)維研發(fā)編寫目標(biāo)云的基于Terraform的資源清單文件,同事項(xiàng)目?jī)?nèi)管理Gitlab CI流程,在K8s不同NS下注冊(cè)有對(duì)應(yīng)的runner,當(dāng)在不同分支下可以觸發(fā)不同ns下的CI流程。
- 開(kāi)發(fā)或運(yùn)維人員提交代碼。
- 部署在對(duì)應(yīng)名稱空間下的runner執(zhí)行流程,創(chuàng)建運(yùn)行單個(gè)Stage的POD來(lái)運(yùn)行Terraform對(duì)應(yīng)命令,例如init/fmt/play/apply等。
- 如果要對(duì)云上資源進(jìn)行變更,修改代碼,再次提交pr,出發(fā)更新流水線。
- 如果需要銷毀,根據(jù)CI文件配置提交BUILD為destroy,觸發(fā)云上銷毀動(dòng)作。
三 預(yù)置條件
- Gitlab 服務(wù)器
- 注冊(cè)有項(xiàng)目的gitlab-runner
- K8s集群
- 騰訊云AK賬號(hào)
四 配置
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 環(huán)境配置
利用Gitlab CI/CD的Environment進(jìn)行環(huán)境管理。
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
}
# 再次僅為一個(gè)查詢示例
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安全,將其存儲(chǔ)為單獨(dú)文件,可不同分支或環(huán)境進(jìn)行修改
region = "ap-beijing"
bucket = "tfproject-1253329830"
prefix = "samxxxxitlab/dexxxxxt"
五 測(cè)試
- init
- validate
- Plan
- 手動(dòng)應(yīng)用apply
查看應(yīng)用創(chuàng)建出的vpc
- 制品下載
- 銷毀
修改gitlabci文件,銷毀
六 注意事項(xiàng)
- 需要K8s集群配置pv存儲(chǔ)卷來(lái)實(shí)現(xiàn)跨stage的任務(wù)cache。
- 使用gitlab ci 環(huán)境管理來(lái)對(duì)執(zhí)行ci/cd的人員隱藏密鑰信息。
- 后期可以使用gitlab 來(lái)進(jìn)行變量管理。
本文僅實(shí)現(xiàn)簡(jiǎn)單的Terraform + Gitlab CI 基礎(chǔ)設(shè)施編排集成,未將Gitlab CI的配置文件進(jìn)行抽離模版化,未與Ansible進(jìn)行集成實(shí)施配置管理。
原文鏈接:https://juejin.cn/post/7115993352209694751
相關(guān)推薦
- 2022-05-10 原生ajax 設(shè)置get請(qǐng)求參數(shù)和請(qǐng)求頭信息和發(fā)送 post請(qǐng)求
- 2022-04-03 詳解iOS?實(shí)現(xiàn)一對(duì)多代理方案_IOS
- 2022-06-25 pytorch中permute()函數(shù)用法補(bǔ)充說(shuō)明(矩陣維度變化過(guò)程)_python
- 2022-06-26 對(duì)ASP.Net的WebAPI項(xiàng)目進(jìn)行測(cè)試_實(shí)用技巧
- 2022-04-18 后端接口返回一個(gè)圖片地址,前端h5,pc瀏覽器,下載圖片文件,而不是預(yù)覽
- 2022-09-16 C++中的位運(yùn)算和位圖bitmap解析_C 語(yǔ)言
- 2022-11-05 python?pandas?query的使用方法_python
- 2022-09-30 C++實(shí)戰(zhàn)之二進(jìn)制數(shù)據(jù)處理與封裝_C 語(yǔ)言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支