Module 让 Terraform 使用更简单

众所周知,Terraform 是一个开源的自动化的资源编排工具,支持多家云服务提供商。阿里云作为第三大云服务提供商,terraform-alicloud-provider 已经支持了超过 90 多个 Resource 和 Data Source,覆盖20多个服务和产品,吸引了越来越多的开发者加入到阿里云Terraform生态的建设中。

随着 Resource 和 DataSource 的不断增加和完善,业务架构的不断发展,Terraform 模板编写的成本和复杂度也在不断的增加。如何让Terraform 模板更加简单和重用,就是本文所要解决的问题。

本文将通过一个典型的负载均衡架构,向大家介绍如何使用 Module 简化 Terraform 的模板。

如图所示,这个架构中,包含 ECS 实例,SLB 实例,RDS 实例,OSS 等资源和服务,同时所有的 ECS,RDS 和部分 SLB 在一个 VPC 网络环境中。

 

将所有Resource放在一个模板中进行统一管理

面对这样的一个架构,模板可以有多种写法。通常的写法是将架构中涉及到的所有资源写到一个模板中,并通过参数和关系型 resource 将这些资源关联起来,如下所示:

// Images data source for image_id
data "alicloud_images" "default" {...
}
// Instance_types data source for instance_type
data "alicloud_instance_types" "default" {...
}
// Zones data source for availability_zone
data "alicloud_zones" "default" {...
}
// A new VPC
resource "alicloud_vpc" "vpc" {name = "default"...
}
// Two new VSwitches
resource "alicloud_vswitch" "vswitches" {count             = 2vpc_id            = "${alicloud_vpc.vpc.id}"...
}
// A new Security Group
resource "alicloud_security_group" "default" {vpc_id = "alicloud_vpc.vpc.id}"...
}
// Two Web Tier instances
resource "alicloud_instance" "web" {count           = 2image_id        = "data.alicloud_images.default.images.0.id"instance_type   = "data.alicloud_instance_types.default.instance_types.0.id"security_groups = ["${ alicloud_security_group.default.id }"]vswitch_id = "${element(alicloud_vswitch.vswitches.*.id, count.index)}"...
}
// Two Application Tier instances
resource "alicloud_instance" "app" {count           = 2image_id        = "${data.alicloud_images.default.images.0.id}"instance_type   = "${data.alicloud_instance_types.default.instance_types.0.id}"security_groups = ["${alicloud_security_group.default.id}"]vswitch_id = "${element(alicloud_vswitch.vswitches.*.id, count.index)}"...
}
// A SLB Instance for intranet
resource "alicloud_slb" "intranet" {internet = falsevswitch_id = "${alicloud_vswitch.vswitches.0.id}"...
}
// Attach Ecs instances
resource "alicloud_slb_attachment" "intranet" {load_balancer_id = "${alicloud_slb.intranet.id}"instance_ids     = ["${alicloud_instance.web.*.id}", "${alicloud_instance.app.*.id}"]
}
// SLB Instance Resource for internet
resource "alicloud_slb" "internet" {internet  = true...
}
// Attach Ecs instances
resource "alicloud_slb_attachment" "internet" {load_balancer_id = "${alicloud_slb.internet.id}"instance_ids     = ["${alicloud_instance.web.*.id}"]
}
// Two RDS Instance
resource "alicloud_db_instance" "default" {count            = 2vswitch_id = "${element(alicloud_vswitch.vswitches.*.id, count.index)}"...
}
// Add a account for each RDS instance
resource "alicloud_db_account" "default" {count       = 2instance_id = "${element(alicloud_db_instance.default.*.id, count.index)}"...
}
// Add a database for each RDS instance
resource "alicloud_db_database" "default" {count       = 2instance_id = "${element(alicloud_db_instance.default.*.id, count.index)}"...
}
// A OSS Bucket
resource "alicloud_oss_bucket" "default" {...
}

这样写的好处是,所有资源都在一个模板中管理,编写时可以很清楚了解资源之间的引用关系;但是,当资源不断增加时,扩展非常不灵活,资源间关系越复杂,模板越难以维护。

 

