當Terraform遇上ECS(一)——DataSource篇

背景

越來越多的公司已經熟知并運用“基礎設施即代碼”來構建和維護自己的云基礎設施。目前也有許多的自動化構建工具協助用戶通過腳本進行云資源的部署和生命周期的管理,如:Terraform、Ansible、Chef等。但是,在實施過程中,都遇到了如何獲取鏡像id、可用區、實例類型id,如何跟自己的腳本相結合而備受困擾?

請首先檢查一下您的構建腳本,是否有imageId=centos_6u8_64_40G_cloudinit_20161115.vhdinstanceType=ecs.s2.largezoneId=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中提問。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/457254.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457254.shtml
英文地址,請注明出處:http://en.pswp.cn/news/457254.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【BZOJ 1597】 [Usaco2008 Mar]土地購買 (斜率優化)

1597: [Usaco2008 Mar]土地購買 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3601 Solved: 1322Description 農夫John準備擴大他的農場,他正在考慮N (1 < N < 50,000) 塊長方形的土地. 每塊土地的長寬滿足(1 < 寬 < 1,000,000; 1 < 長 < 1,000,000). …

深入淺出學java_《深入淺出學JAVA開發初級》

整體說明&#xff1a;Java私塾的這一套視頻是完全真實課堂錄制&#xff0c;實際上課時間為十一天&#xff0c;主要內容包括&#xff1a;1&#xff1a;系統完整的學習Java的基礎知識2&#xff1a;深入剖析重點知識點的理論3&#xff1a;超多的編程題目和程序講解4&#xff1a;最…

重定位與鏈接腳本

1.為什么需要重定位   位置無關編碼(PIC&#xff0c;position independent code)&#xff1a;匯編源文件被編碼成二進制可執行程序時編碼方式與位置&#xff08;內存地址&#xff09;無關。  位置有關編碼&#xff1a;匯編源碼編碼成二進制可執行程序后和內存地址是有關的。…

Linux bashrc和profile的用途和區別

導讀使用終端ssh登錄Linux操作系統的控制臺后&#xff0c;會出現一個提示符號&#xff08;例如&#xff1a;#或~&#xff09;&#xff0c;在這個提示符號之后可以輸入命令&#xff0c;Linux根據輸入的命令會做回應&#xff0c;這一連串的動作是由一個所謂的Shell來做處理。Shel…

python讀取word文檔結構圖_Word 有什么技巧,讓你相見恨晚?

Word作為日常辦公最常用的軟件之一&#xff0c;其實真沒你想得那么簡單&#xff01;你不知道的每一個技巧&#xff0c;都會讓你相見恨晚&#xff01;每當身邊的小伙伴詢問這些疑難雜癥時&#xff0c;我都會拋出這張圖…真的沒騙你&#xff0c;我們遇到的 99% 的Word難題&#x…

Golang 特性簡介

by sheepbao 主要大概介紹go語言的歷史和特性&#xff0c;簡單的入門。 來歷 很久以前&#xff0c;有一個IT公司&#xff0c;這公司有個傳統&#xff0c;允許員工擁有20%自由時間來開發實驗性項目。在2007的某一天&#xff0c;公司的幾個大牛&#xff0c;正在用c開發一些比較繁…

HTML實體字符轉化為HTML標簽

html_entity_decode方法 參數描述string必需。規定要解碼的字符串。flags 可選。規定如何處理引號以及使用哪種文檔類型。 可用的引號類型&#xff1a; ENT_COMPAT - 默認。僅解碼雙引號。ENT_QUOTES - 解碼雙引號和單引號。ENT_NOQUOTES - 不解碼任何引號。規定所使用文檔類型…

華為2017java筆試題_2017年java華為面試題

2017年java華為面試題通過HCNP認證&#xff0c;將證明您對中小型網絡有全面深入的了解&#xff0c;掌握中小型網絡的通用技術&#xff0c;并具備獨立設計中小型網絡以及使用華為路由交換設備實施設計的能力。下面是小編收集的關于java華為面試題&#xff0c;希望大家認真閱讀!1…

Tomcat 配置詳解/優化方案

Server.xml 【原地址&#xff1a;http://blog.csdn.net/cicada688/article/details/14451541】 Server.xml配置文件用于對整個容器進行相關的配置。 <Server>元素&#xff1a;是整個配置文件的根元素。表示整個Catalina容器。 屬性&#xff1a;className&#xff1a;實現…

MySQL創建數據庫與創建用戶以及授權

1、create schema [數據庫名稱] default character set utf8 collate utf8_general_ci;--創建數據庫 采用create schema和create database創建數據庫的效果一樣。 2、create user [用戶名稱]% identified by [用戶密碼];--創建用戶 密碼8位以上&#xff0c;包括&#xff1a;大寫…

java 防止url重復請求_Web項目如何防止客戶端重復發送請求

在Web項目中&#xff0c;有一些請求或操作會對數據產生影響(比如新增、刪除、更新)&#xff0c;針對這類請求一般都需要做一些保護&#xff0c;以防止用戶有意或無意的重復發起這樣的請求導致的數據錯亂。本文總結了一些防止客戶端重復發送請求的方法。方法一&#xff1a;JS監聽…

【bzoj1010-toy】斜率優化入門模板

dsy1010: [HNOI2008]玩具裝箱 【題目描述】 有n個數&#xff0c;分成連續的若干段&#xff0c;每段&#xff08;假設從第j個到第i個組成一段&#xff09;的分數為 (X-L)^2&#xff0c;X為j-iSigma(Ck) i<k<j&#xff0c;其中L是一個常量。目標&#xff1a;各段分數的總和…

itellyou操作系統,office等軟件的很全的下載站

itellyou操作系統&#xff0c;office等軟件的很全的下載站http://www.itellyou.cn/轉載于:https://blog.51cto.com/wangheyu1/1894724

矩陣的馬鞍點

#include<stdio.h>#define n 4//馬鞍點是第I行值最小第J列值最大 void maxmin(int a[n][n]){ int i,j ,flag; int max[n],min[n]; for(i0;i<n;i) { min[i]a[i][0];//將數組每行的第一個元素賦值給min[]數組 for(j1;j<n;j) { if(a[i][j]<min[i]) min[i]a[i][j];…

Linux運維工程師面試-部分題庫

一、Linux操作系統知識 1.常見的Linux發行版本都有什么&#xff1f;你最擅長哪一個&#xff1f;它的官網網站是什么&#xff1f;說明你擅長哪一塊&#xff1f; 2.Linux開機啟動流程詳細步驟是什么&#xff1f;系統安裝完&#xff0c;忘記密碼如何破解&#xff1f; 3.企業中Linu…

java統計系統線程數_Java并發(八)計算線程池最佳線程數

目錄一、理論分析二、實際應用為了加快程序處理速度&#xff0c;我們會將問題分解成若干個并發執行的任務。并且創建線程池&#xff0c;將任務委派給線程池中的線程&#xff0c;以便使它們可以并發地執行。在高并發的情況下采用線程池&#xff0c;可以有效降低線程創建釋放的時…

php大小寫轉換函數

1.將字符串轉換成小寫 strtolower(): 該函數將傳入的字符串參數所有的字符都轉換成小寫,并以小定形式放回這個字 符串.例: <?php$str "I want To FLY";$str strtolower($str);echo $str; ?>輸出結果: i want to fly 2.將字符轉成大寫 strtoupper(): 該…

關于移動端 1px 像素問題

移動端1px變粗的原因 移動端html的header總會有一句<meta name"viewport" content"widthdevice-width, initial-scale1.0, maximum-scale1.0, user-scalableno">這句話定義了本頁面的viewport的寬度為設備寬度,初始縮放值和最大縮放值都為1,并禁止了…

java框架概念_java概念(2)

java概念(2)重載和重寫重載&#xff1a;同一個類中&#xff0c;方法名相同&#xff0c;參數不同重寫&#xff1a;父子類中&#xff0c;子類重新定義父類的方法多態? 多態&#xff1a;同一種行為&#xff0c;不同的對象有不同的表現形式。? 重載 編譯時根據參數決定調用的方法…