上一篇對Terraform進行了簡單介紹,並嘗試一個建立虛擬機器例項的演示實驗,對IaC(基礎設施即程式碼)有了初步的認識,這一篇我們稍微深入一些,繼續對Terraform進行進階嘗試,使用高階特性更安全高效管理基礎設施,儘量還原實際生產使用。
程式碼倉庫地址:https://github.com/robin-2016/terraform-demo,如果沒有克隆到本地的,先克隆程式碼倉庫到本地,如之前克隆過,請將程式碼更新到最新。
一、變數
Terraform支援變數,變數使用場景一般為下面幾種情況,一個配置需要多次引用,經常需要修改的配置,還有像AK和SK等敏感資訊需要單獨檔案儲存,一般情況是單獨儲存在名為vars.tf檔案中,這樣修改時只修改vars.tf一個檔案即可,demo2就是這樣的示例,將AK、SK、區域、映象ID和例項規格等都放在vars.tf檔案中,根據型別分別放在不同的配置檔案中,歸類方便在配置較多時能較快找到對應的配置資訊,在其他配置檔案中透過var.加上具體變數名稱就能引用到變數的值。vars.tf部分內容如下:
variable "AWS_ACCESS_KEY" {
type = string
default = ""
}
variable "AWS_SECRET_KEY" {
type = string
default = ""
}
variable "AWS_REGION" {
type = string
default = "ap-east-1"
}
variable "AMI" {
type = string
default = "ami-0ad7f83eab34d93a7"
}
variable "INSTANCE_TYPE" {
type = string
default = "t3.micro"
}
例如AWS_ACCESS_KEY變數,值的內容為default欄位,type為變數型別,示例中變數都是string字串型別,Terraform變數還支援number數值型別、true-false布林型別、list列表型別和map字典型別,本次示例中只演示了字串型別使用,其他型別請參考下面官網文件連結使用:https://developer.hashicorp.com/terraform/tutorials/configuration-language/variables
二、生產環境示例
切換到demo-2目錄下,根據資源型別,將配置拆分到不同的配置檔案中。
目錄檔案介紹:instance.tf是虛擬機器例項配置,provider.tf是供應商配置,vars.tf是變數,key.tf是例項ssh金鑰,相比密碼,金鑰安全性更高,securitygroup.tf是安全組配置,允許訪問ssh服務,output.tf是執行結束輸出配置,這裡配置是建立例項的公網IP地址,user_data.tftpl是虛擬機器初始化指令碼模版檔案,下部分會詳細講解,vpc.tf是虛擬網路配置,versions.tf是供應商版本配置資訊,這樣根據需求只修改對應內容檔案即可。
準備工作,這裡主要修改是vars.tf,填寫AWS的AK和SK對應到AWS_ACCESS_KEY和AWS_SECRET_KEY,再生成金鑰對檔案,使用下面命令生成:
ssh-keygen -f mykey
準備工作完成,正式開始建立資源,步驟和上一講相同
#初始化
terraform init
#檢視執行計劃
terraform plan
#應用,建立資源
terraform apply
執行完成後會在最後Outputs部分輸出虛擬機器示例的公網IP地址,之後能使用下面ssh命令遠端連線虛擬機器示例了:
ssh -i mykey ubuntu@公網IP
注:如果沒有連線上,可以等一會再嘗試,安裝配置軟體需要一點時間,本示例使用Ubuntu映象,使用者名稱為ubuntu是映象預設使用者名稱,使用其他映象需根據映象調整。
登入後檢視服務狀態,nginx已經啟動,並已開啟80埠,登入上AWS控制檯,例項、VPC、安全組、金鑰對都已經配置完成。這裡只是簡單演示,實際會更復雜。
systemctl status nginx
ss -ntlp
三、user data
上面示例中,使用的公共映象建立虛擬機器例項,最終完成時卻已安裝nginx,使用的就是user data,在雲上建立虛擬機器例項時,都會在虛擬機器建立完成的首次啟動執行user_data中的命令進行初始化,之後虛擬機器例項再啟動不會再執行,這樣就能使用user_data功能完成對虛擬機器的初始化,下面為demo-2中user_data.tftpl內容,和普通bash指令碼內容基本相同,示例中主要是安裝並啟動了nginx,還可以寫更復雜,模版檔案還支援變數輸入,自行學習探索。
#!/bin/bash
sudo apt update
sudo apt install nginx -y
sudo systemctl start nginx
另一個方式是Packer自定義映象,提前安裝需要應用環境,Packer還可以和Jenkins等CI持續整合工具結合,Packer配置變化後,重新執行流水線構建新的自定義映象。
推薦使用user data方式,基本雲環境都支援user data,減少不再依賴三方工具,更好管理,自定義映象方式啟動快一些,可以根據實際需要自行選擇。
四、模組
上面是所有配置都是自己寫,如果想抽出部分作為公共配置,供其他專案引用,或者環境不同,但配置相同,只是變數不同,會存在許多重複配置,這樣情況下就需要用到Terraform的模組,我們可以直接引用模組寫更少的配置檔案,官網模組地址:https://registry.terraform.io/browse/modules,官方提供了許多模組供開發者引用,也可以自定義模組使用,一些第三方同樣提供模組。在demo-3中,我們透過dev開發環境和prod生產環境區分,引用官方例項模組來建立例項,內容示例:
module "ec2_instance" {
source = "terraform-aws-modules/ec2-instance/aws"
name = "demo-3-prod"
instance_type = "t3.micro"
key_name = "mykeypair"
monitoring = true
vpc_security_group_ids = ["sg-12345678"]
subnet_id = "subnet-eddcdzz4"
tags = {
Terraform = "true"
Environment = "prod"
}
}
五、相關生態開源工具:Infisical金鑰管理平臺
使用Terraform時,會有AK和SK管理問題,如直接儲存在配置檔案中有洩露的風險,不儲存在配置檔案中每次使用都需要人工配置,多人使用,還需要相互傳遞,官方有對應收費版本的HCP Terraform,功能齊全,不差錢可以直接使用HCP Terraform。
如果想降低成本,又想提高安全性和便利性,使用開源專案就是非常不錯的選擇,Infisical 是開源金鑰管理平臺,GitHub地址:https://github.com/Infisical/infisical,產品定位:在您的團隊/基礎設施中同步金鑰,防止金鑰洩漏,非常合適搭配Terraform使用,並提供內部 PKI,有Python、Go、Java等程式語言SDK,同樣適用於普通程式開發中需要用到一些敏感資訊的地方
對於Terraform就介紹到這裡,相信你對於Terraform已經有更深的瞭解,自己動手實操起來,閱讀官網文件,定能熟練使用Terraform。如果對你有幫助,請點個關注,如果需要定製Terraform詳細教程請留言諮詢,嘿嘿。