云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

数据库服务器_数据库远程连接不上_

小七 141 0

编写自定义地形提供程序

本指南用于历史目的,但最新指南可在Terraform指南中找到。在Terraform中,"提供者"是上游API的逻辑抽象。本指南详细介绍了如何为Terraform构建自定义提供程序。»为什么?创建自定义地形提供程序有几个可能的原因,例如:一种内部私有云,其功能要么是专有的,要么不会使开源社区受益。"正在工作"提供程序正在本地进行测试,然后再进行反馈。现有提供程序的扩展»本地设置Terraform支持插件模型,所有的提供者实际上都是插件。插件作为Go二进制文件分发。虽然技术上可以用另一种语言编写插件,但几乎所有的Terraform插件都是用Go编写的。有关安装和配置Go的更多信息,请访问Golang安装指南。本文假设您熟悉Golang和基本编程概念。提醒一下,Terraform的所有核心提供商都是开源的。当遇到困难或寻找示例时,请随时向开源提供商寻求帮助。»提供程序架构首先,创建一个名为提供者.go. 这是提供程序的根目录,应包含以下样板代码:主包装进口("github.com/hashicorp/terraform/helper/schema")函数提供程序()*架构.提供程序{返回&架构.提供程序{资源映射:映射[字符串]*架构.资源{},}}helper/schema库是Terraform核心的一部分。它抽象了许多复杂性并确保了提供者之间的一致性。上面的示例定义了一个空的提供程序(没有资源)。在*架构.提供程序类型描述提供程序的属性,包括:它接受的配置键它所支持的资源任何要配置的回调»构建插件围棋需要一个main.go文件,它是生成二进制文件时的默认可执行文件。由于Terraform插件是作为Go二进制文件分发的,因此使用以下代码定义此入口点非常重要:主包装进口("github.com/hashicorp/terraform/plugin""github.com/hashicorp/terraform/terraform")函数main(){插件。服务(&plugin.ServeOpts插件{ProviderFunc:函数()terraform.ResourceProvider{返回提供程序()},})}这将建立main函数以生成有效的、可执行的Go二进制文件。主函数的内容使用Terraform的插件库。这个库处理terraformcore和插件之间的所有通信。接下来,使用Go工具链构建插件:$go build-o地形提供程序示例输出名称(-o)非常重要。Terraform搜索以下格式的插件:地形--在上面的例子中,插件的类型是"provider",名称是"example"。要验证工作正常,请执行刚刚创建的二进制文件:$./terraform提供程序示例这个二进制文件是一个插件。这些不是要直接执行的。请执行使用这些插件的程序,这将自动加载任何插件这是Terraform插件的基本项目结构和脚手架。总而言之,文件结构是:.├── main.go└── 提供者.go»定义资源Terraform提供程序管理资源。提供者是上游API的抽象,资源是该提供者的组件。例如,AWS提供者支持AWS_instance和AWS_elastic_ip。DNSimple支持DNSimple_记录。Fastly支持Fastly_服务。让我们向我们虚构的提供者添加一个资源。一般来说,Terraform提供者将每个资源放在他们自己的文件中,以资源命名,前缀为resource。要创建一个示例服务器,这将是resource_服务器.go按惯例:主包装进口("github.com/hashicorp/terraform/helper/schema")函数资源服务器()*架构.资源{返回&架构.资源{创建:resourceServerCreate,读:资源服务器读,更新:资源服务器更新,删除:资源服务器删除,架构:映射[字符串]*架构。架构{"地址":&架构。架构{类型:架构.TypeString,必选:真,},},}}它使用架构.资源类型。此结构定义资源的数据架构和CRUD操作。定义这些属性是创建资源所必需的。上面的模式定义了一个元素"address",这是一个必需的字符串。Terraform的模式自动执行验证和类型转换。接下来定义了四个"字段":Create、Read、Update和Delete。资源需要Create、Read和Delete函数才能正常工作。还有其他功能,但这些是唯一需要的功能。Terraform本身处理调用哪个函数以及使用什么数据。基于模式和资源的当前状态,Terraform可以决定是否需要创建新资源、更新现有资源或销毁。四个struct字段中的每一个都指向一个函数。虽然在技术上可以在资源模式中内联所有函数,但最佳实践要求将每个函数拉入其自己的方法中。这对测试和可读性都进行了优化。现在填写这些存根,密切关注方法签名。函数资源服务器创建(d*架构.ResourceData,m接口{})错误{返回零}函数资源服务器读取(d*架构.ResourceData,m接口{})错误{返回零}函数资源服务器更新(d*架构.ResourceData,m接口{})错误{返回零}函数资源服务器删除(d*架构.ResourceData,m接口{})错误{返回零}最后,更新提供者.go注册这个新资源。函数提供程序()*架构.提供程序{返回&架构.提供程序{资源映射:映射[字符串]*架构.资源{"示例服务器":resourceServer(),},}}构建并测试插件。所有操作都应该按原样编译,尽管所有操作都是不可操作的。$go build-o地形提供程序示例$./terraform提供程序示例这是一个二进制插件。这些不是要直接执行的。请执行使用这些插件的程序,这将自动加载任何插件布局现在如下所示:.├── main.go├── 提供者.go├—资源_服务器.go———地形提供者示例»调用提供程序前面的部分展示了通过shell直接运行提供程序,shell会输出一条警告消息,如:这个二进制文件是一个插件。这些不是要直接执行的。请使用这些插件来执行这些程序自动加载任何插件Terraform插件应该直接由Terraform执行。为了测试这个,创建一个主.tf在工作目录中(插件所在的位置)。资源"示例服务器""我的服务器"{}执行地形计划:$地形图发生1个错误:*示例_服务器.my-服务器:"地址":未设置必填字段这将验证Terraform是否正确地将工作委派给我们的插件,并且我们的验证工作正常。通过向资源添加地址字段来修复验证错误:资源"example_server""我的服务器"{地址="1.2.3.4"}执行terraform计划以验证验证是否通过:$地形图+示例_服务器.my-服务器地址:"1.2.3.4"计划:1表示添加,0表示更改,0表示销毁。可以运行terraform apply,但这将是一个no-op,因为所有的资源选项当前都不采取任何操作。»实施创建返回资源_服务器.go,实现创建功能:函数资源服务器创建(d*架构.ResourceData,m接口{})错误{address:=d.Get("address")(字符串)d、 集合ID(地址)返回零}它使用架构.ResourceData获取用户在Terraform配置中提供的"address"值的API。由于Go的方法可行,我们不得不把它打成字符串。但是,这是一个安全的操作,因为我们的模式保证它将是字符串类型。接下来,它使用SetId(一个内置函数)将资源的ID设置为地址。非空ID的存在告诉Terraform资源已经创建。此ID可以是任何字符串值,但应该是可用于再次读取资源的值。重新编译二进制文件,运行terraform计划和terraform将应用。$go build-o地形提供程序示例# ...$地形图+示例_服务器.my-服务器地址:"1.2.3.4"计划:1表示添加,0表示更改,0表示销毁。$terraform应用示例_服务器.my-服务器:正在创建。。。地址:"=>"1.2.3.4示例_服务器.my-服务器:创建完成(ID:1.2.3.4)申请完成!资源:添加了1个,更改了0个,销毁了0个。由于Create操作使用SetId,Terraform认为资源创建成功。通过运行terraform plan来验证这一点。$地形图正在刷新计划前内存中的地形状态。。。刷新的状态将用于计算此计划,但不会保存到本地或远程状态存储。示例_服务器.my-服务器:正在刷新状态。。。(编号:1.2.3.4)没有变化。基础设施是最新的。这意味着Terraform没有检测到配置和实际存在的物理资源。因此,地形不需要做任何事。同样,由于调用SetId,Terraform认为资源是创建的。当运行计划时,Terraform正确地确定没有要应用的更改。要验证此行为,请更改address字段的值并再次运行terraform plan。您应该看到如下输出:$地形图示例_服务器.my-服务器:正在刷新状态。。。(编号:1.2.3.4)~示例_服务器.my-服务器地址:"1.2.3.4"=>"5.6.7.8"计划:0添加,1更改,0销毁。Terraform检测到更改并显示带有~前缀的diff,注意资源将被修改