前言:
如果你习惯别人帮你烤肉,那你便无法拒绝terraform。便捷是它的利器,普适是它的价值。你唯一要做的,就是确保最终的状态是你想要的。
Infrastructure as code (IaC),IaC allows you to build, change, and manage your infrastructurein a safe, consistent and repeatable way by defining resourceconfigurations that you can version, reuse,and share.
Tool for infrastructure provisioning,是Terraform的本质。
在那么多基础设施供应工具中,脱颖而出,必有Terraform的独到之处。首先是要挑战广为应用的Ansible,其以playbook模式而强大,playbook通过多个task(服务,任务)集合完成一类功能,让远端主机达到预期的状态,它像是一款用shell写的To-do-list工具。而Terraform关心的是配置文件的最终状态,而不是操作流程。
Terraform的优势是什么?
-
适用于多云平台。
-
HCL语言更容易理解,也写地更快。Human-Readable~
-
Terraform可以在每次你apply之后,追踪到资源的改变。
-
每次修改都可以提交,简而言之有版本控制,更加安全。
只需要定义你最终想要的状态应该是什么,这很重要。
Terraform
provisions,updates, and destroys infrastructure resources such as physical machines, VMs,network switches, containers, and more.
Configurations
are code written for Terraform, using the human-readable HashiCorp Configuration Language (HCL) to describe the desired state of infrastructure resources.
Providers
are the plugins that Terraform uses to manage those resources. Every supported service or infrastructure platform has a provider that defines which resources are available and performs API calls to manage those resources.
Modules
are reusable Terraform configurations that can be called and configured by other configurations. Most modules manage a few closely related resources from a single provider.
The Terraform Registry
makes it easy to use any provider or module. To use a provider or module from thisregistry, just add it to your configuration; when you run terraform init
, Terraform will automatically download everything it needs.
可以看到,Terraform 由Terraform Core和Terraform Plugins组成。
Terraform Core reads the configuration and builds the resource dependency graph. Resource dependency graph使得HCL中可以无视资源的顺序写出资源,无论是subnet、route table,还是associations,Terraform可以找出资源的依赖,并将其正确无误地创建。而你要做的是配好ID,然后等待。
Terraform Plugins (providers and provisioners) bridge Terraform Core and their respective target APIs.
Terraform provider plugins implement resources via basic CRUD (create, read, update, and delete) APIs to communicate with third party services.通过第三方服务调用CRUD API,如果以HashiCups为例,它的接口通过REST API,与Ansible一致。
“Terraform-plugin-framework is a module for building Terraform providers. It is built on terraform-plugin-go. It aims to provide as much of the power, predictability, and versatility of terraform-plugin-go as it can while abstracting away implementation details and repetitive, verbose tasks.” 而其核心则是tfsdk,tfsdk包让Terraform能够与provider通信。
可以来看一下代码,我们拿hashicup provider 举例!
New方法来调用provider的一个实例
而provider的struct,较为简单。作为一个api client去请求数据,而不是Terraform直接向api递交请求,如同SDKv2一样。
我们可以看下具体的providerData,
而接下来的congfigure方法则api client的配置加入到provider。
ctx context.Context:属于golang标准库的一部分,我们很熟悉,通常用作生成api 请求。
req tfsdk.ConfigureProviderRequest:作为配置步骤中的请求,它需要在tfsdk库中的request struct,并且与其他runtime信息一样,会在Terraform configuration block中列举出来。
resp *tfsdk.ConfigureProviderResponse:注意它是一个指针。作为对请求的响应,还可以返回error和warning。
下面,我们来看下请求方法的细节,
从配置中获取provider数据
2.验证username,password,host的存在。
3.创建新的api client
代码都很简单..
还有很多很多代码,下次再写吧…..
进入第二部分,Terraform的使用。
- 定义你的基础设施
- 配置
- 初始化init,上面很大部分讲的就是初始化的过程
- Plan,预览,会告知你对资源的操作
- Apply执行
值得注意的是,在plan阶段,
黄色的波浪线字符是更改modify现有资源 。
而绿色的加号则是create新资源。
红色的减号是delete旧资源。
这边都很简单,就再说一个有趣的概念。
Date Resource,HCL语言中向服务器查询资源的具体信息,可以让你查询到现有的资源和组件,它有着非常有意思的用法。譬如coffee就作为HashiCups的date resource,
一杯咖啡,name、price、teaser,似乎还少了拉花…..
感谢阅读。
参考资料: