通過Terraform,您可以使用代碼配置實現物理機等資源的分配。也就是說通過Terraform,寫一個設定檔,就可以協助您購買一台雲端服務器,或者申請到Elasticsearch、OSS等雲資源。本文介紹通過Terraform管理Elasticsearch的方法,包括建立、更新、查看、刪除執行個體等操作。
背景資訊
您可以通過以下兩種方式安裝並配置Terraform環境:
在本地安裝和配置Terraform(本文以此為例)。
安裝並配置Terraform
前往Terraform官網,下載適用於您的作業系統的程式包。
本文以Linux系統為例。如果您還沒有Linux環境,可購買阿里雲ECS執行個體,詳情請參見步驟一:建立ECS執行個體。
將程式包解壓到/usr/local/bin目錄。
如果您需要將可執行檔解壓到其他目錄,請按照以下方法為其定義全域路徑:
Linux:參見在Linux系統定義全域路徑
Windows:參見在Windows系統定義全域路徑
Mac:參見在Mac系統定義全域路徑
執行
terraform
命令驗證路徑配置。執行成功後,返回如下結果。
建立RAM使用者,並為其授權。
為提高許可權管理的靈活性和安全性,建議您建立RAM使用者,並為其授權。
建立測試目錄。
因為每個Terraform專案都需要建立一個獨立的執行目錄,所以需要先建立一個測試目錄。以下建立一個名為terraform-test的測試目錄。
mkdir terraform-test
進入terraform-test目錄。
cd terraform-test
建立設定檔,並配置身份認證資訊。
Terraform在運行時,會讀取該目錄下所有的*.tf和*.tfvars檔案。請按照實際需求,將配置資訊寫入到不同的檔案中。以下列出幾個常用的設定檔。
設定檔
說明
provider.tf
provider配置。
terraform.tfvars
配置provider要用到的變數。
varable.tf
通用變數。
resource.tf
資源定義。
data.tf
包檔案定義。
output.tf
輸出檔案定義。
例如建立provider.tf檔案時,使用
vim provider.tf
開啟檔案,並按照以下格式配置您的身份認證資訊。provider "alicloud" { region = "cn-hangzhou" access_key = "LTA**********NO2" secret_key = "MOk8x0*********************wwff" }
更多配置資訊請參見alicloud_elasticsearch_instance。
使用
mkdir -p plugh
命令,在目前的目錄下建立plugh目錄,下載provider外掛程式並解壓到plugh目錄下。初始化工作目錄,使用-plugin-dir指定provider所在的路徑,完成配置。
terraform init -plugin-dir=./plugh/
返回Terraform has been successfully initialized表示初始化成功。
重要每個Terraform專案在建立Terraform工作目錄並建立設定檔後,都需要初始化工作目錄。
通過Terraform建立Elasticsearch執行個體
在測試目錄下,建立一個elastic.tf設定檔。
參考以下指令碼配置elastic.tf檔案,建立一個跨可用性區域的通用商業版6.7版本的Elasticsearch執行個體。
resource "alicloud_elasticsearch_instance" "instance" { description = "testInstanceName" instance_charge_type = "PostPaid" data_node_amount = "2" data_node_spec = "elasticsearch.sn2ne.large" data_node_disk_size = "20" data_node_disk_type = "cloud_ssd" vswitch_id = "vsw-bp1f7r0ma00pf9h2l****" password = "es_password" version = "6.7_with_X-Pack" master_node_spec = "elasticsearch.sn2ne.large" zone_count = "1" }
provider外掛程式支援的所有參數說明如下。
參數
是否必選
描述
description
否
執行個體自訂名稱的描述。
instance_charge_type
否
計費模式。可選值:
PostPaid(預設):隨用隨付
PrePaid:訂用帳戶
period
否
購買時間長度(單位:月),當instance_charge_type為PrePaid時有效。可選值:1~9、12、24、36,預設是1個月。
data_node_amount
是
ES叢集的資料節點的個數。可選值:2~50。
data_node_spec
是
資料節點執行個體規格。
data_node_disk_size
是
指定磁碟空間。不同類型的磁碟,支援的最大儲存空間大小不同:
cloud_ssd:SSD雲端硬碟,支援最大儲存2048 GB(2 TB)。
cloud_efficiency:高效雲端硬碟,支援最大5 TB的儲存空間,提供較為低廉的儲存能力,適合大規模資料量的日誌及分析情境。高效雲端硬碟超過2048 GB時,只能取:2560、3072、3584、4096、4608、5120。
data_node_disk_type
是
儲存類型。可選值:
cloud_ssd:SSD雲端硬碟。
cloud_efficiency:高效雲端硬碟。
vswitch_id
是
虛擬交換器的執行個體ID。
password
否
執行個體密碼,支援大小寫字母、數字、特殊字元,長度為8~32位字元。特殊字元包括
!@#$%^&*()_+-=
。kms_encrypted_password
否
KMS加密密碼。如果配置了password,該欄位將被忽略。password和kms_encrypted_password必須配置一個。
kms_encryption_context
否
KMS加密上下文。只有設定了kms_encrypted_password時才有效。用於對使用kms_encrypted_password加密建立或更新的執行個體進行解密,詳情請參見encryption context。
version
是
Elasticsearch版本。可選值:
5.5.3_with_X-Pack:5.5.3版本。
6.3_with_X-Pack:6.3.0版本。
6.7_with_X-Pack:6.7.0版本。
說明Terraform不支援雲原生架構執行個體版本。
private_whitelist
否
設定執行個體的Virtual Private Cloud(Virtual Private Cloud)網路白名單。
kibana_whitelist
否
設定Kibana訪問白名單。
master_node_spec
否
Master節點規格。
advancedDedicateMaster
否
用於表示是否建立專有主節點,取值含義如下:
true:建立專有主節點。如果部署多可用性區域並且啟用專有主節點,則需要將該參數設定為true。
false(預設值):不建立專有主節點。
zone_count
否
可用性區域數量。取值為1~3,data_node_amount必須是該值的整數倍。
更多參數詳情請參見alicloud_elasticsearch_instance。
重要kms_encrypted_password和kms_encryption_context參數要求provider外掛程式版本在1.57.1及以上;zone_count參數要求provider外掛程式版本在1.44.0及以上。
如果需要購買除資料節點外的其他屬性節點,請參見createInstance參數開啟其他節點屬性。例如,購買多可用性區域專有主節點,指令碼中需要加入
advancedDedicateMaster="true"
。
執行
terraform plan
命令,查看將會執行的操作。執行成功後,返回如下結果。
Refreshing Terraform state in-memory prior to plan... The refreshed state will be used to calculate this plan, but will not be persisted to local or remote state storage. ------------------------------------------------------------------------ An execution plan has been generated and is shown below. Resource actions are indicated with the following symbols: + create Terraform will perform the following actions: # alicloud_elasticsearch_instance.instance will be created + resource "alicloud_elasticsearch_instance" "instance" { + description = "testInstanceName" + data_node_amount = 2 + data_node_disk_size = 20 + data_node_disk_type = "cloud_ssd" + data_node_spec = "elasticsearch.sn2ne.large" + domain = (known after apply) + id = (known after apply) + instance_charge_type = "PostPaid" + kibana_domain = (known after apply) + kibana_port = (known after apply) + kibana_whitelist = (known after apply) + master_node_spec = "elasticsearch.sn2ne.large" + password = (sensitive value) + port = (known after apply) + private_whitelist = (known after apply) + public_whitelist = (known after apply) + status = (known after apply) + version = "6.7_with_X-Pack" + vswitch_id = "vsw-bp1f7r0ma00pf9h2l****" + zone_count = 1 } Plan: 1 to add, 0 to change, 0 to destroy. ------------------------------------------------------------------------ Note: You didn't specify an "-out" parameter to save this plan, so Terraform can't guarantee that exactly these actions will be performed if "terraform apply" is subsequently run.
執行
terraform apply
命令,運行工作目錄中的設定檔,輸入yes。執行成功後,返回如下結果。
Plan: 1 to add, 0 to change, 0 to destroy. Do you want to perform these actions? Terraform will perform the actions described above. Only 'yes' will be accepted to approve. Enter a value: yes alicloud_elasticsearch_instance.instance: Creating... alicloud_elasticsearch_instance.instance: Still creating... [10s elapsed] alicloud_elasticsearch_instance.instance: Still creating... [20s elapsed] ............... Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
登入Elasticsearch控制台,查看建立成功的Elasticsearch叢集。
通過Terraform更新Elasticsearch資源配置
進入測試目錄,修改elastic.tf設定檔。
例如修改data_node_disk_size為50。
resource "alicloud_elasticsearch_instance" "instance" { instance_charge_type = "PostPaid" data_node_amount = "2" data_node_spec = "elasticsearch.sn2ne.large" data_node_disk_size = "50" data_node_disk_type = "cloud_ssd" vswitch_id = "vsw-bp1f7r0ma00pf9h2l****" password = "es_password" version = "6.7_with_X-Pack" master_node_spec = "elasticsearch.sn2ne.large" zone_count = "1" }
重要執行個體建立成功後,version無法修改。
每次請求,只支援修改一項配置。例如同時修改data_node_spec和data_node_disk_size,系統將會出現錯誤響應。
執行
terraform plan
查看資源配置資訊。執行
terraform apply
等待資源升配結束。
將Elasticsearch資源匯入Terraform
如果Elasticsearch執行個體不是通過Terraform建立的,可通過命令,將Elasticsearch匯入到Terraform的state目錄下進行管理。
在測試目錄下,建立一個main.tf檔案。
vim main.tf
進行資源聲明,指定所要匯入的資源在state中的存放路徑。
resource "alicloud_elasticsearch_instance" "test" {}
開始資源匯入操作。
terraform import alicloud_elasticsearch_instance.test es-cn-0pp1f1y5g000h****
執行成功後,返回如下結果。
alicloud_elasticsearch_instance.test: Importing from ID "es-cn-0pp1f1y5g000h****"... alicloud_elasticsearch_instance.test: Import prepared! Prepared alicloud_elasticsearch_instance for import alicloud_elasticsearch_instance.test: Refreshing state... [id=es-cn-0pp1f1y5g000h****] Import successful! The resources that were imported are shown above. These resources are now in your Terraform state and will henceforth be managed by Terraform.
說明有關import如何?存量資源的管理,請參見一文揭秘存量雲資源的管理難題。
查看Terraform管理的所有Elasticsearch資源
使用terraform show
命令,查看當前state中所有被管理的資源及其所有屬性值。
# alicloud_elasticsearch_instance.instance:
resource "alicloud_elasticsearch_instance" "instance" {
data_node_amount = 2
data_node_disk_size = 20
data_node_disk_type = "cloud_ssd"
data_node_spec = "elasticsearch.sn2ne.large"
domain = "es-cn-dssf9op81lz4q****.elasticsearch.aliyuncs.com"
id = "es-cn-dssf9op81lz4q****"
instance_charge_type = "PostPaid"
kibana_domain = "es-cn-dssf9op81lz4q****.kibana.elasticsearch.aliyuncs.com"
kibana_port = 5601
kibana_whitelist = []
master_node_spec = "elasticsearch.sn2ne.large"
password = (sensitive value)
port = 9200
private_whitelist = []
public_whitelist = []
status = "active"
version = "6.7.0_with_X-Pack"
vswitch_id = "vsw-bp1f7r0ma00pf9h2l****"
zone_count = 1
}
# alicloud_elasticsearch_instance.test:
resource "alicloud_elasticsearch_instance" "test" {
data_node_amount = 3
data_node_disk_size = 51
data_node_disk_type = "cloud_ssd"
data_node_spec = "elasticsearch.r5.large"
domain = "es-cn-0pp1f1y5g000h****.elasticsearch.aliyuncs.com"
id = "es-cn-0pp1f1y5g000h****"
instance_charge_type = "PostPaid"
kibana_domain = "es-cn-0pp1f1y5g000h****.kibana.elasticsearch.aliyuncs.com"
kibana_port = 5601
kibana_whitelist = []
port = 9200
private_whitelist = []
public_whitelist = []
status = "active"
version = "6.7.0_with_X-Pack"
vswitch_id = "vsw-bp1f7r0ma00pf9h2l****"
zone_count = 1
timeouts {}
}
通過Terraform刪除Elasticsearch執行個體
執行個體刪除後將不可恢複,執行個體中的所有資料將被清空。
進入測試目錄,執行terraform destroy
命令,輸入yes,即可刪除該執行個體。
# terraform destroy
alicloud_elasticsearch_instance.instance: Refreshing state... [id=es-cn-v3x49h5397fau****]
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
- destroy
Terraform will perform the following actions:
# alicloud_elasticsearch_instance.instance will be destroyed
- resource "alicloud_elasticsearch_instance" "instance" {
- data_node_amount = 2 -> null
- data_node_disk_size = 20 -> null
- data_node_disk_type = "cloud_ssd" -> null
- data_node_spec = "elasticsearch.sn2ne.large" -> null
- domain = "es-cn-v3x49h5397fau****.elasticsearch.aliyuncs.com" -> null
- id = "es-cn-v3x49h5397fau****" -> null
- instance_charge_type = "PostPaid" -> null
- kibana_domain = "es-cn-v3x49h5397fau****.kibana.elasticsearch.aliyuncs.com" -> null
- kibana_port = 5601 -> null
- kibana_whitelist = [] -> null
- master_node_spec = "elasticsearch.sn2ne.large" -> null
- password = (sensitive value)
- port = 9200 -> null
- private_whitelist = [] -> null
- public_whitelist = [] -> null
- status = "active" -> null
- version = "6.7.0_with_X-Pack" -> null
- vswitch_id = "vsw-bp1f7r0ma00pf9h2l****" -> null
- zone_count = 1 -> null
}
Plan: 0 to add, 0 to change, 1 to destroy.
Do you really want to destroy all resources?
Terraform will destroy all your managed infrastructure, as shown above.
There is no undo. Only 'yes' will be accepted to confirm.
Enter a value: yes
alicloud_elasticsearch_instance.instance: Destroying... [id=es-cn-v3x49h5397fau****]
alicloud_elasticsearch_instance.instance: Still destroying... [id=es-cn-v3x49h5397fau****, 10s elapsed]
alicloud_elasticsearch_instance.instance: Still destroying... [id=es-cn-v3x49h5397fau****, 20s elapsed]
alicloud_elasticsearch_instance.instance: Still destroying... [id=es-cn-v3x49h5397fau****, 30s elapsed]
alicloud_elasticsearch_instance.instance: Still destroying... [id=es-cn-v3x49h5397fau****, 40s elapsed]
alicloud_elasticsearch_instance.instance: Still destroying... [id=es-cn-v3x49h5397fau****, 50s elapsed]
alicloud_elasticsearch_instance.instance: Still destroying... [id=es-cn-v3x49h5397fau****, 1m0s elapsed]
alicloud_elasticsearch_instance.instance: Still destroying... [id=es-cn-v3x49h5397fau****, 1m10s elapsed]
alicloud_elasticsearch_instance.instance: Still destroying... [id=es-cn-v3x49h5397fau****, 1m20s elapsed]
alicloud_elasticsearch_instance.instance: Still destroying... [id=es-cn-v3x49h5397fau****, 1m30s elapsed]
alicloud_elasticsearch_instance.instance: Still destroying... [id=es-cn-v3x49h5397fau****, 1m40s elapsed]
alicloud_elasticsearch_instance.instance: Still destroying... [id=es-cn-v3x49h5397fau****, 1m50s elapsed]
alicloud_elasticsearch_instance.instance: Still destroying... [id=es-cn-v3x49h5397fau****, 2m0s elapsed]
alicloud_elasticsearch_instance.instance: Still destroying... [id=es-cn-v3x49h5397fau****, 2m10s elapsed]
alicloud_elasticsearch_instance.instance: Still destroying... [id=es-cn-v3x49h5397fau****, 2m20s elapsed]
alicloud_elasticsearch_instance.instance: Still destroying... [id=es-cn-v3x49h5397fau****, 2m30s elapsed]
alicloud_elasticsearch_instance.instance: Still destroying... [id=es-cn-v3x49h5397fau****, 2m40s elapsed]
alicloud_elasticsearch_instance.instance: Destruction complete after 10m2s
Destroy complete! Resources: 1 destroyed.