先前講完了基本上在 local 去部署 terraform 時,然後如何正確地使用 variable 的部分來部署,但是接下來身為 Ops ,怎麼可能會自己花時間在執行 deploy 的事情,肯定是要透過 CICD 的工具來輔助部署啊。
但是要如何可以整合 CICD的工具來執行 Terraform 並且可以透過 Variable 的功用,成功部署到AWS 上面,這就是今天要講的重點了~
如果Gitlab很熟悉的話,可以只看 Terraform 的部分即可
通常在Gitlab CI 上面執行的時候,就是要先設定一下 variable 到 project setting 裡面,而常用Variable 就需要設定在那邊,甚至比較敏感的 Variable 也是要在那邊設置,才不需要把 Variable 寫在project script 裡面,到時候open project的時候,就跟著open 起來,即便我後面的 Commit 去覆蓋掉,但是很難確保過去的修改紀錄也跟著覆蓋掉,所以這部分就要特別小心
至於如何設置在Gitlab CI 的部分有兩個步驟要設置,首先在Gitlab project 下面找 setting → CI / CD 下點進去,之後找一個Variable 的部分,把需要加進去的變數加入
例如: 設置AWS token and Key, and, etc. RDS_HOST
& RDS_PASSWORD
File : variables.tf
variable "RDS_HOST" {
description="RDS connect host"
}
variable "RDS_PASSWORD" {
description="RDS connect password"
}
然後在 yaml file 的部分就是把變數帶入進去,然後在透過之前提到的,要把 -var
這個帶入command 中,這樣才會透過command line 帶入比較敏感的變數
File : .gitlab-ci.yml
cvariables:
RDS_HOST: $RDS_HOST
RDS_PASSWORD: $RDS_PASSWORD
stages:
- init # terraform init
- deploy # terraform deployment
- destroy
init:
stage: init
script:
- terraform init
deploy:
stage: deploy
before_script:
- terraform init
script:
->
terraform apply
-var="RDS_HOST=$RDS_HOST"
-var="RDS_PASSWORD=$RDS_PASSWORD"
destroy:
stage: destroy
before_script:
- terraform init
script:
->
terraform destroy
-var="RDS_HOST=$RDS_HOST"
-var="RDS_PASSWORD=$RDS_PASSWORD"
另外一種就是Terraform 如果找不到對應的變數的時候,就會去環境變數找,所以有 TF_VAR
開頭的變數名稱都會被 Terraform 抓到的環境變數,因此也可以透過這部分來設置變數帶入 Variable 裡面。
環境變數的名稱取名規則 TF_VAR_<變數名稱>
,是會被Terraform 在執行的過程中帶入的,實際做法如下:
用 Environment Variables 傳入
File : variables.tf
variable "RDS_HOST" {
description="RDS connect host"
}
variable "RDS_PASSWORD" {
description="RDS connect password"
}\
variable "MY_IMAGE" {
description="Just Explain How to using environment variable to tf variable"
}
然後在透過Gitlab CI Yml configure方式把 image value 帶入到 MY_IMAGE裡面,這邊要提醒一下設置變數的時候,請記得Which need this variable? ,不然變數亂設會沒帶進去到後面的部屬
File : .gitlab-ci.yml
variables:
RDS_HOST: $RDS_HOST
RDS_PASSWORD: $RDS_PASSWORD
TF_VAR_MY_IMAGE: python/pytorch # Here Here Here Here
stages:
- init # terraform init
- deploy # terraform deployment
- destroy
init:
stage: init
script:
- terraform init
deploy:
stage: deploy
before_script:
- terraform init
script:
->
terraform apply
-var="RDS_HOST=$RDS_HOST"
-var="RDS_PASSWORD=$RDS_PASSWORD"
destroy:
stage: destroy
before_script:
- terraform init
script:
->
terraform destroy
-var="RDS_HOST=$RDS_HOST"
-var="RDS_PASSWORD=$RDS_PASSWORD"
然後上面的作法 Terraform apply 的時候就會預設載入TF_VAR 裡面設定的參數到 MY_IMAGE
以上大概這樣,如果後面有想到甚麼再來補充
https://godleon.github.io/blog/DevOps/terraform-input-variables/