当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.mzph.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;不同的对象有不同的表现形式。​ 重载 编译时根据参数决定调用的方法…