Infrastructure As Code:Terraform制霸之道

Tool for infrastructure provisioning,是Terraform的本质。

前言:

如果你习惯别人帮你烤肉,那你便无法拒绝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.

图1:terraform构成

可以看到,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,然后等待。

图2:graph

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 举例!

图3:provider

New方法来调用provider的一个实例

图4:new

而provider的struct,较为简单。作为一个api client去请求数据,而不是Terraform直接向api递交请求,如同SDKv2一样。

图5:struct

我们可以看下具体的providerData,

图6:providerData

而接下来的congfigure方法则api client的配置加入到provider。

图7:congfigure

ctx context.Context:属于golang标准库的一部分,我们很熟悉,通常用作生成api 请求。

req tfsdk.ConfigureProviderRequest:作为配置步骤中的请求,它需要在tfsdk库中的request struct,并且与其他runtime信息一样,会在Terraform configuration block中列举出来。

resp *tfsdk.ConfigureProviderResponse:注意它是一个指针。作为对请求的响应,还可以返回error和warning。

下面,我们来看下请求方法的细节,

从配置中获取provider数据

图8:provider.go

2.验证username,password,host的存在。

图9:password/host/username

3.创建新的api client

图10:api client

代码都很简单..

还有很多很多代码,下次再写吧…..

进入第二部分,Terraform的使用。

图11: terraform use

  • 定义你的基础设施
  • 配置
  • 初始化init,上面很大部分讲的就是初始化的过程
  • Plan,预览,会告知你对资源的操作
  • Apply执行

值得注意的是,在plan阶段,

黄色的波浪线字符是更改modify现有资源 。

而绿色的加号则是create新资源。

红色的减号是delete旧资源。

这边都很简单,就再说一个有趣的概念。

Date Resource,HCL语言中向服务器查询资源的具体信息,可以让你查询到现有的资源和组件,它有着非常有意思的用法。譬如coffee就作为HashiCups的date resource,

图12: data source

一杯咖啡,name、price、teaser,似乎还少了拉花…..

感谢阅读。

参考资料:

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus