• 欢迎访问V小白网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入V小白 暂无QQ群
  • 欢迎访问V小白网站,这是第二个滚动条

Terraform 开发指南

其他分类 admin 2019年6月28日 10:36 536 1 个评论

本文面向所有的对Terraform熟悉和感兴趣的朋友,如果您还不了解Terraform,快快戳这里

安装 Golang

安装 Terraform

安装 Terraform Provider

2、利用 glide 安装依赖(how to install glide Resource 开发是根据阿里云的OpenAPI在terraform provider中实现对阿里云产品和资源的插件。

每个Resource的实现不是根据阿里云帮助文档对OpenAPI的简单调用,要对产品的设计,功能以及使用有较深的理解,通常遵循如下设计原则:

每个resource只管理自身的功能,与其他resource引用或者关联交由关系性资源来完成,如ECS instance只管理实例自身的功能,对于挂哪个数据盘,分配哪个EIP交由attachment资源来完成

对于资源与资源之间的关系,需要单独定义一个逻辑resource,来完成资源与资源之间的关联,如磁盘挂载,eip的挂载,ess与ecs的关联等

参数要尽可能简洁,不要有冗余的参数,以RDS instance为例,对于参数zoneId,VpcId以及VSwitchId而言,只需要定义zoneId和VpcId就是冗余参数,因为在调用具体API之前,可以通过vswitchId来获取这两个参数,但某些特殊的场景除外,比如RDS支持Multiple zone,所以zonId也需要保留。如果可以设置Default,最好显示设置。

每个参数字段要具有清晰的语义,帮助用户更好的理解。对于一些公共的,统一的参数,如可用区,slb ID,最好跟其他资源保持一致:availability_zone, load_balancer_id.

有些参数需要做一些简单的校验,提前提醒客户使用正确的可选值。除此之外,对于某些参数,要做diff判断,以自动屏蔽某些不起作用的参数,如:对于ECS而言,选择PostPaid,意味着所有与PrePaid相关的参数 period,period_unit,renewal_status,auto_renew_period都将失效,具体表现为在执行terraform plan的时候,这些参数不会做diff比较。

每个Resource需要实现Create,Read,Update,Delete,Import五个功能:

调用产品创建API,实现对某个资源的创建,并将resource id 写入到state文件中

Create 的实现逻辑要尽可能简单,以成功创建资源为目标,太多的复杂逻辑会降低资源创建的成功率

Create之后通常调用Update方法来完成更多功能的实现

调用产品的Update或Modify API,实现对resource更多功能的支持以及对已有属性的修改

Update 之后,调用 Read 方法,实现对resource 所有属性的展示。

调用 Describe 或者 List API,实现对已有资源的查询和写入state

4、Delete

为了保证resource成功释放,需要加入retry策略来避免因资源依赖或者异步操作而引起的删除失败问题

5、Import

通常只需要方法申明,无需多余的实现逻辑,它会借助Read方法来完成对资源的查询和导入

执行terraform 命令,完成对资源的管理,主要命令包含以下几个:

实现对资源的预览。该命令会调用对应资源的Read 方法来获取模板中定义的资源。如果资源尚未创建,及当前目录下的state文件为空,直接展示即将创建的资源,否则展示要变更的资源

实现对资源的创建和更新。新资源调用Create,已有资源调用Update完成对资源的修改。

调用Destroy完成对资源的销毁。

调用Read方法完成对已有资源的导入,将已有资源加入到terraform的管理序列中来。但要注意,由于已有资源不一定是通过terraform创建的,所有导入成功后,记得运行terraform plan进行对比,手动补齐模板。

1、阿里云大部分的API都是异步调用的,而且资源与资源之间会因为一些依赖或者状态问题,导致请求调用失败,此时需要通过Retry来保证操作成功率

Data Source 开发

Data Source 开发是调用阿里云资源的查询API完成对特定资源的查询和展示。

每个Data Source的实现要根据API的字段和资源属性,为用户提供更好的查询体验,最好可以支持模糊查询。参数设计原则除了与Resource设计原则类似外,还应该提供一个参数output_file来将查询到的结果输出到文件中,供用户参考。

每个Data Source只需实现Read方法,该方法用来查询并过滤符合条件的所有的resource,然后将过滤的结果以列表的方式展示出来。在具体实现过程中,需要注意以下几点:

2、对于一些相互依赖性的资源,在展示他们自身功能属性的同时,会将依赖该资源的其他资源一并做一个简单的展示,以免去用户多次查询的麻烦,例如,vswitch的data source,除了展示自身属性外,还将该vswitch下的所有instance的id一并进行了查询。

测试用例的编写要遵循以下几个原则:

2、测试用例不是完成任务,是每一次功能变更的检验,测试用例也完善,模块的稳定性也高,因为功能的持续更新和迭代必须要保证原有功能的可用。

以ECS instance 举例,运行如下的测试命令,可以实现对目录alicloud下所有以TestAccAlicloudInstance为前缀的测试用例的运行: 如果想要精确到具体的测试用例,补全测试用例的名称即可。

1、文档中参数描述要清楚明白,每个参数功能,使用,是否是必填参数,是否支持修改,是否有限定值,是否有默认值,都要显示标明,而且要跟代码中定义的保持一致

3、通常,每个文档都要写一个简单的当前资源的使用实例,以供参考

5、如果当前资源支持import功能,文档最后要显示标注,详见其他resource 文档

7、resource 文档放在目录website/docs/r下,data source 文档放在目录website/docs/d下。每新增一个文档,要修改文件website/alicloud.erb 来完成侧边栏展示

样例

1、main.tf:资源的定义模板

3、outputs.tf:资源的输出值

完成了以上功能的实现和代码的编写后,接下来最关键的就是代码的提交,我们的代码最好优先提交到dev分支,具体的步骤分为以下几步:

为了避免出现代码的错乱,降低review的复杂度,Commit要细化,每一功能点或者一次的修改(不论改动有多小)对应一个Commit。为了防止功能和代码的相互冲突,每个功能点对应一个branch。

提交代码前一定要Rebase,具体操作步骤如下:

Rebase之前,首先需要配置你的Remote,假定你origin 指向了你的fork: 1、Rebasing Your Branch 1、Uploading Your Code 1、Submitting Your Pull Request

2、Updating Your Pull Request

之后,stash并利用rebase下载最新的代码,以避免不必要的冲突: 根据review意见,继续修改代码,之后再次进行代码commit,rebase和push即可。

本文作者:箫竹aron

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


V小白 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Terraform 开发指南
喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到
1个小伙伴在吐槽
  1. 很不错
    112.*.*.262019年7月18日 14:59 (1 年,7 月)回复