Azure资源模板化部署,伦家不懒都不好意思了


如果老板让你在云平台上部署一套系统,你准备怎么做?

嗯,估计得根据具体需求开通或创建一大堆东西:虚拟机、存储、数据库、虚拟网络……别急还没完,接着还要对这些东西的规模、配置等各方面调整和优化。一系列环节折腾下来,时间精力都消耗殆尽……不是说上云可以更省事,更快捷么?

童鞋,这是因为你的操作姿势不对!

你想啊,就跟 Office 软件一样,无论你要写文档还是做 PPT,如果能事先挑选一个模板,那么必要的设计和排版都有了,只要把自己的内容填进去,美观专业的文档就这么轻松搞定。

那么云部署呢?如果也有类似的模板,按需选择,调整必要参数,原本可能需要两三天才能搞定的系统,就这么分分钟搞定 so easy~

小编在这里向你隆重介绍 Azure 全新推出的部署模式:Azure Resource Manager(ARM,Azure 资源管理器)。有了它,Azure 部署从此变得轻而易举。

康威资深工程师,SDN 和大规模数据中心网络专家

负责基于 Azure 的云计算方案架构咨询与设计

 

通过本文内容介绍 ARM 的概念、模板的建立和使用方法

 

最近 Azure 发布了 ARM 模式(Azure Resource Manager),其中包含了对于 Resource Manager Template 的支持。什么是 Resource Template?我们先来看一下 Azure 在 ARM 模式下的逻辑架构:

对于首次接触公有云的小伙伴,通常会习惯通过 Azure Portal 门户来完成相关服务及资源的配置交付(如创建虚拟云主机,虚拟网络,MySQL 数据库服务等),我们可以把以上创建的服务及资源抽象为一套配置模板,用于描述所创建的服务及资源。由上图可见,ASM 模式下用户与 Azure 云平台交互界面的接口包括 Portal,CLI,Visual Studio 等,通过以上接口用户给出的服务及资源的描述,Azure 平台通过资源描述中间件(Resource Provider Contract)将客户的描述转译为平台资源描述并执行服务及资源创建。Azure Portal 通过交互式的 GUI 方式可以友好方便的帮助用户上手,但是在批量及复杂服务及资源创建时就有些捉襟见肘。

那么在批量及复杂服务及资源创建时有没有好的解决办法呢?Infrastructure As Code 基础架构即代码),脚本部署是可行的方案之一,类似所有自动化事务的执行,我们可以将复杂的服务及资源逐一创建并通过脚本实现自动化执行。但是本文在这里不推荐大家使用上述方法,原因有二:

  1. 服务及资源的抽象不够,我们在定义服务及资源的时候希望通过更高级的抽象给出简单的接口,以便更便捷的定义复杂的服务及资源;

  2. 传统的脚本语言的执行以串行顺序方式执行,对于复杂的服务及资源定义如果希望实现并行及依赖关系定义是比较复杂的。

这里给大家介绍的 Azure Resource Template 可以很好的解决上述问题,帮助大家简单快捷的实现复杂的服务及资源交付,它通过 JSON 语言高级抽象描述资源定义大大降低了用户的复杂度,同时将并行任务的拆解交给 Azure 平台资源描述中间件来实现高效,实现 Infrastructure as Code。为方便大家理解,本文后面的内容按照如下顺序:

  • 工具方法介绍

  • 举例快速开始

  • 总结及课题延展

 

工具方法介绍

工欲善其事必先利其器,得力顺手的工具可以让我们事半功倍。Infrastructure as Code,和其他编程语言一样,一个好的 IDE 可以为我们保驾护航。微软为 Azure Resource Template 提供了 Visual Studio + Azure SDK 的工具组合,使用户可以在 VS 环境下实现开发。主要功能如下:

1、格式检查。帮助用户检查 JSON 格式;

