前言
前面有幾篇文章講述了如何使用Terraform創建資源 (基礎設施即代碼 Terraform 快速入門, 使用 Terraform 創建 Kubernetes) 以及 Kubernetes時代的包管理工具 Helm 里也講述了如何用Terraform 安裝 Helm Charts,但我們都是在local 執行Terrafrom的,那么有什么辦法自動化整個流程呢?并且讓這些基礎設施的代碼也需要走Pull Request Review 評審,
這時候推薦一款利器:開源工具 Atlantis,在代碼提交時自動運行terraform plan命令,并將 plan命令的輸出添加到pull request的注釋中,經過團隊伙伴Approve之后,才能執行terraform apply 變更資源,資源apply 成功之后,代碼合并到master分支,整個流程遵循GitOps的最佳實踐,換句話說就是我們使用了 Atlantis 為 Terraform 實作 GitOps,
Atlantis 在國內的文章很少,本篇文章就給大家詳細的介紹下如何使用這款利器,
關鍵詞:Terraform自動化,Atlantis入門,Atlantis示例,Terraform Pull Request Automation, Terraform基礎設施自動化
安裝
前提條件
* Kubernetes 我用的GKE 1.22
* 準備一個common github user, 也可以用自己的賬號
* 準備 Personal Access Token
* 隨機生成一個 Webhook Secret
* kubectl 建一個 generic secret 供Atlantis使用
echo -n "xxx" > ghUser echo -n "xxx" > ghToken echo -n "xxx" > ghWebhookSecret kubectl create secret generic atlantis --from-file=ghUser --from-file=ghToken --from-file=ghWebhookSecret
安裝
有多種方式,這里使用Kustomize 作為例子,k8s manifests 參考 my repo
修改 statefulset-patch.yaml 環境變數為自己的,
kustomize build sre-mgmt-dev > deploy.yaml kubectl apply -f deploy.yaml
配置網關
需要一個Gateway,配置一個 URL 指向 atlantis ClusterIP svc ,我的 Ingress-nginx 配置參考,(Optional) Ingress-Nginx入門參考我下一篇文章 云原生之旅 - 8)云原生時代的網關 Ingress Nginx
也可以把atlantis 置成 LB型別或者NodePort本地測驗,
配置Github webhook
很簡單,參考檔案 https://www.runatlantis.io/docs/configuring-webhooks.html#github-github-enterprise
使用
權限
確保Running 在 Kubernetes 的 Atlantis service account 對所操作的資源有權限,能Terraform init/plan/apply 云端資源,
我這里是GCP Project作為例子,
* GKE default service account use node service account. * (Optional) for GKE Workload Identity: https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity配置 Atlantis.yaml
簡單例子如下
假設Terraform 代碼結構如下
Terraform
├── quick_demo1
│ ├── xxx.tf
│ └── xxx.tf
├── quick_demo2
├── xxx.tf
└── xxx.tf
Atlantis yaml 配置
---
version: 3
automerge: true
delete_source_branch_on_merge: true
projects:
- name: project-1
dir: Terraform/quick_demo1
terraform_version: 1.2.9
autoplan:
when_modified:
- '**/*.tf'
- name: project-2
dir: Terraform/quick_demo2
terraform_version: 1.2.9
autoplan:
when_modified:
- '**/*.tf'
當你修改TF檔案 提交PR的時候,Atlantis 會自動使用default workflow 執行 Terraform Plan, plan result 會 comment到 PR里面,
注意: 需要配置 Github -> Settings -> Branches-> Branch protection rule -> Protect matching branches 需要Approve才能merge,
然后有隊友Approve了PR, 你才可以執行 Atlantis Apply, 最終資源會被Terraform apply,PR 自動 merged to master,
Workflow breakdown
- Step 1: Open a Pull Request
- Step 2: Atlantis automatically run `terraform plan` and comments back on PR
- Step 3: Someone reviews and approves PR
- Step 4: Comment `atlantis apply`
- Step 5: Atlantis run `terraform apply` and comments back on PR about result
- Step 6: PR merged automatically.
自定義 Workflow
加個Terraform format check, 代碼如下:
workflows:
test:
plan:
steps:
- env:
name: ENV_NAME
command: 'echo "dynamic-value-$(date)"'
- run: terraform${ATLANTIS_TERRAFORM_VERSION} fmt -check=true -write=false -diff=true
- init
- plan
apply:
steps:
- apply
需顯示申明使用此workflow 如 "workflow: test", 完整 Atlantis yaml 參考
---
version: 3
automerge: true
delete_source_branch_on_merge: true
projects:
- name: project-demo
dir: Terraform/quick_demo
terraform_version: 1.2.9
autoplan:
when_modified:
- '**/*.tf'
- name: project-module-demo
dir: Terraform/module_demo/project_1
terraform_version: 1.2.9
workflow: test
autoplan:
when_modified:
- '**/*.tf'
# (Optional) custom workflows
workflows:
test:
plan:
steps:
- env:
name: ENV_NAME
command: 'echo "dynamic-value-$(date)"'
- run: terraform${ATLANTIS_TERRAFORM_VERSION} fmt -check=true -write=false -diff=true
- init
- plan
apply:
steps:
- apply
atlantis.yaml
測驗

總結
我們的Terraform 代碼結構是按環境分成不同的folder,這樣做的好處是可以通過github CODEOWNERS檔案來針對不同的檔案夾(環境)給不同的組權限,比如以下例子給予group-dev權限審批這個folder project-xx/dev下面的Terraform代碼變化,
* @sre
Terraform/project-xx/dev/** @group-dev
Terraform/project-xx/prod/** @sre
我們也試過同一套代碼利用Terraform的作業區workspace 來區分環境,實踐下來不如上面的結構靈活,維護性差,
感謝閱讀,如果您覺得本文的內容對您的學習有所幫助,您可以打賞和推薦,您的鼓勵是我創作的動力,
Learning by Doing
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/528081.html
標籤:其他
上一篇:ps插件camera raw 15.0,攝影后期必看的ACR15.0新功能保姆級教程
下一篇:LAPM概述及配置
