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
若要照上面的安裝,就要先找一下有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:
最後再微調: