背景

越来越多的公司已经熟知并运用“基础设施即代码”来构建和维护自己的云基础设施。目前也有许多的自动化构建工具协助用户通过脚本进行云资源的部署和生命周期的管理,如: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中提问。

当Terraform遇上ECS(一)——DataSource篇相关推荐

  1. 当Myelipse遇上Git(旺旺篇)

    让Myelipse姐姐帮忙开发是一件很愉悦的事情.但旺旺最近遇到了一件很苦恼的事情,每次项目做到一定的阶段时,为了防止修改出错,它都要手动的去myeclipse->workplace目录下把项目 ...

  2. 推荐系统遇上深度学习,9篇阿里推荐论文汇总!

    作者 | 石晓文 转载自小小挖掘机(ID: wAIsjwj) 业界常用的推荐系统主要分为两个阶段,召回阶段和精排阶段,当然有时候在最后还会接一些打散或者探索的规则,这点咱们就不考虑了. 前面九篇文章中 ...

  3. 华硕无线路由打印机服务器,享受DIY的快乐 篇四:当普通打印机遇上智能路由器——网络打印机配置教程(以华硕AC66U B1为例)...

    享受DIY的快乐 篇四:当普通打印机遇上智能路由器--网络打印机配置教程(以华硕AC66U B1为例) 2020-07-15 15:27:48 21点赞 238收藏 41评论 创作立场声明:本文系作者 ...

  4. 当深度学习遇上量化交易——图与知识图谱篇

    ©PaperWeekly 原创 · 作者|桑运鑫 学校|上海交通大学硕士生 研究方向|图神经网络在金融领域的应用 本文主要回顾三篇将图和知识图谱应用到量化交易上的文章. NeurIPS 2019 论文 ...

  5. 用hook android 微信,【第一篇】【安卓微信】HOOK微信发消息,当HOOK遇上HOOK。

    前人栽树,后人吃桃. 准备入坑 安卓 xposed hook 微信(及时通信),好吧,第一步当然是论坛里面搜索啦,像掷骰子.计步器什么的都是小孩子过家家入门级别的,当然是要搞就搞(及时通信).微信 a ...

  6. 漫画算法python篇_有点意思!当漫画遇上算法后(儿童节福利)

    原标题:有点意思!当漫画遇上算法后(儿童节福利) 大家好,我是军哥 算法在大部分程序员眼里是枯燥的,晦涩难懂的,看到算法就感到头疼. 工作中也很少要去自己写个算法,直接调API完事,似乎没有学算法的必 ...

  7. Java可以hook微信吗,【第一篇】【安卓微信】HOOK微信发消息,当HOOK遇上HOOK。

    前人栽树,后人吃桃. 准备入坑 安卓 xposed hook 微信(及时通信),好吧,第一步当然是论坛里面搜索啦,像掷骰子.计步器什么的都是小孩子过家家入门级别的,当然是要搞就搞(及时通信).微信 a ...

  8. 当MES遇上PLC——SOAP篇(下)

    前段时间,有客户在网上看到了我们边缘计算模块产品,找到了我们,跟我们描述了他们目前遇到的问题: 某汽车零部件制造厂在进行智能工厂的升级改造,工单派发和生产顺序指定由MES系统完成,西门子1200 PL ...

  9. android微信二维码收款hook,【第一篇】【安卓微信】HOOK微信发消息,当HOOK遇上HOOK。...

    前人栽树,后人吃桃. 准备入坑 安卓 xposed hook 微信(及时通信),好吧,第一步当然是论坛里面搜索啦,像掷骰子.计步器什么的都是小孩子过家家入门级别的,当然是要搞就搞(及时通信).微信 a ...

最新文章

  1. 全国首档极客真人秀上线:1分钟打开智能保险箱,调包酒店外卖,36秒无接触盗取手机隐私...
  2. 纯真IP库的结构分析及一个查询类
  3. python特殊符号请求参数_python-参数化-(3)(excel中特殊标识字符替换数据)
  4. python获取文件夹下文件_Python 获取目录下的文件列表与内容
  5. Linux系统编程--1(进程和程序,CPU和MMU,PCB,进程状态)
  6. Jmeter测试并发https请求成功了
  7. python长沙_长沙python
  8. java.lang.object 下载_java.lang.Object
  9. ROS学习笔记5(理解ROS节点)
  10. AWT_addKeyListener键盘监听事件(Java)
  11. tcp 三次握手连接
  12. 我的希捷ST31000340NS,BIOS不认,磁头反复归位,BUSY模式的固件门硬盘修复成功
  13. 全国主要城市经纬度SQL脚本
  14. WAITED TOO LONG FOR A ROW CACHE ENQUEUE LOCK!的分析
  15. 说说jvm什么时候会回收垃圾
  16. RK3288开发板PopMetal上的GPIO驱动实例
  17. 基于c语言的哈希表电话簿
  18. 便签文档储存位置在哪?便签保存在哪个文件夹,怎么在文件管理找到
  19. 计算机领域的诺贝尔奖是图灵奖,计算机界的诺贝尔奖图灵奖.DOC
  20. hdu 动态规划题集

热门文章

  1. 量子计算机模型机,物理科学:量子计算机上实现了量子人工生命模型!
  2. leetcode6. Z 字形变换
  3. 不需要安装max或者xcode的object C开发环境
  4. 算法(3)--leetcode-explore-learn-数据结构-数组1
  5. java judgefilecode_VScode出现无法打开“X”: 找不到文件(file:///XXXX) 的解决办法
  6. C++primer 第 4 章 表达式 4.7条件运算符 4.8位运算符 4.9 sizeof运算符 4.10逗号运算符 4.11类型转换 4 . 1 2 运算符优先级表
  7. java蓝桥杯 试题-基础练习-数列排序
  8. 跨平台2D/3D游戏开发框架libGDX发布1.2.0更新
  9. AMD 5XXX 系列显卡的 peak bandwidth计算
  10. 高质高效软件开发组织能力模型