Terraform 开发指南

摘要: 本文主要向大家展示如何为阿里云 Terraform Provider 贡献自己的力量,帮助开发者和志同道合的朋友尽快加入到开源生态的建设中来。 本文面向所有的对Terraform熟悉和感兴趣的朋友,如果您还不了解Terraform,快快戳这里。

本文主要向大家展示如何为阿里云 Terraform Provider 贡献自己的力量,帮助开发者和志同道合的朋友尽快加入到开源生态的建设中来。

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

本文会从环境搭建和开发规范两个方面向大家展示如何开放 terraform provider。

环境搭建

安装 Golang

本地安装go >1.10.0 详见:https://golang.org/dl/

安装 Terraform

本地安装 Terraform > 0.11, 详见: https://www.terraform.io/intro/getting-started/install.html

安装 Terraform Provider

  1. fork 并下载 repo: https://github.com/alibaba/terraform-provider

    cd $GOPATH    
    mkdir -p src/github.com/alibaba    
    cd $GOPATH/src/github.com/alibaba    
    git clone git clone git@github.com:<your-git-id>/terraform-provider.git
  2. 利用 glide 安装依赖(how to install glide)

    # switch to project
    cd $GOPATH/src/github.com/alibaba/terraform-provider# get all dependencies and install modules
    glide up
  3. 设置环境变量,省去每次测试时输入AK的要求

    # set the creds
    export ALICLOUD_ACCESS_KEY="***"
    export ALICLOUD_SECRET_KEY="***"

Resource 开发

Resource 开发是根据阿里云的OpenAPI在terraform provider中实现对阿里云产品和资源的插件。

规划和设计

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

  1. 自管理 
    每个resource只管理自身的功能,与其他resource引用或者关联交由关系性资源来完成,如ECS instance只管理实例自身的功能,对于挂哪个数据盘,分配哪个EIP交由attachment资源来完成
  2. 松耦合 
    对于资源与资源之间的关系,需要单独定义一个逻辑resource,来完成资源与资源之间的关联,如磁盘挂载,eip的挂载,ess与ecs的关联等
  3. 参数简洁 
    参数要尽可能简洁,不要有冗余的参数,以RDS instance为例,对于参数zoneId,VpcId以及VSwitchId而言,只需要定义zoneId和VpcId就是冗余参数,因为在调用具体API之前,可以通过vswitchId来获取这两个参数,但某些特殊的场景除外,比如RDS支持Multiple zone,所以zonId也需要保留。如果可以设置Default,最好显示设置。
  4. 语义清晰 
    每个参数字段要具有清晰的语义,帮助用户更好的理解。对于一些公共的,统一的参数,如可用区,slb ID,最好跟其他资源保持一致:availability_zoneload_balancer_id.
  5. 参数校验
    有些参数需要做一些简单的校验,提前提醒客户使用正确的可选值。除此之外,对于某些参数,要做diff判断,以自动屏蔽某些不起作用的参数,如:对于ECS而言,选择PostPaid,意味着所有与PrePaid相关的参数 periodperiod_unitrenewal_statusauto_renew_period都将失效,具体表现为在执行terraform plan的时候,这些参数不会做diff比较。

基本实现

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

  • Create

    • 调用产品创建API,实现对某个资源的创建,并将resource id 写入到state文件中
    • 如果资源没有ID,比如安全组规则,那么resource要自己按照一定的规则自行实现一个ID,对terraform而言,该ID是resource的唯一标识,后续对resource的所有操作都需要依赖于该ID进行
    • Create 的实现逻辑要尽可能简单,以成功创建资源为目标,太多的复杂逻辑会降低资源创建的成功率
    • 复杂的功能实现可交由 Update 来完成
    • Create之后通常调用Update方法来完成更多功能的实现
  • Update

    • 调用产品的Update或Modify API,实现对resource更多功能的支持以及对已有属性的修改
    • Update之前要打开Partial d.Partial(true),并在每步修改后进行时时更新,如d.SetPartial("bandwidth"),以保证后面的每一步成功的更改都能被及时的写入到state 文件中。
    • Update 之后,调用 Read 方法,实现对resource 所有属性的展示。
  • Read

    • 调用 Describe 或者 List API,实现对已有资源的查询和写入state
    • 如果找不到指定的资源,要将resource ID标记为“”,以告诉terraform,当前这个资源已经不存在了。
  • Delete

    • 调用Delete API实现对指定资源的删除和释放
    • 为了保证resource成功释放,需要加入retry策略来避免因资源依赖或者异步操作而引起的删除失败问题
    • 通常,resource释放后要再次调用查询API来完成删除操作的验证
  • Import

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

基本工作原理

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

  1. terraform plan
    实现对资源的预览。该命令会调用对应资源的Read 方法来获取模板中定义的资源。如果资源尚未创建,及当前目录下的state文件为空,直接展示即将创建的资源,否则展示要变更的资源
  2. terrform apply
    实现对资源的创建和更新。新资源调用Create,已有资源调用Update完成对资源的修改。

  3. terraform destroy
    调用Destroy完成对资源的销毁。

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

注意事项

  1. 阿里云大部分的API都是异步调用的,而且资源与资源之间会因为一些依赖或者状态问题,导致请求调用失败,此时需要通过Retry来保证操作成功率
  2. Terraform 的设计理念是对资源终态的管理,通常不涉及对资源状态的管理,所以ECS 创建后要将其置为 Running状态,其他资源也要在达到对应状态后标记创建完成。通常借助 Wait 来保证。

Data Source 开发

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

规划和设计

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

基本实现

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

  1. 每一个data source仍然需要一个唯一的ID来表示当前这个data source。 通常是取所有结果的hash值。
  2. 对于一些相互依赖性的资源,在展示他们自身功能属性的同时,会将依赖该资源的其他资源一并做一个简单的展示,以免去用户多次查询的麻烦,例如,vswitch的data source,除了展示自身属性外,还将该vswitch下的所有instance的id一并进行了查询。

测试

在完成模块开发后,要对每个resource和data source的功能进行测试,测试的方法是编写对应的测试用例。

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

  1. 测试用例要尽可能覆盖所有的应用场景,尤其对一些主要功能的修改,要使用单独的case
  2. 测试用例不是完成任务,是每一次功能变更的检验,测试用例也完善,模块的稳定性也高,因为功能的持续更新和迭代必须要保证原有功能的可用。
  3. 如何运行测试用例 
    以ECS instance 举例,运行如下的测试命令,可以实现对目录alicloud下所有以TestAccAlicloudInstance为前缀的测试用例的运行:

      TF_ACC=1 go test ./alicloud -v -run=TestAccAlicloudInstance -timeout=300m

其中,timeout 表示这个测试用例运行的超时时长。
如果想要精确到具体的测试用例,补全测试用例的名称即可。

文档

文档是用户使用provider的基础,文档的编写非常重要,需遵循如下几个原则:

  1. 文档中参数描述要清楚明白,每个参数功能,使用,是否是必填参数,是否支持修改,是否有限定值,是否有默认值,都要显示标明,而且要跟代码中定义的保持一致
  2. 文档使用纯英文编写,但不是对帮助文档的直接翻译,要根据具体情况和场景做最友好的阅读体验。如果对英文不自信,可参考帮助文档的国际版 https://www.alibabacloud.com/help
  3. 通常,每个文档都要写一个简单的当前资源的使用实例,以供参考
  4. 文档的输出参数也要进行说明,而且要跟代码中定义的保持一致
  5. 如果当前资源支持import功能,文档最后要显示标注,详见其他resource 文档
  6. 如果当前资源有一些暂时不支持的功能,或者使用上有需要提前注意的地方,要在文档中显示添加Note
  7. resource 文档放在目录website/docs/r下,data source 文档放在目录website/docs/d下。每新增一个文档,要修改文件website/alicloud.erb 来完成侧边栏展示

样例

为了更好的帮助用户使用新增的resource,在完成以上工作后,需要为当前的这个resource或者当前这类resource增加一个example,来指导用户编写对应的模板。该样例是一个真实的可运行的模板,通常包含以下四部分:

  1. main.tf:资源的定义模板
  2. variables.tf:模板所依赖的参数定义和参数值
  3. outputs.tf:资源的输出值
  4. README.md:模板的简单介绍和使用说明

代码提交

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

Commit

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

Rebase

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

  1. Configuring Your Remotes
    Rebase之前,首先需要配置你的Remote,假定你origin 指向了你的fork:
    $ git remote -vorigin  git@github.com:YOUR_GITHUB_USERNAME/terraform-provider.git (fetch)origin  git@github.com:YOUR_GITHUB_USERNAME/terraform-provider.git (push)

接着,将主仓库配置为你的remote,如起名为“alicloud”

    $ git remote add alicloud https://github.com/alibaba/terraform-provider.git$ git remote -vorigin  git@github.com:YOUR_GITHUB_USERNAME/terraform-provider.git (fetch)origin  git@github.com:YOUR_GITHUB_USERNAME/terraform-provider.git (push)alicloud  https://github.com/alibaba/terraform-provider.git (fetch)alicloud  https://github.com/alibaba/terraform-provider.git (push)

检查当前仓库的状态

    $ git statusOn branch YOUR_BRANCHYour branch is up-to-date with 'origin/YOUR_BRANCH'.nothing to commit, working tree clean
  1. Rebasing Your Branch
    完成commit和remote配置后,即可进行rebase操作:
    $ git pull --rebase alicloud dev    

如果有冲突,解决冲突后继续 rebase,直到所有冲突都解决,之后再次检查状态:

    $ git statusOn branch YOUR_BRANCHYour branch and 'origin/YOUR_BRANCH' have diverged,and have 4 and 1 different commits each, respectively.(use "git pull" to merge the remote branch into yours)nothing to commit, working tree clean
  1. Uploading Your Code
    完成rebase操作后,上传代码:
    $ git push origin <your branch>

如遇到提交失败,可使用-f 或者--force 来强制提交

  1. Submitting Your Pull Request
    完成代码上传后,在Github控制台将你的代码提交到主仓库的dev分支,并对PR做一个简单的描述和介绍。

  2. Updating Your Pull Request
    如果代码有问题,在Review结束后,需要对已提交的代码做修改,首先将上次提交进行回退:
    $ git reset HEAD^1Unstaged changes after reset:xxxxx

之后,stash并利用rebase下载最新的代码,以避免不必要的冲突:

    $ git stashSaved working directory and index state WIP on YOUR_BRANH: xxxxxHEAD is now at xxxxx# rebase 下载最新代码$ git pull --rebase alicloud dev

rebase顺利执行之后,恢复stash代码:

    $ git stash popOn branch YOUR_BRANCHChanges not staged for commit:xxxxx

根据review意见,继续修改代码,之后再次进行代码commit,rebase和push即可。

写在最后

本文主要讲述了如何为阿里云的Terraform-Provider贡献代码的一些流程和注意事项,欢迎大家积极加入到Terraform Provider的建设中来,谢谢大家。

原文链接

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

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

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

相关文章

大学生创新创业大赛案例_七大学生创新创业大赛样本示例

1 / 15附件七&#xff1a;大学生创新创业大赛样本示例本案例为第四届“挑战杯”创业计划大赛金奖作品&#xff0c;为避免篇幅过长&#xff0c;编者对部分内容作了删减&#xff0c;仅作参考。目录、执行总结、项目背景、市场机会、公司战略、市场营销、生产管理、投资分析、财务…

(需求实战_进阶_04)SSM集成RabbitMQ 通配符模式 关键代码讲解、开发、测试

