背景
越來越多的公司已經熟知并運用“基礎設施即代碼”來構建和維護自己的云基礎設施。目前也有許多的自動化構建工具協助用戶通過腳本進行云資源的部署和生命周期的管理,如:Terraform、Ansible、Chef等。但是,在實施過程中,都遇到了如何獲取鏡像id、可用區、實例類型id,如何跟自己的腳本相結合而備受困擾?
請首先檢查一下您的構建腳本,是否有imageId=centos_6u8_64_40G_cloudinit_20161115.vhd
、instanceType=ecs.s2.large
、zoneId=cn-beijing-a
,類似這樣hardcode的代碼或者配置?您是否遇到過前幾天還順利運行的腳本, 再次創建的時候卻報Image.Invalid
錯誤?另外,您是通過什么方式獲取到的這些code值,通過ECS售賣頁?本文介紹如何通過Terraform Data Source完美解決這些問題,優雅的創建ECS instance。
Terraform簡介
Terraform 是管理云基礎設施的開源工具,支持阿里云、AWS、Azure、GoogleCloud、DigitalOcean等。他通過模板來定義基礎設施,通過指令來實現資源創建/更新/銷毀的全生命周期管理。創建ECS實例模板如下:
resource "alicloud_instance" "web" {# cn-beijingavailability_zone = "cn-beijing-b"image_id = "ubuntu_140405_32_40G_cloudinit_20161115.vhd"system_disk_category = "cloud_ssd"instance_type = "ecs.n1.small"internet_charge_type = "PayByBandwidth"security_groups = ["${alicloud_security_group.tf_test_foo.id}"]instance_name = "test_foo"io_optimized = "optimized"
}
Install Terraform, 然后執行terraform apply
,稍等片刻一臺ECS實例就被創建完成。
Resource Data簡介
對于常用的查詢類資源,可以通過Resource Data實時獲取,也能在模板中進行引用。Resource Data是只讀類型的資源,支持參數過濾,不會改變基礎架構狀態。這里以Ecs instance_type為例,做一個介紹:
- 之前:
根據需要去ECS售賣頁上去篩選實例規格,然后把規格code復制、粘貼到模板中。這種方式,不僅操作繁瑣,也跟自動化運維的思路不相稱。 - 現在:
以描述的方式填寫過濾條件,Resource Data會進行查詢并返回結果,模板片段如下:
data "alicloud_instance_types" "1c2g" {cpu_core_count = 1memory_size = 2
}
這里,我們定義了一個1核2G的Resource Data。執行terraform apply
,您將會得到所有1核2G實例規格的一個Map,如下圖:
{"cpu_core_count": "1","memory_size": "2","id": "2404647170","instance_types.#": "3","instance_types.0.cpu_core_count": "1","instance_types.0.family": "ecs.s1","instance_types.0.id": "ecs.s1.small","instance_types.0.memory_size": "2","instance_types.1.cpu_core_count": "1","instance_types.1.family": "ecs.n1","instance_types.1.id": "ecs.n1.small","instance_types.1.memory_size": "2","instance_types.2.cpu_core_count": "1","instance_types.2.family": "ecs.n4","instance_types.2.id": "ecs.n4.small","instance_types.2.memory_size": "2"}
其中,
- `cpu_core_count`和`memory_size`是我們自定義的篩選條件
- `instance_types.#`代表返回結果條目數
- 每個實例類型的結構包含`cpu_core_count`、`family`、`id`、`memory_size`四個屬性。其中id是實例規格ID,如`ecs.s1.small`
創建Ecs實例
Terraform 已經集成了阿里云地域、可用區、鏡像、實例規格類型幾種常用Data Resource. 這幾個資源組合到一起,可以發揮更大的作用。
舉個例子:在大多數情況下,我們往往并不是非常關心實例具體到哪個可用區,但是API接口又需要我們指明可用區,然而不同可用區支持的實例類型、磁盤類型、網絡類型都不同。要選到滿意的搭配,需要煞費一番周折。但是,通過組合Data Source,多重過濾參數,可以很輕松的進行選配,即使調整參數,也不需要在頁面上點來點去。
一般的購買行為是這樣的:首先,我們都會有個初始需求。比如,操作系統必須是centos的,實例類型是低配的(1c1g ~ 2c2g),磁盤類型需要是固態云盤。然后,根據這個清單去嘗試購買資源,這個過程中根據庫存情況進行微調。
用模板描述資源過程是類似的:先定義鏡像、實例類型和可用區的篩選條件,然后在Ecs的配置中引用他們,最后嘗試去創建資源。如果庫存不足,則進行參數調整。
模板如下:
data "alicloud_images" "centos" {owners = "system"name_regex = "^centos_6"
}data "alicloud_instance_types" "1c2g" {cpu_core_count = 1memory_size = 2instance_type_family = "ecs.n1"
}data "alicloud_zones" "default" {"available_instance_type"= "${data.alicloud_instance_types.1c2g.instance_types.0.id}""available_disk_category"= "cloud_ssd"
}resource "alicloud_instance" "instance" {image_id = "${data.alicloud_images.centos.0.image_id}"instance_type = "${data.alicloud_instance_types.1c2g.instance_types.0.id}"availability_zone = "${data.alicloud_zones.default.zones.0.id}"security_groups = ["${alicloud_security_group.group.id}"]internet_charge_type = "PayByTraffic"io_optimized = "optimized"instance_charge_type = "PostPaid"system_disk_category = "cloud_ssd"}resource "alicloud_security_group" "group" {name = "tf-sg"description = "New security group"
}
模板詳解:
- alicloud_images: 篩選centos類型的系統鏡像
- alicloud_instance_types: 選擇1核2G的Ecs實例規格
- alicloud_zones: 選擇支持上述實例類型的可用區
- alicloud_instance: 描述Ecs 實例配置
- alicloud_security_group: 定義安全組
運行terraform apply
,結果如下:
data.alicloud_instance_types.1c2g: Refreshing state...
data.alicloud_images.centos: Refreshing state...
data.alicloud_zones.default: Refreshing state...
alicloud_security_group.group: Creating...description: "" => "New security group"name: "" => "tf-sg"
alicloud_security_group.group: Creation complete
alicloud_instance.instance: Creating...availability_zone: "" => "cn-beijing-c"instance_type: "" => "ecs.n1.small"image_id: "" => "centos_6u8_64_40G_cloudinit_20161115.vhd"
從運行結果來看,我們并沒有提前指定實例類型、鏡像、可用區的具體值,而是根據需求描述Terraform在運行時去查找到了合適的值。至此,一個模板把整個ECS的選配(從實例類型、鏡像、可用區)等自動化配置了起來,不僅不需要人工的干預,還能進行后續的擴展、升級和維護。
反饋
本文講述了一種自動化選配、構建ECS資源的方法。大家對自動構建工具Terraform感興趣,或者有問題也可以在github https://github.com/alibaba/terraform-provider 的Issue中提問。