分类管理,目录作为单元化资源

从架构图和上文模板中不难看出,并不是所有的Resource都有直接关联关系,比如VPC只和VSwitch和SecurityGroup有关,与其他资源的创建无直接关联关系。因此,为了使整个架构的逻辑可以更加清楚的展示在模板中,我们可以考虑,对资源进行分类,将每一类资源用一个单独的目录进行管理,最后用一个模板来管理所有的目录,进而完成对所有资源及资源关系的串联,如下所示:

├── main.tf
├── variables.tf
├── outputs.tf
├── modules/
│   ├── vpc/
│   │   ├── variables.tf
│   │   ├── main.tf
│   │   ├── outputs.tf
│   ├── slb/
│   │   ├── variables.tf
│   │   ├── main.tf
│   │   ├── outputs.tf
│   ├── ecs/
│   ├── rds/
│   ├── oss/

将该架构中的资源分为网络(VPC),负载均衡(SLB),计算(ECS),数据库(RDS)和存储(OSS)这几类,然后将上文模板中的资源分别在对应的目录中予以实现。

接下来,用统一的模版main.tf将这些目录关联起来,如下所示:

// VPC module
module "vpc" {source = "./modules/vpc"name = "new-netwtok"...
}
// Web Tier module
module "web" {source = "./modules/ecs"instance_count = 2vswitch_ids = "${module.vpc.this_vswitch_ids}"...
}
// Web App module
module "app" {source = "./modules/ecs"instance_count = 2vswitch_ids = "${module.vpc.this_vswitch_ids}"...
}
// SLB module(intranet)
module "slb" {source = "./modules/slb"name = "slb-internal"vswitch_id = "${module.vpc.this_vswitch_ids.0.id}"instances = "${concat(module.web.instance_ids, module.app.instance_ids,)}"...
}
// SLB module(internet)
module "slb" {source = "./modules/slb"name = "slb-external"internet = trueinstances = "${module.web.instance_ids}"...
}
// RDS module
module "oss" {source = "./modules/rds"name = "new-rds"...
}
// OSS module
module "oss" {source = "./modules/oss"name = "new-bucket"...
}

可以看出,main.tf中资源的结构更加清楚,更加接近于架构图。

同时,大家已经注意到了,main.tf引入了一个 module,通过module将资源目录串联起来。

 

什么是Module

Module 是 Terraform 为了管理单元化资源而设计的,是子节点,子资源,子架构模板的整合和抽象。正如本文架构中提到的,在实际复杂的技术架构中,涉及到的资源多种多样,资源与资源之间的关系错综复杂,资源模版的编写,扩展,维护等多个问题的成本都会不断增加。将多种可以复用的资源定义为一个module,通过对 module 的管理简化模板的架构,降低模板管理的复杂度,这就是module的作用。

除此之外,对开发者和用户而言,只需关心 module 的 input 参数即可,无需关心module中资源的定义,参数,语法等细节问题,抽出更多的时间和精力投入到架构设计和资源关系整合上。

 

开源Module,使其更完善,更分享,更便捷

上文中,虽然已经实现了module,但是这个module只能在自己本地机器上实现,无法实现与他人的实时分享,无法实现团队内部的及时共享。

Terraform 提供了 Module 的注册地址,将自己的module上传到Github,并注册为一个Terraform Module后,即可将远端的Module应用到我们自己的模板中。

利用开源 module,我们可对上文中的模板进行完善:

// VPC module
module "vpc" {source = "alibaba/vpc/alicloud"...
}
// Web Tier module
module "web" {source = "alibaba/ecs-instance/alicloud"...
}
// Web App module
module "app" {source = "alibaba/ecs-instance/alicloud"...
}
// SLB module(intranet)
module "slb" {source = "alibaba/slb/alicloud"...
}
// SLB module(internet)
module "slb" {source = "alibaba/slb/alicloud"...
}
// OSS module
module "rds" {source = "terraform-alicloud-modules/rds/alicloud"...
}
// OSS module
module "oss" {source = "terraform-alicloud-modules/oss/alicloud"...
}