背景&#xff1a; 为了减轻服务器的压力&#xff0c;现在原有项目的基础上集成消息队列来异步处理消息! 此项目是企业真实需求&#xff0c;项目的代码属于线上生产代码&#xff0c;直接用于生产即可&#xff01; 此项目采用MQ发送消息模式为:通配符模式&#xff0c;如果对Rabbi…

halo多人正在连接服务器,在线人数过低 《光晕2》PC版多人服务器下月关闭

这也许是一个让粉丝略伤感的消息&#xff0c;《光晕2(Halo2)》PC多人游戏服务器将在下个月永久关闭。343 Industries注意到服务器的峰值在线人数一直仅有20人&#xff0c;因此做出了关闭服务器的决定。343 Industries在Halo Waypoint中说道&#xff1a;“我们很遗憾地宣布&…

纯Python实现鸢尾属植物数据集神经网络模型

摘要&#xff1a; 本文以Python代码完成整个鸾尾花图像分类任务&#xff0c;没有调用任何的数据包&#xff0c;适合新手阅读理解&#xff0c;并动手实践体验下机器学习方法的大致流程。 尝试使用过各大公司推出的植物识别APP吗&#xff1f;比如微软识花、花伴侣等这些APP。当你…

【明人不说暗话】我就只讲进程与线程

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 阮一峰责编 | 阿秃进程&#xff08;process&#xff09;和线程&#xff08;thread&#xff09;是操作系统的基本概念&#xff0c;但是它们比较抽象&#xff0c;不容易掌握。最近&#xff0c;我读到一篇材料&#xff0c;发现有…

python获取路径下所有文件_Python获取路径下所有文件名

交易系统使用storm&comma;在消息高可靠情况下&#xff0c;如何避免消息重复 概要:在使用storm分布式计算框架进行数据处理时,如何保证进入storm的消息的一定会被处理,且不会被重复处理.这个时候仅仅开启storm的ack机制并不能解决上述问题.那么该如何设计出一个好的方案 ...…

java职业发展路线图_软开(Java),该如何规划职业路线?

一、增强自身的设计与开发能力Java的应用领域是非常广阔的&#xff0c;从手机应用到互联网、数据库和服务器&#xff0c;从PC端到嵌入式设备和移动终端&#xff0c;Java的身影无处不在&#xff0c;而Java工程师就是这些软件产品的创造者&#xff0c;不仅要懂得产品的设计&#…

阿里云发布智能语音自学习平台,零基础训练人工智能模型

摘要&#xff1a; 业务人员甚至门卫大爷也能训练人工智能&#xff1f;曾经只出现科幻电影中的一幕真的发生了。7月18日&#xff0c;阿里巴巴机器智能技术实验室宣布在阿里云正式发布智能语音自学习平台公有云产品&#xff0c;突破性地提供一键式语音智能自助优化方案&#xff0…

(需求实战_进阶_05)SSM集成RabbitMQ 通配符模式 关键代码讲解、开发、测试

接上一篇&#xff1a; 文章目录一、RabbitMQ 配置文件1. RabbitMQ 生产者配置文件更新二、启动项目2.1. 启动项目2.2. 清空控制台三、管控台总览3.1. 登录管控台3.2. 交换机中查看绑定队列总览四、验证测试4.4. 生产者①请求4.5. 生产者②请求五、启动RabbitMQ5.1. 进入sbin目录…

两台邮件服务器共用一个公网地址,两个不同域邮件服务器的互通

两个不同域的邮件服务的互通如图&#xff0c;有两个不同域的邮件服务器(postfix)通过一个DNS服务器实现互通。首先说明一下IP分配情况服务器1qq.cometh0(VMnet2)&#xff1a; ip:192.168.2.2 netmask:255.255.255.0 gw 192.168.2.1 hostname:mail.qq.com服务器2(qq.neteht0VMne…

python模块搜索路径_Python模块搜索路径

当一个名为 spam 的模块被导入的时候&#xff0c;解释器首先寻找具有该名称的内置模块。如果没有找到&#xff0c;然后解释器从 sys.path 变量给出的目录列表里寻找名为 spam.py 的文件。sys.path 初始有这些目录地址: 包含输入脚本的目录&#xff08;或者未指定文件时的当前目…

