【華為人】——創新,需要一點點超前
991
2022-05-29
本文不會介紹什么是Terraform,以及Terraform的使用場景,如果不了解的,請去[官方網站](https://www.terraform.io)了解,主要以創建一臺虛擬機作為案例,由簡到深介紹如何快速編寫Terraform Huaweicloud腳本。
### 創建一臺簡單的虛擬機
#### 華為云配置~準備
Terraform使用前首先需要配置Provider,配置provider有兩種方式:一種是使用AK/SK鑒權,一種是使用用戶名/密碼方式鑒權。為了安全起見,我們推薦使用AK/SK方式,
配置模板如下:
```
provider "huaweicloud" {
tenant_name = "tenant"
# the auth url format follows: https://iam.{region_id}.myhwclouds.com:443/v3
auth_url? ? = "https://iam.cn-north-1.myhwclouds.com/v3"
region? ? ? = "cn-north-1"
access_key? = "access key"
secret_key? = "secret key"
}
```
上面模板中的值需要根據你的賬號信息修改,其中特別注意:auth_url 根據region不同修改相應的region_id 部分,詳細參見注釋部分。
#### 配置虛擬機
配置云上任何資源,首先建議了解相應資源的業務,比如虛擬機,涉及到如下幾個方面的業務配置:
1. 虛擬機所處的網絡——是配置虛擬私有云多臺虛機共享公網網絡還是直接配置EIP提供公網業務。
2. 虛擬機的規格——主要是配置虛擬機的vCPU個數以及內存大小。
3. 安全組規則——允許開通那些業務端口。
4. 虛擬機鏡像——使用什么類型操作以及操作系統的版本,當然也可以使用私有的衍生操作系統。
5. 附加磁盤——是否需要額外掛載數據盤提供存儲空間。
6. 其它配置
在了解了這些之后,根據自身業務去配置相應的附加資源,這里本著通用、簡單的原則選取私有虛擬云不附帶磁盤的場景進行演示。
確定了業務場景后,開始準備相應的資源。首先是網絡,網絡這里采用最簡單的組網方式,一個VPC下一個subnet。在這里有兩種選擇,一種是使用OpenStack的網絡模型:[router](https://www.terraform.io/docs/providers/huaweicloud/r/networking_router_v2.html), [network](https://www.terraform.io/docs/providers/huaweicloud/r/networking_network_v2.html), [subnet](https://www.terraform.io/docs/providers/huaweicloud/r/networking_subnet_v2.html)。[interface](https://www.terraform.io/docs/providers/huaweicloud/r/networking_router_interface_v2.html)另一種是使用華為云簡化的網絡模型:[vpc](https://www.terraform.io/docs/providers/huaweicloud/r/vpc_v1.html), [subnet](https://www.terraform.io/docs/providers/huaweicloud/r/vpc_subnet_v1.html),? 對于前者,要稍微復雜一些,我們以此為例進行介紹,大致的模板如下:
```
resource "huaweicloud_networking_router_v2" "router" {
name? ? ? ? ? ? ?= "router_example"
admin_state_up? ?= "true"
}
resource "huaweicloud_networking_network_v2" "network" {
name? ? ? ? ? ?= "network_example"
admin_state_up = "true"
}
resource "huaweicloud_networking_subnet_v2" "subnet" {
name? ? ? ? ? ? = "subnet_example"
network_id? ? ? = "${huaweicloud_networking_network_v2.network.id}"
cidr? ? ? ? ? ? = "172.10.100.0/24"
ip_version? ? ? = 4
dns_nameservers = ["100.125.1.250", "114.114.115.115"]
}
resource "huaweicloud_networking_router_interface_v2" "interface" {
router_id = "${huaweicloud_networking_router_v2.router.id}"
subnet_id = "${huaweicloud_networking_subnet_v2.subnet.id}"
}
```
虛擬機規格屬于云內置不需要獨立創建資源,這里先跳過,虛擬機鏡像使用常規的通用鏡像,不需要創建資源,關于易用性的提升,我們將在后面介紹。
接下來就是創建虛擬機,虛擬機主要就是[instance](https://www.terraform.io/docs/providers/huaweicloud/r/compute_instance_v2.html)資源,簡要配置如下:
```
resource "huaweicloud_compute_instance_v2" "server_example" {
region = "cn-north-1"
availability_zone = "cn-north-1a"
name? ? ? ? ? ? = "server_test"
image_id? ? ? = "28accb67-755a-4f0a-b735-e2ad5e437be9"
flavor_name? ? ?= "s2.small.1"
security_groups = ["default"]
network {
uuid = "${huaweicloud_networking_network_v2.network.id}"
}
depends_on = ["huaweicloud_networking_router_interface_v2.interface"]
}
```
這樣一個可用的虛擬機就創建好了,把上面的腳本放到特定目錄執行terraform init, terraform apply就可以在你的賬號下創建出一臺虛擬機。
### 進一步擴展資源
有了第一步的簡單腳本后,如果業務不能滿足你的訴求,還需要定制更多的資源怎么辦?這里以安全組為例,我們以開通常規的80,22端口為例定義一個自定義安全組規則,看下如何擴展資源定義,安全組主要涉及兩個資源[secgroup](https://www.terraform.io/docs/providers/huaweicloud/r/networking_secgroup_v2.html), [secgroup_rule](https://www.terraform.io/docs/providers/huaweicloud/r/networking_secgroup_rule_v2.html)配置如下:
```
resource "huaweicloud_networking_secgroup_v2" "sg_example" {
name? ? ? ? = "sg_example"
description = "security group for test"
}
resource "huaweicloud_networking_secgroup_rule_v2" "sg_rule_ftp" {
direction? ? ? ? ?= "ingress"
ethertype? ? ? ? ?= "IPv4"
protocol? ? ? ? ? = "tcp"
port_range_min? ? = 22
port_range_max? ? = 22
remote_ip_prefix? = "192.168.10.0/24"
security_group_id = "${huaweicloud_networking_secgroup_v2.sg_example.id}"
}
resource "huaweicloud_networking_secgroup_rule_v2" "sg_rule_http" {
direction? ? ? ? ?= "ingress"
ethertype? ? ? ? ?= "IPv4"
protocol? ? ? ? ? = "tcp"
port_range_min? ? = 80
port_range_max? ? = 80
remote_ip_prefix? = "192.168.10.0/24"
security_group_id = "${huaweicloud_networking_secgroup_v2.sg_example.id}"
}
```
定義好以上資源以后,接下來就是需要修改虛擬機中安全組部分的引用上面創建出來的安全組,引用的語法是在資源引號里加? ```$(
```
resource "huaweicloud_compute_instance_v2" "server_example" {
......? #這里是省略,其它配置不在這里重復顯示,并不是一個正確配置
security_groups = ["${huaweicloud_networking_secgroup_v2.sg_example.id}"]
......
}
```
這樣就實現了虛擬機附屬資源的創建及使用。
這里以安全組為例介紹了如何擴展附加資源,對其它的附加資源也類似,建議以文檔中的example為模板進行相應修改,具體如何修改需要根據業務以及文檔中對各個字段的描述而定。但是方法一樣,這里就不再詳細介紹了。
### 腳本模板化
在這個過程中或許你已經發現,上面寫的腳本,每次創建不同業務的虛擬機的時候,需要在不同的腳本中去找參數進行修改,這樣有一些麻煩,那么有沒有辦法把腳本模板化呢,答案當然有。
Terraform配置支持變量,具體介紹參考這里 https://www.terraform.io/docs/configuration/variables.html
有了變量后,我們把配置中常變更的屬性值定義成變量集中放到一個tf文件,后續其它文件不需要做修改,只需要更改變量文件就可以了
這里以虛擬機規格為例給一個樣例,首先定義一個變量
```vars.tf
variable "flavor_name" {
default = "s2.small.1"
description = "Define the flavor name that will be used to create instance"
}
```
在虛擬機資源中引用該變量而不是寫死在這里。
```instance.tf
resource "huaweicloud_compute_instance_v2" "server_example" {
......
flavor_name? = "${var.flavor_name}"
......
}
```
實現了變量模板化后,在執行terraform命名時可以指定該變量的值來創建不同規格的虛擬機,如下:
```
terraform apply -var "flavor_name=s1.large.2"
```
### 內置資源易用性改進
前一節將配置腳本模板化以后,可以有效將模板編寫人員與使用人員角色分開,使得模板編寫人是huaweicloud的配置專家,模板使用人員則是業務配置專家。
但是,光這樣還是不夠,下面來看一個例子,按照上一節我們將鏡像進行模板化,最后得到的模板大致會是如下:
```vars.tf
variable "image" {
default = "28accb67-755a-4f0a-b735-e2ad5e437be9"
description = "Define the image that will be used to create instance"
}
variable "flavor_name" {
default = "s2.small.1"
description = "Define the flavor name that will be used to create instance"
}
```
```
resource "huaweicloud_compute_instance_v2" "server_example" {
region = "cn-north-1"
availability_zone = "cn-north-1a"
name? ? ? ? ? ? = "server_test"
image_id? ? ? = "${var.image}"
flavor_name? ? ?= "${var.flavor_name}"
security_groups = ["default"]
network {
uuid = "${huaweicloud_networking_network_v2.network.id}"
}
depends_on = ["huaweicloud_networking_router_interface_v2.interface"]
}
```
接下來使用這個腳本模板的人就困惑了——這個Image需要的是一個id,他知道需要哪種類型什么版本的鏡像,但是不知道id啊,到哪里去取呢?
那么有沒有好的辦法只輸入一個大概的名稱呢?答案肯定,那就是[datasource](https://www.terraform.io/docs/configuration/data-sources.html)
```
data "huaweicloud_images_image_v2" "ubuntu" {
name = "Ubuntu 16.04 server 64bit"
most_recent = true
}
```
```
resource "huaweicloud_compute_instance_v2" "server_example" {
region = "cn-north-1"
availability_zone = "cn-north-1a"
name? ? ? ? ? ? = "server_test"
image_id? ? ? = "${data.huaweicloud_images_image_v2.ubuntu.id}"
flavor_name? ? ?= "${var.flavor_name}"
security_groups = ["${huaweicloud_networking_secgroup_v2.sg_example.name}"]
network {
uuid = "${huaweicloud_networking_network_v2.network.id}"
}
depends_on = ["huaweicloud_networking_router_interface_v2.interface"]
}
```
### 輸出結果
創建完資源后,如何向命令行返回一些資源信息,如創建完虛擬機以后,希望能返回該虛擬機內網IP,Terraform 提供另一個類似資源的定義——[output](https://www.terraform.io/docs/configuration/outputs.html), 大致定義如下:
```
output "instance_address" {
value = "${huaweicloud_compute_instance_v2.server_example.access_ip_v4}"
}
```
格式比較簡單,只需要定義一個output的名字,然后在value里引用資源的屬性即可。
這樣當執行完```terraform apply```命令后,命令行會回顯如下信息:
```
instance_address = 172.16.10.158
```
到這里,基本的腳本編寫涉及的方面就介紹完了。
### 資源批量創建
如前面所說,有了上面的的模板后,基本上模板使用者和創建者角色可以分開了,基礎的配置基本也就入門了,80%的case都可以應對了,接下來介紹一些更高級的能力。
首先我們看下如何批量創建相同類型的虛擬機,基礎模板和單個虛擬機是一樣的,唯一要做兩件事情,一是定義count屬性(批量資源個數),二是解決名稱這類不能重復的問題,大致格式如下:
```
resource "huaweicloud_compute_instance_v2" "server_example" {
.......
count = "2"
name? ? ? ? ? ? = "server_test_${format("%02d",count.index+1)}"
......
}
```
這里count定義了創建兩臺虛擬機,name屬性里使用了```server_test_```作為前綴,后面跟上批量虛擬機序號作為名稱來命名。
當執行terraform plan時,系統將看到兩個instance資源,一個叫 server_test_01, 另一個叫server_test_02.
特別注意:批量創建虛擬機的個數不建議設置太大,建議不要超過500,超過這個值后,terraform destroy將耗時很長。
### 模塊化管理資源
截止到這里,基本常用的都介紹了,更深入將會有這樣一個場景,如果terraform管理的系統比較復雜,涉及的資源很多,腳本集中放置管理的話,復雜度將會很大,為了解決這樣的問題,terraform提供了[module](https://www.terraform.io/docs/configuration/outputs.html)的機制,將不同業務資源劃分為更小的組進行管理,詳細請參見官網,這里就不再給例子了。
除了上面介紹的這里功能,其實terraform還有很多處理的函數(如前面用到的format)以及元素查找等能力,這里高級能力需要你熟悉基礎后慢慢去探索、使用、熟悉。它們的使用可以提升腳本的易用性,豐富應用場景,但是不一定是必須,如果你掌握了上面介紹的,再配合官方文檔介紹,我相信90% case可以很輕松搞定,剩下的也是這篇文章最后要介紹的一個點——如果terraform plan/apply過程中出現錯誤了怎么定位?
1. 首先設置三個環境變量,linux下命令如下:
```
export TF_LOG=DEBUG
export TF_LOG_PATH=/var/log/terraform.log? #這里是指定日志文件路徑
export OS_DEBUG=1
```
3. 再次執行出錯的terraform命名后,查看日志文檔中ERROR類型錯誤。它能給你提供非常詳細的錯誤線索。
可執行腳本見附件
附件: example_hw.zip 4.79M 下載次數:90次
彈性云服務器 ECS 虛擬化
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。