Module 让资源模板架构更清楚,模板管理更简单;开源 Module 让资源模板更便捷,更分享。除此之外,开源 Module 可实现对模板的版本控制,基于不同的版本,实现不同架构不断升级的控制和完善。

 

欢迎加入 Terraform AliCloud Modules

目前我们已经在在 Terraform Module 上发布了一些常用的 Module,但这些 Module 远远无法满足大家多种多样的技术架构和复杂的应用场景,非常欢迎大家可以将自己的模板Module注册到官方 Module 上,借助社区的力量,不断完善自己模板,丰富我们的社区。


原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/521022.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android java 实体类 object变量 保存_Java中的实体类--Serializable接口、transient 关键字...

在java中,实体类是一个非常重要的概念,我们可以在实体类中封装对象、设置其属性和方法等。关于实体类,也经常涉及到适配器模式、装饰者模式等设计模式。那么在实际代码开发中,关于实体类的注意事项有哪些呢?1. Seriali…

杭州云栖大会阿里云放大招,8K远程医疗会诊引关注

大家每天都会照镜子,镜子里的一切都清清楚楚,足可乱真,可是你想过有一天看视频直播就像照镜子么? 这不,在云栖大会的C馆里,8K超高清直播体验馆前异常火爆,在这里,很多参会者都围着有…

「2019 嵌入式智能国际大会」 399 元超值学生票来啦,帮你豪省 2600 元!

2019 嵌入式智能国际大会即将来袭!购票官网:https://dwz.cn/z1jHouwE物联网是继计算机、互联网和移动通信之后的又一次信息产业的革命性发展,在互联网和移动互联网高速发展的时代,几乎所有行业都有数据联网的需求。无论是国外的科…

【杭州云栖】飞天技术汇大视频专场:全民视频时代下的创新技术之路

2018杭州•云栖大会在9月19日如期召开,在四天时间内将举行2场主论坛、170多场前沿峰会。在9月19日上午的飞天技术汇-大视频专场中,多位阿里云技术专家、合作伙伴、客户为现场观众分享了各自领域的多媒体研发成果,进行多款重磅产品的发布&…

Centos7 使用Docker 安装Oracle精简版本

文章目录一、Docker1. 在线安装Docker2. 启动docker3. 使用docker拉取Oracle镜像4. 看拉取的oracle镜像5. 创建守护式oracle容器并启动容器6. 查看正在运行的容器二、oracle容器配置篇2.1. 进入oracle容器的控制台2.2. 切换root用户配置环境变量2.3. 设置系统及用户密码三、登录…

sip协议详解_SIP协议详解-INVITE消息发送过程

SIP协议是VoIP中最重要的信令控制协议。SIP中第一件事情就是主叫发送INVITE给被叫,被叫响铃。本文从多角度详细描述INVITE消息发送的全过程。一、阅读RFC权威描述关于INVITE消息发送,先查看RFC 3261中权威描述:INVITE client transaction: ht…

【杭州云栖】飞天技术汇CDN与边缘计算专场:让内容离消费者更进一步

【杭州云栖】飞天技术汇CDN与边缘计算专场:让内容离消费者更进一步 在5G移动通信、IoT万物智联时代即将到来的大背景下,越来越多的应用和数据来自边缘位置,呈现低延时、高带宽、大连接、本地化的业务特征,那么如何协同阿里云全球…

迈克尔·戴尔再次到访2019戴尔科技峰会,为“戴尔中国4.0+战略”加个码……

10月25日,以“拓界成真”为主题的2019戴尔科技峰会在北京国家会议中心隆重举行。戴尔科技集团董事长兼首席执行官迈克尔戴尔出席峰会,发表主题演讲,见证集团与多个地方政府、高校、企业签署战略合作协议,并与教育部领导一起&#…

【杭州云栖】边缘计算ENS:拓展云的边界

在9月19日下午的杭州云栖大会飞天技术汇-CDN与边缘计算专场中,阿里云边缘计算团队的高级技术专家王广芳,从边缘计算的定义、场景的需求和挑战、ENS产品的价值及能力,以及典型的应用场景和案例等几个方面,详细解读了阿里云对于边缘…

