Terraform Module 编写指南

简介: Module 是一个Terraform 模板,是对多个子节点,子资源,子架构模板的组合和抽象。利用Module 在降低模板编写和维护复杂度的同时,使得模板结构更加简洁清楚。为什么要使用 Module,详见文章[ Module 让 Terraform 使用更简单](https://www.atatech.org/articles/119465)。

Module 是一个Terraform 模板,是对多个子节点,子资源,子架构模板的组合和抽象。利用Module 在降低模板编写和维护复杂度的同时,使得模板结构更加简洁清楚。为什么要使用 Module,详见文章 Module 让 Terraform 使用更简单

本文将根据自己对 Module 的理解,向大家讲解如何编写一个通用,标准的 Module。

建立 Module 的 Github 仓库

在 Terraform 官方注册 module,目前只支持 Github 的仓库,因此,在编写模板之前,必须先建立一个标准的 Github 仓库

  1. 仓库必须是 Public 的;
  2. 仓库名称必须符合格式:terraform-<PROVIDER>-<NAME>,如terraform-alicloud-ecs-instanceterraform-alicloud-vpc
  3. 仓库建好后必须给仓库添加一个描述

为了更好的管理所有阿里云的terraform module,现在所有的仓库都建在组织 terraform-alicloud-modules下。当有新建仓库需求时,可联系负责人。

编写Module

Module 仓库建立完毕后,首先要 fork 仓库并将其clone到本地。接下来,开始 Mudole 的编写工作。官方已经给出了一个标准的 Module 应该遵循的原则和规范,详见 standard-module-structure . 本文将在此基础上进行补充。

  1. 基本原则

    • 每个Module不宜包含过多的资源,要尽可能只包含同一产品的相关资源,这样带来的好处是Module的复杂度不高,便于维护和阅读;
    • 对于统一产品的不同资源,应该分别放在不同的子module中,然后在最外层的main.tf中组织所有的子资源,比如 module slb 中定义了两个资源 slb instanceslb attachment,这两个子资源分别定义在了 modules/slbmodules/slb_attachment 中,然后在最外层的 main.tf中将这两个module组合为一个新的module
    • 每个module要尽可能单元化,以便可以在实际使用过程中自由添加和删除而不影响其他resource。即一个module尽可能叙述1-2件事情,如创建一个slb实例,并将一组ecs的挂载到这个slb下(slb的作用就是实现对ecs的负载均衡),至于slb的listener配置,应该放置在一个独立的mudule中,一方面listeners比较复杂,涉及四种协议,另一方面,对于同一协议的listener,除了监听端口外,大部分的配置都是相同的,而这些相同的配置可以通过一个单独的module被复用在不同其他资源模板中;
    • 模板编写过程中,需要使用到大量的TF语法,详见configuration syntaxinterpolation syntax
  2. main.tf

    • 每个 Module 都必须包含一个 main.tf 用于存放 resource 和 datasource。resource和datasource的参数禁止使用硬编码,必须通过变量进行引用;
    • 为了标准起见,每个 resource 和 data source 的命名均以一些关键字或者关键字前缀为主,如thisdefault,尽量避免使用footest
    • 为了更好的了解Module被他人引用的次数,阿里云Provider支持对每个Module进行打标,即在main.tf的provider中声明字段configuration_source,格式如下:

      provider "alicloud" {
       ...
       configuration_source = "terraform-alicloud-modules/demo"  // This should be replaced by the specified owner and module name
      }
  3. variables.tf

    • 每个变量都要添加该参数对应的描述信息,这个信息最终是要呈现在terraform registry官网上的;
    • 对于一些非关系型的参数,可设置一个默认值,如name,description等
    • 对于复杂类型的变量,要显示声明其类型,如list,map
    • 子资源的变量要在Readme中以列表的形式予以呈现
  4. outputs.tf

    • module中output的作用是被其他模板和module引用,因此,每个module要讲一些重要的信息输出出来,如资源ID,资源name 等;
    • 重复资源的变量要以列表的形式予以输出,如module ecs-instance中,创建多个instance资源,这些资源的ID应该输出到一个list变量instance_ids
    • 和variables一样,子资源的output变量也要在Readme中以列表的形式予以呈现
  5. README

    • 描述下当前Module是用来干什么的,涉及哪些resource和data source
    • 增加 Usage,指明该如何使用这个 Module。Module 的source 格式为 source = "<Repo Organization>/<NAME>/alicloud",如:source = "terraform-alicloud-modules/slb-listener/alicloud"
    • 添加module暴露的入参和出参,帮助开发者更好的使用Module
    • 具体细节可参考其他module

为了更好地编写Module,阿里云提供了一个Module Demo,大家可以参考。

测试并发布

在完成模板的编写后,可以通过terratest 来实现对当前Module的验证性测试。测试无误后,提交代码到github。
如果想要把Module提交到阿里云官方组织terraform-alicloud-modules,可直接在下方留言或者发邮件到 heguimin36@163.com 进行申请。申请通过后,我将为大家新建一个属于自己的Repo。每个贡献Module的开发者都将有机会成为terraform-alicloud-modules members中的一员。

由于Terraform Module 是以 Repo releases 来实现版本控制的,因此在确定代码无误后,包括Readme,发布一个新的Release。之后在terraform module 注册和完成module的发布,具体操作详见 registry modules.

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
目录
相关文章
|
数据可视化 数据中心 开发者
Terraform Module 可视化正式发布
阿里云正式发布 Terraform Module 的可视化操作界面,在命令行操作模式的基础上,增加了基于 Terraform 的在线资源编排的能力,持续帮助开发者和企业降低 Terraform Module 的使用门槛。
5959 0
|
数据中心 开发者
Terraform Module大赛来啦,AirPods Pro免费送!
Terraform 模板征集大赛现火热招募中,价值两千元的AirPods Pro免费送,快来参加吧!
6081 0
|
运维 安全 IDE
加速阿里云部署:Terraform在甄云科技的深度应用
甄云科技是一家领先的数字化采购平台服务商,通过Terraform实现全球云基础设施的高效管理与快速部署。公司成立于2017年,已服务全球30多个行业的中大型企业,客户遍布20多个国家和地区。利用IaC(基础架构即代码)理念和Terraform工具,甄云科技显著提升了开发与运维效率,减少了人为错误,加快了迭代速度,并支持业务快速扩展,为全球化战略提供了稳固的云基础架构支持。未来,公司将持续优化技术框架,回馈社区,助力更多企业的数字化转型。
|
弹性计算 API 持续交付
基于 ROS 的 Terraform 托管服务轻松部署文本转语音系统 ChatTTS
基于 IaC 的理念,通过定义一个模板,使用 ROS 提供的 Terraform 托管服务进行自动化部署,可以非常高效快捷地部署任意云资源和应用(比如 ChatTTS 服务)。相比于手动部署或者通过 API、SDK 的部署方式,有着高效、稳定等诸多优势,也是服务上云的最佳实践。
479 58
基于 ROS 的 Terraform 托管服务轻松部署文本转语音系统 ChatTTS
|
弹性计算 持续交付 API
基于 ROS 的Terraform托管服务轻松部署ChatGLM-6B
文章介绍了如何利用ROS和Terraform模板轻松自动化部署基于GLM架构、优化中文对话的ChatGLM-6B模型至阿里云,提高了部署效率与便捷性,适用于多种应用场景,且模型部署过程详细,彰显了基础设施即代码(IaC)的优势。
基于 ROS 的Terraform托管服务轻松部署ChatGLM-6B
|
弹性计算 人工智能 持续交付
基于 ROS 的Terraform托管服务轻松部署Qwen-7B-Chat
文章介绍了如何利用ROS和Terraform模板轻松自动化部署阿里云的Qwen-7B-Chat大语言模型服务,提高了部署效率与便捷性,是实现云资源和服务快速上线的最佳实践。
基于 ROS 的Terraform托管服务轻松部署Qwen-7B-Chat
|
弹性计算 持续交付 数据中心
一键云部署:ROS的Terraform托管服务助你轻松上线2048经典游戏
阿里云的资源编排服务ROS提供了Terraform托管能力,用户可以直接在ROS控制台上部署Terraform脚本,本文将详细介绍如何使用ROS的Terraform托管服务一键部署经典的2048小游戏到云端,让全世界的玩家都能在线体验。
EMQ
|
JSON 负载均衡 物联网
使用 Terraform 在 GCP 上一键部署 EMQX MQTT Broker
本文将指导您如何设置 GCP 项目、创建服务账户、编写 Terraform 配置文件,实现在 GCP 上轻松部署 EMQX MQTT Broker。
EMQ
341 0
使用 Terraform 在 GCP 上一键部署 EMQX MQTT Broker
|
存储 弹性计算 API
使用 CloudIaC 使 terraform 的代码部署更容易
CloudIaC 是一个开源基础架构自动化平台,它可以将Terraform及其他框架下的 deployment 集中到一个协作区,以方便你的整个团队使用。同时CloudIaC支持动态环境,策略合规检测,用户自助式UI 界面等功能。当您考虑使用Terraform 等低代码开发工具去实现多云资源的管控的时候,那么CloudIaC 不失为一个最佳解决方案。
1747 1
使用 CloudIaC 使 terraform 的代码部署更容易
|
存储 弹性计算 运维
Terraform一键部署ECS实例
Terraform一键部署ECS实例
1102 0
Terraform一键部署ECS实例

热门文章

最新文章

推荐镜像

更多