2、基础模板。微软已经将 Azure 服务及资源的标准模板定义好,方便客户调用。另外 GitHub 上还有海量的模板示例作为参考示例,VS 已经跟 Github 做了打通,在创建新项目的时候可以直接引用 Github 的模板,并且模板可以直接通过 VS 调用 Powershell 进行执行;

3、自动补全及函数库查询。在 VS 中可以帮助用户做索引、函数的补全。

VS 的安装与设置这里不做赘述,大家可以参阅这篇文章配置安装。

中国区 Azure 的连接需要修改 VS 的配置文件,可以参考此链接

举例快速开始

开始之前我们先来设定一个目标场景,在 Azure Portal 上目前我们无法创建多网卡的虚拟机,我们的目标就是通过 Template 部署来实现多网卡虚拟机的交付,同时为了实现模板的复用,希望用户可以自定义操作系统类型,VM 的规格,以及网卡的数量。

首先我们进行基本模板框架搭建

到此我们已经将一个虚拟机创建的基本模板框架搭建完毕,后面我们都基于这个框架来进行修改来达成我们之前预设的目标,通过 Template 部署来实现多网卡虚拟机的交付,同时为了实现模板的复用,希望用户可以自定义操作系统类型,VM 的规格,以及网卡的数量。下面我们先给出最终的实现模板,然后展开介绍,后面的介绍主要侧重一些特殊语法的说明,以便大家可以自行编排自己的模板。

对于操作系统类型的定义可通过定义参数完成,通过 allowed Values 的定义可在最终使用模板时实现在交互页面进行参数选择以避免手工输入带来的错误。同理操作系统版本,VM 规格以及网卡数量均可采用类似方法定义。

“LinuxPublisher”: {

“type”: “string”,

“allowedValues”:[ “Ubuntu”, “CentOS” ]

},

变量套用式引用,在 Resource 模板定义中会通过调用参数或变量的方式来实现模板的通用。在此用例中目标创建的虚拟机的操作系统由于有客户变量来进行选定,所以在虚拟机资源描述部分里面设计的操作系统的相关描述都需要随之而变。因为 Ubuntu 和 CentOS 两个选项对应选项背后,相应的操作系统发行商,操作系统版本等参数都要随之改变,为了实现资源描述部分的通用性,避免反复写两次资源描述来覆盖不同操作系统场景,我们采用变量套用式引用。通过定义 linuxUbuntu 和 linuxCentOS 变量来分别描述不同操作系统下相关变量参数,同时定义 linuxtype 变量,其中 linuxtype 的值等于 linux+ 用户输入的 LinuxPublisher 参数选项,客户选定 LinuPublisher 选项后 linuxtype 的最终值将等于 linuxUbuntu 或 linuxCentOS,在后面的虚拟机资源描述的操作系统部分只需要调用 linuxtype 变量对象及可实现对客户选定操作系统的变量值抽取,以“publisher”: “[variables(‘linuxtype’).imagePublisher]”为例,通过对 linuxtype.imagePublisher 的抽取实现相应操作系统发布商信息的提取,而且整个资源描述只需要编写一次。

循环描述 copy 可以实现多资源创建,在此例子中客户可以自定义创建网卡的数量并且每个网卡关联不同的子网,所以无法预先通过静态反复定义的方式将虚拟网络子网资源描述写死,通过 copy 描述配以客户输入的网卡数量 NicNumber 变量作为循环次数 count,实现动态创建多个资源的目标。

使用条件语句实现 if or not 逻辑,在上述例子中虚拟机在多网卡场景下只有主网卡绑定公网 IP,在网卡资源描述中,需要公网地址的描述和不需要公网地址的描述是不同的,所以这里的做法是先静态描述一块带公网地址的网卡资源(因为客户至少创建 1 块网卡),在将剩余的网卡资源描述引入条件语句从而实现当客户输入大于 1 块网卡时(“condition”: “[greater(variables(‘linuxtype’).NicNumber,1)]”),剩余网卡都按照无公网地址方式进行创建。