Centos7 解决Docker拉取镜像慢的问题

配置加速Docker镜像源 vi /etc/docker/daemon.json在配置文件中加入 {"registry-mirrors": ["https://xxx.mirror.aliyuncs.com"] }[rootkm docker]# systemctl daemon-reload [rootkm docker]# systemctl restart dockerhttps://cr.console.aliyun.com…

你的食物变质没?用AI算法来检测一下吧

最近一条幼儿园采用过期食物的新闻引起了社会的强烈关注,对于食品安全而言,国家一直是严格要求的,尤其是对于婴幼儿食品安全的标准,部分已经超越了国际上的标准。但可能是由于无法严格地执行到每一个地方且检测周期较长&#xff0…

CAS项目部署和基础操作

文章目录一、部署cas1. 复制cas.war到webapps2. 登录页面二、CAS服务端配置2.1. 添加用户2.2. 端口修改2.3. 去除https认证一、部署cas 1. 复制cas.war到webapps 把cas.war放到tomcat的webapps下面启动Tomcat即可 2. 登录页面 二、CAS服务端配置 2.1. 添加用户 找到指定文…

基于POLARDB数据库的压测实践

POLARDB架构简介 PolarDB是阿里云ApsaraDB数据库团队研发的基于云计算架构的下一代关系型数据库(暂时仅支持MySQL,PostgreSQL正在紧锣密鼓的开发中),其最大的特色是计算节点(主要做SQL解析以及存储引擎计算的服务器)与存储节点(主要做数据块存储&#x…

戴尔科技:以技术突破创新边界!

2019戴尔科技峰会今天在北京隆重举行,戴尔科技集团与数千位全国企业级精英、合作伙伴、业内专家、媒体及分析师代表等齐聚一堂,分享了在5G、云计算、存储、数据保护、服务器等领域的最新技术产品、最佳实践经验及最新发展趋势。此次峰会还完整地展示了戴…

让你久等了!《码出高效:Java 开发手册》正式发布

可爱的Java开发者们,让你们久等了! 9月22日杭州云栖大会,众所期待的新书《码出高效:Java 开发手册》正式发布,并宣布将所有图书收益捐赠于公益项目。 此书从立意到付梓,历时超过两年,期间推翻数…

python中is和 的区别_Python中is和==的区别

"""is和 的区别"""a abcb abcprint("都是字符串-a is b--", a is b)print("都是字符串-a b--", a b)c 11d 11print("都是数字-c is d--", c is d)print("都是数字-c d--", c d)e [0, 1, 2]f …

(Docker实战) 第1篇:Centos7 环境准备和安装Docker-ce

文章目录一 、安装docker1. 卸载以前安装的docker2. 安装必要的系统工具4. 更新yum缓存5. 安装docker6. 更改docker仓库为国内仓库7. 重启docker8. 安装docker-compose一 、安装docker docker优点 快速上手新技术,把精力放在业务上而非安装和配置服务器快速搭建开发…

初入数据科学领域,你需要有七个这样的思维

假设你刚刚被一家小型软件公司聘为数据科学家。你感到欣喜若狂!你的辛勤工作和坚持不懈终于得到了回报。是时候将你的统计数据和机器学习知识付诸实践了。那么恭喜你终于加入了数据革命。 第1天到来,每个人都很高兴见到这位“数据科学家”。该公司以前从…

输入文字自动生成图片_原来Word还可以自动生成图片和图表目录!

小李接到了一个任务,将技术文档中的示意图目录做出来,让客户能根据需求快速找到操作示意图,可是这份文档有三百多张图片,不过,这可难不倒小李。说到Word目录,大多数人都知道,可以为文档的标题设…

反转!物联网火爆,开发者却很难入门?

在 2019 北京网络安全大会上,工信部负责人表示,我国面向 5G 和车联网将建设网安防护体系,提升监测预警和应急响应能力。其中物联网设备已成为网安防护新重点。为什么工信部会这么重视物联网?物联网开发者的现状又是如何呢&#xf…