## 为什么需要Terraform ## 由于国内云服务平台众多,每个云服务平台都有自己的api,每个api都非常复杂,云从业者没有办法去挨个学习每个平台的api去管理云平台的云资源,于是有很多公司便出了很多方案和产品,其中亚马逊公司的cloudformation(仅仅适用于aws).HashiCorp公司的Terraform(适用于多个云平台)解决了从网络组件到实际服务器映像定义基础架构即代码的问题,也就是说不管你用什么与云,使用terraform,你大部分的terraform的代码都很相似(相似但是不是完全一样),无论是aws,aliyun还是azure他们的大部分terraform代码基本非常相似. ## Terraform是什么 ## 1. Terraform是由HashiCorp公司在2014年左右推出的开源工具(https://www.hashicorp.com/products/terraform).Terraform 是一个 IT 基础架构自动化编排工具,也就是自动化管理我们云端的基础设置,比如网络,安全,cpu,memory,disk等,也会包括管理包括数据库,域名,K8s等软件服务. 2. Terraform只是HashiCorp旗下一款产品,旗下还有Packer Vagrant Vault Nomad Consul等非常有名的产品,如果有事云从业者建议学习使用Terraform旗下的大部分产品 3. HashiCorp目前还没有IPO上市,目前估值50亿美金,据传会在2021-2022上市 3. HashiCorp跟aws,azure,gcp,alicloud,cisco,oracle等都是合作伙伴,目前github上面光terraform就有26.6K stark和6.6K Fork,contributor有1500多人,看见terraform的庞大的用户群体和开源支持者 4. 支持市场上大多数主流的云 ![cloud](https://img.kancloud.cn/ed/1e/ed1e0e675f9f2657987f2ca181149a1f_1564x586.jpg) ## Terraform 能做什么 ## 1. 它的口号是 "Write, Plan, and create Infrastructure as Code", 基础架构即代码,也就是说它能用代码来管理这些基础设施.Terraform 几乎可以支持所有市面上主流的云服务,也就是说她一同了一套云服务接口,各个厂家通过实现自己的provider来实现对terraform的支持 1.1 阿里云的例子 ``` provider "alicloud" { #这是变量,要用实际AccessKeyId access_key = "xxx" #这是变量,要用实际AccessKeySecret secret_key = "xxx" region = "cn-beijing" #version = "~> 1.5.0" } resource "alicloud_vpc" "vpc" { vpc_name = "my_vpc" cidr_block = "172.16.0.0/16" } resource "alicloud_vswitch" "vswitch" { vpc_id = alicloud_vpc.vpc.id cidr_block = "172.16.0.0/24" zone_id = "cn-beijing-b" vswitch_name = "my_switch" } ``` 2.1 aws 的例子 ``` provider "aws" { #这是变量,要用实际AccessKeyId access_key = "xxx" #这是变量,要用实际AccessKeySecret secret_key = "xxx" region = "us-west-2" } resource "aws_vpc" "main" { cidr_block = "10.0.0.0/16" } resource "aws_subnet" "main" { vpc_id = aws_vpc.main.id cidr_block = "10.0.1.0/24" availability_zone_id = "cn-beijing-b" } ``` ## Terraform 的架构 ## 1. Terraform本身是基于插件的架构,可扩展性很强,可以方便程序员对Terraform进行扩展。Terraform从逻辑上可以分为两层,核心层(Terraform Core)和插件层(Terraform Provider) ![架构](https://img.kancloud.cn/6a/71/6a71273ca75666401c5f3cbaa7168efd_2354x1244.png) 2. terraform执行流程 ![流程](https://img.kancloud.cn/9a/d4/9ad49755a41632123d1fdd6bb4c9e14f_2070x1104.png) 3. 核心层其实就是terraform的命令行工具,它是用go语言开发的,它负责: 2.1. 读取.tf代码,并对配置文件和代码进行变量取值替换 2.2. 资源状态文件管理 2.3. 依据图论,对代码中创建的资源依赖关系进行分析,并创建依赖关系图谱 2.4. 根据依赖关系图谱,执行资源先后创建。对于没有依赖关系的资源,会并行进行创建(缺省10个并行进程),这也是Terraform能够高效快速管理云资源的原因。 2.5. 用RPC调用插件层 4. 插件层也是由go语言开发的,Terraform有超过250个不同的插件,它们负责 接受核心层的RPC调用和具体提供某一项服务的执行 4.1. Provider负责与外界API的集成,比如腾讯云和阿里云Provider就提供了在云上创建、修改、删除云资源的功能。这个插件负责和云端API的接口,并提供一层抽象,这样程序员可以在不了解API细节的情况下,通过terraform来编排资源。它负责:初始化以及外界API通信,外界API的认证,定义云资源与外界服务的关系 4.2. Provisioner负责在资源创建或者删除完成后,执行一些脚本.比如Puppet Provisioner就可以在云虚拟机资源创建完成后,在该资源上下载、安装、配置Puppet agent.