iT邦幫忙

2021 iThome 鐵人賽

DAY 10
0

本篇介紹 Terraform 透過 Github Action 自動化執行

課程內容與代碼會放在 Github 上: https://github.com/chechiachang/terraform-30-days

賽後文章會整理放到個人的部落格上 http://chechia.net/

追蹤粉專可以收到文章的主動推播

https://ithelp.ithome.com.tw/upload/images/20210901/20120327NvpHVr2QC0.jpg


手動上 web console / portal 點擊的步驟很難自動化,但使用 IaC 工具(ex. terraform,ansible,chef,salt...) 才容易執行自動化

自動化有許多特點

  • 工程師的工作,從手動 apply infrastructure,變成維護自動 apply infrastructure 的 workflow
    • 重複的工作變少,效率變高
    • 困難且複雜的工作變多(是的,人工智慧比工人智慧難多了)
  • 降低人為失誤(human error)

這樣有個迷思,說自動化就是好棒棒。自動化不是萬靈丹,套用自動化,團隊就永遠不出錯。試想:workflow 還是會寫錯,萬一錯的是 workflow,就會不斷的做錯

  • IaC 只是記錄 workflow,並逐漸迭代改進 workflow
    • 固定現在的流程
    • 快速復現(reproduce)workflow 的錯誤
    • fix,commit,Review,apply 新流程
  • 另一個文化上的體現是:工程師做錯不是處罰工程師,而是團隊一起修復 SOP / workflow

此外,本篇使用 Github Action 做操作,然而絕大多是成熟的 CI 工具,都可以做到底下描述的內容,團隊可以自由選擇 CI 工具,例如:Jenkins,CircleCI ...都會是很好的選擇

Terraform 官方的 automate 指南 使用 Terraform Cloud,我們這邊先不使用 Terraform Cloud,而是使用 Github Action。然而基本的工作流程與官方文件描述相近。

Config Github

上篇IAM for terraform 我們為 Terraform 設定獨立的 service principal,並取得 credential(certtificate in .pfx)作為認證的 credential。只要把這些 secret 上傳 Github Secret,搭配 terraform 的 binary,理論上就能在 Github Action 執行所有 Terraform 操作,控制 Azure resources。需要的環境變數如下:

export ARM_CLIENT_ID="00000000-0000-0000-0000-000000000000"
export ARM_CLIENT_CERTIFICATE_PATH="/Users/che-chia/.ssh/terraform-30-days.pfx"
export ARM_CLIENT_CERTIFICATE_PASSWORD=<password>
export ARM_SUBSCRIPTION_ID="00000000-0000-0000-0000-000000000000"
export ARM_TENANT_ID="00000000-0000-0000-0000-000000000000"

需要上傳一個檔案,指定五個環境變數。細節請見Github 文件:create secret

  • 到 Github Repository -> Settings -> Secrets -> New Repository Secret
  • 將 .pfx 轉成 base64,用 text 格式貼到 secret,命名為 ARM_CLIENT_CERTIFICATE_BASE64
  • 將其他參數依照原本的名稱上傳 secret
  • Github 會將上述 secret 都加密

由於 Github Secret 不支援檔案上傳,所以我們將 .pfx 轉成 base64,用 text 格式貼到 secret,命名為 ARM_CLIENT_CERTIFICATE_BASE64,在 Github Action 使用前,做 base64 -d 解開成為原來的檔案。注意 base64 輸出應該是一行內容,貼上時不要有斷行符號

cat ~/.ssh/terraform-30-days.pfx | base64

MIIPeQIBAzC....................
...
...
................QICCAA=

實際上傳到 Secret 的參數

ARM_CLIENT_ID="00000000-0000-0000-0000-000000000000"
ARM_CLIENT_CERTIFICATE_BASE64="..."
ARM_CLIENT_CERTIFICATE_PASSWORD=<password>
ARM_SUBSCRIPTION_ID="00000000-0000-0000-0000-000000000000"
ARM_TENANT_ID="00000000-0000-0000-0000-000000000000"

Config workflow

在 github workflow 中,參考官方文件,就可以在 workflow.steps 中取用

steps:
  - name: Hello world action
    with: # Set the secret as an input
      super_secret: ${{ secrets.SuperSecret }}
    env: # Or as an environment variable
      super_secret: ${{ secrets.SuperSecret }}

更改 .github/workflow/plan.yaml

yq read .github/workflows/plan.yaml

使用 nektos/act 工具測試 Github Action

sudo port install act

act --version
act version 0.2.24

本地測試 .github/workflow

  • 做 github action 格式檢查,避免上傳錯誤的 yaml,還要等 Action 執行才發現
  • 分項,dry-run,debug
  • 本地測試
act --list

ID              Stage  Name
terraform-fmt   0      trerraform fmt
terraform-plan  0      Terraform Plan
validate        0      Validate terraform configuration

執行 Dry run,沒有實際讓 Action 實際運行,只是把 .yaml 喂進去,確定沒有 syntax error

act --dryrun

測試觸發 push event 時,github Action 會執行的 job

  • (Optional) act 可以帶入額外的參數,帶入 secret env 做測試會更準確
    • 需要明碼的 azure credential,包括 .pfx, password, ...,工程師本機也不應該可以取得這些 secret
  • 實務上,把不需要 credential 的部分測一測就可以推上去 Github Action 測試了
act --env foo=bar

Workflow for Terraform

Terraform 的 CI/CD 流程有非常多的面相

  • push / PR checks
    • format / validate
    • module test
  • security checks
  • cost checks
  • terraform functions
    • init
    • plan
    • apply
tree .github

.github
└── workflows
    ├── format.yaml
    ├── plan.yaml
    ├── security-scan.yaml
    └── validate.yaml

本 repository 並沒有準備自動 apply 的 Github Action

  • 本 repository 的 module 都是課程的範例,並不會對應實際我個人 azure cloud 上的狀況。簡單說:我不希望
    terraform-30-days 的 module 都 apply 上去
  • 如果是管理公司實際環境的 terraform repository,建議就可以啟用 terraform apply,on master push event

設定可以參考 .github/workflow/plan.yml 這份,調整一下 command 就可以

關於 Iac code 自動 apply,下一章 atlantis 我們會細講

References

Homework

  • .github/workflows/ 中建立屬於自己團隊的 workflow.yaml
  • 閱讀 Github Action: starter example 中的範例 workflow,套用已經寫好的 workflow 到自己的 repository 中

上一篇
Day 09-用 Owner 權限跑 Terraform 等於用 root 權限跑後端,夜路跑多了遲早遇到鬼
下一篇
Day 11-Atlantis 做 Terraform Remote Plan & Remote Apply
系列文
Terraform Workshop - Infrastructure as Code for Public Cloud 疫情警戒陪你度過 30 天32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言