AI写程序,这事可没那么简单!

摘要&#xff1a; 去年年初&#xff0c;微软公司推出了一款名为DeepCoder的机器学习系统&#xff0c;同时宣称该系统具有自我编码的能力&#xff0c;这一举动又将人工智能的发展向前推进了一步。 正如人工智能是建立在众多机器学习或深度学习方法之上一样&#xff0c;DeepCoder…

希捷银河声音大_【推仔说新闻】那款硬盘它终于来了 希捷推出首款双磁臂硬盘...

经常关注科技新闻的朋友们应该都知道&#xff0c;现在机械硬盘领域可以说是被固态硬盘冲击的不清&#xff0c;而对于我们广大用户们来说&#xff0c;HDD这一个储存介质就被我们更多的用来充当仓库盘使用&#xff0c;毕竟现在的固态已经下探到白菜级别的价格了。但是对于那些HDD…

(需求实战_进阶_06)SSM集成RabbitMQ 订阅模式 关键代码讲解、开发、测试

背景&#xff1a; 为了减轻服务器的压力&#xff0c;现在原有项目的基础上集成消息队列来异步处理消息! 此项目是企业真实需求&#xff0c;项目的代码属于线上生产代码&#xff0c;直接用于生产即可&#xff01; 此项目采用MQ发送消息模式为:订阅模式&#xff0c;如果对RabbitM…

【目瞪口呆】通信机房内部长这样

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 小枣君责编 | 刘晶晶大家好&#xff0c;我是小枣君。一直以来&#xff0c;我都在努力给大家做通信知识科普&#xff0c;也写了很多有趣的文章。不过&#xff0c;文章再有趣也只是文字&#xff0c;不是实物。现实生活中&#…

NLP的ImageNet时代已经到来

摘要&#xff1a; NLP领域即将巨变&#xff0c;你准备好了吗&#xff1f; 自然语言处理&#xff08;NLP&#xff09;领域正在发生变化。 作为NLP的核心表现技术——词向量&#xff0c;其统治地位正在被诸多新技术挑战&#xff0c;如&#xff1a;ELMo&#xff0c;ULMFiT及Open…

湖南计算机股份有限公司hcc-pr2e,PC台式机电脑如何连接使用HCC PR2E/K10打印机

满意答案一、本地打印机安装1.下载驱动要想连接打印机&#xff0c;首先我们要保证我们的电脑有安装的驱动。如果没有那么我们就要下载驱动(当然如果你有驱动盘就可以直接用)。下载时一定要认真筛选&#xff0c;小编就下了一堆乱七八糟的附属软件。2.安装驱动点开软件&#xff0…

mysql字段分隔符拆分_面试题Mysql数据库优化之垂直分表

在日常的开发工作中&#xff0c;除了JAVA相关的技术&#xff0c;打交道最多的就是Mysql数据库&#xff0c;当数据积累到一定程度&#xff0c;比如500W时就会难免出现一些慢sql&#xff0c;对数据库的优化方式有很多&#xff0c;比如通过增加合理的索引&#xff0c;今天我们来说…

python print用法不换行_python3让print输出不换行的方法

python 3.x版本print输出不换行的格式如下&#xff1a; print(x, end"") 其中&#xff0c;end"" 可使输出不换行&#xff0c;不能省略。 举例&#xff1a;输出结果&#xff1a;内容扩展&#xff1a; python3.x中如何实现print不换行 大家应该知道python中p…

使用Numpy和Opencv完成图像的基本数据分析(Part II)

摘要&#xff1a; 使用Numpy和Opencv完成图像的基本数据分析后续部分&#xff0c;主要包含逻辑运算符操作、掩膜以及卫星图像数据分析等操作 在上一节中&#xff0c;主要是介绍了图像的基本知识以及OpenCV的基本操作&#xff0c;具体内容参见“使用Numpy和Opencv完成基本图像的…