IaC with Terraform 24

Complete CI/CD with Terraform — Part 2

ZONGRU Li
9 min readOct 26, 2023

前一篇整理要進行的三大步驟:

  1. create ssh key-pair
  2. install TF inside jenkins container
  3. TF configuration to provision server

1.create ssh key-pair

在前面課程中的Terraform都是使用到本機已經產好的key-pair來建構EC2:

或是直接在AWS的EC2網頁上面直接建立新的key-pair:

這邊照著課程內容直接在上面建立

然後就會下載下來:

這個pem檔案之後就要提供給Jenkins Container內使用

2.install TF inside jenkins container

#用root身分進到Jenkins Container內:
docker exec -it -u 0 {Container ID} bash
#這邊可以透過簡單指令查看Jenkins Container內的os版號,然後去TF官網看看怎麼安裝:
cat /etc/os-release
LINK

若要照上面的安裝,就要先找一下有wget的軟體包

但是講師看到有比較舊的安裝方式:

然後我已經連不上上面這個畫面中的網頁了

現在新版用wget但是Container內沒有這項工具,也要另外安裝

參照新的安裝法

#整理以下用root在Jenkins Container內執行:
#1.Ensure have installed the gnupg, software-properties-common, and curl packages installed:
apt-get update && apt-get install -y gnupg software-properties-common

#2.Install the HashiCorp GPG key.
wget -O- https://apt.releases.hashicorp.com/gpg | gpg --dearmor | tee /usr/share/keyrings/hashicorp-archive-keyring.gpg

#3.Verify the key's fingerprint
gpg --no-default-keyring \
--keyring /usr/share/keyrings/hashicorp-archive-keyring.gpg \
--fingerprint

#4.Add the official HashiCorp repository to your system:
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] \
https://apt.releases.hashicorp.com $(lsb_release -cs) main" | \
tee /etc/apt/sources.list.d/hashicorp.list

#5.Download the package information from HashiCorp:
apt update

#6.Install Terraform from the new repository:
apt-get install terraform

發現沒有wget工具:

#補執行以下(root執行):
apt-get update
#找到wget工具包含在什麼套件(多種選擇):
apt-cache search {package}
apt-cache search wget
apt-cache search wget | grep wget
apt search wget

#取得相關資訊:
apt info wget
apt-cache show wget

#實際安裝:
apt-get install {package-name-here}
#參考上面直接安裝:
apt-get install wget

回到前面第二步wget的相關安裝:

3.TF configuration Files to provision server

在這個PIPELINE的專案目錄中建立terraform的目錄

然後在裡面開始撰寫main.tf,內容就從前面課程用過的,但是調整key的部分

另外還有entry-script.sh但是內容要調整,因為要改用docker compose

故entry-script.sh內容改成安裝docker外,還要另外裝docker-compose:

一樣放到terraform目錄內:

接著還有很多變數問題

之前課程有提到變數檔一般都留在執行Terraform機台上

透過.gitignore設定不會commit到Git Server上儲存

將會導致上述main.tf內變數值是空的

所以這邊會開始給預設值:

另外也把開頭的region設定為變數:

把上面做好的這些變數內容剪下,轉移到獨立的variables.tf檔案中:

現在main.tf變得比較簡潔:

另外針對output就留一個IP位置即可:

所以現在terraform目錄內檔案內容有

main.tf:

variables.tf:

entry-script.sh:

以上Terraform相關檔案就編輯完成

Provision Stage in Jenkinsfile

再來就是調整PIPELINE,這邊先把檔名改掉

然後開始編輯這部分:

首先是Terraform執行時候,要有帶有連線到AWS帳號的憑證資訊

同筆記第三篇有提到,我們可以直接寫死憑證在tf檔案內:

或是設定到環境變數去,而這個課程就會選用這個方式

之後AWS provider就可以透過這兩個環境變數連接AWS雲端資源

並且環境變數只宣告在該Stage上

首先要把設兩個憑證資訊設定到Jenkins的憑證管理去:

上述一樣使用的是AWS的admin帳號

在PIPELINE中使用:

一般常見情況下

在開發過程中可能會需要由CI/CD提供變數值給Terraform變數使用

這時候可以使用Terraform環境變數,格式會是:

TF_VAR_name

例如env_prefix變數

從Jenkins CI/CD過程提供就變成:

它就會取代變數檔內env_prefix的預設值

以上理應就可以完成機台建置在AWS雲端

Deploy Stage in Jenkinsfile

在PIPELINE過程最後的Deploy部分也需要調整

其中關鍵是前一Stage建置拿到的機台IP,要傳給最後Deploy這一步使用

也就是我們要從Jenkinsfile內取得Terraform建置出來的IP

首先可以注意到前一Stage驅動Terraform建置EC2後有Output IP:

這邊就會需要額外的Terraform指令直接拿到Output的值,放到變數去

#執行以下指令拿到所有Output值:
terraform output
#或是指定哪一個Output值:
terraform output ec2_public_ip

接下來還有個問題是機台建置會有一個EC2初始化(initializing)的時間等待

並且在initializing過程中user_data = file(“entry-script.sh”)才會被執行

過程中可能同時PIPELINE也同時正在跑Deploy stage

而一個簡單的解決辦法就是sleep:

最後再微調:

參考課程reference

--

--

ZONGRU Li
ZONGRU Li

Written by ZONGRU Li

2022/11/17 開源部分個人筆記給LINE "Java程式語言討論區"社群,希望能對社群的技術學習做一點點貢獻.(掩面....記得退訂閱!

No responses yet