动态依赖关系的定义,通常在资源描述中通过 dependsOn 来表示依赖关系,如虚拟机资源需要依赖存储账户及网卡资源。但本例中网卡的数量是变量无法预知,所以在描述依赖关系的时候无法静态将所依赖的资源 ID 全部放上。这里采用调用 reference 函数实现隐性依赖关系的描述,在虚拟机资源的 dependsOn 描述中移除网卡的依赖描述,在虚拟机描述中的 networkProfile 部分中定义 id 时,通过 reference 函数抓取 ID,reference 函数会在模板执行过程中抓取 runtime 的 id 值进行返回,只有当相应资源创建完毕时 reference 才会有返回值,从而实现资源依赖关系的隐性描述。

“networkProfile”: {

“copy”: [

{

“name”: “networkInterfaces”,

“count”: “[variables(‘linuxtype’).NicNumber]”,

“input”: {

“id”: “[replace(reference(concat(variables(‘nicName’),copyIndex(‘networkInterfaces’))).ipConfigurations[0].id,’/ipConfigurations/ipconfig1′,”)]”,

“properties”: {

“primary”: “[less(copyIndex(‘networkInterfaces’),1)]”

至此通过本例中几个基本目标给大家介绍了在模板中常用的一些高级功能,这些功能有助于大家描述定义复杂的服务和资源,实现 Infrastructure as Code 的目标。最后模板一切就绪可以来部署了,Azure 支持通过在 Portal,PowerShell,CLI 中部署模板,其中 Powershell 可以直接在 VS 环境中调用,各种部署方法大家可以参阅这里

本文将介绍通过 Portal 的方式进行部署,以便帮助大家理解在模板中定义的参数 Parameter 部分。

总结及课题延展

通过上述例子大家对 Azure Resource Template 应该已经有了一定了解。大家可以着手开始自己的 Infrastructure as Code 的旅程,下面这些资源应该会帮到大家。

  1. Azure Resource Template 使用指南,基本使用方法帮助快速上手

  2. Azure Resource Template 最佳实践,介绍 Template 定义的一些常用方法提高效率

  3. Azure Resource Template 高级函数使用指南,介绍 Template 内置函数帮助实现复杂逻辑

  4. Azure Resource Template 服务及资源原始模板参考,不知道每种服务及资源额如何定义描述时可作为字典参考

  5. Azure Resource Template Github,你想做的内容别人可能已经做了七八成,弯道超车搞起

  6. Azure Resource Portal 查阅现有 Resource 的模板作为参考

最后我们再来谈一谈延伸的话题,不少用户也许用过其他云平台的类似的模板工具,那么在多云场景下岂不是需要维护两套语言逻辑,这里简单提一下 Terraform,它是一个跨平台的模板语言工具,它可以适配如 AWS,Azure,Alicloud 等云厂商提供的 template 接口,不仅如此,它还可以适配操作系统配置,应用配置等终端对象,其通过标准的模板描述语言抽象从而实现云平台无关以及更复杂的 Infrastructure as Code,有兴趣的话可以自行科学上网查询更多相关资料。

现在准备好手头的工具开始自己的 Infrastructure as Code 之旅吧。 

=

在这种方式的帮助下,我们可以利用他人创建的模板快速搭建所需环境,当然也可以根据自己的具体需求创建模板,在自己公司范围内使用。当然,还可以将自己的模板分享出来,帮助更多人受益。

你要不要试试看呐!

推荐阅读

天王盖地虎宝塔镇河妖,再给三篇 ARM 的相关文章要不要?要!

《Azure Resource Manager 概述》

《ARM 与经典部署模式的差异》

《创建自己的第一个 ARM 模板》

 

对了,瞧小编这记性,差点就忘了一件大事被老板扣工资了,下面是大事。

大事:【Azure文档】菜单上线咯!

小伙伴们可以通过云科技公众号主页底部菜单【了解云】中的【Azure文档】菜单,一键获取你想得到想不到的 Azure 技术文档与示例等等无限量资源

好了,就说这么多,更多的惊喜等你来发现!

立即访问http://market.azure.cn

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号