共计 8817 个字符,预计需要花费 23 分钟才能阅读完成。
《Terraform 101 从入门到实际》这本小册在南瓜慢说官方网站和 GitHub 两个中央同步更新,书中的示例代码也是放在 GitHub 上,不便大家参考查看。
初闻不知 Terraform,再闻已是云中人。
什么叫基础设施即代码?
在以前,当咱们须要把利用部署在服务器时,须要购买多台服务器和机房、组装交换机和网络、不间断电源 UPS 等。随着云时代的到来,咱们能够在 IaaS(Infrastructure as a Service)平台间接购买所有的基础设施,包含服务器、专用网络、DNS、负载平衡等,而你只须要专一于利用层面即可。
IaaS(Infrastructure as a Service)的意思是基础设施即服务,它是云服务的根底。驰名的 IaaS 厂商有亚马逊、微软、谷歌和阿里云等。
云厂商为咱们解决了许多运维问题:咱们不再须要本人治理物理机器,而且可能依据须要随时创立和销毁云机器,还能依据业务和性能要求指定创立服务器的配置和数量。这种便当对于守业型的小公司和集体开发者尤其重要。
随时公司业务的良好倒退,所须要的硬件资源越来越多,架构越来越简单。通过界面操作手工创立服务器、数据库等资源的形式带来越来越多的问题。首先,只有是人工操作,都会有失误的可能,没有人能保障本人不会犯错;而人工操作在软件行业产生事变的案例不足为奇。其次,为保障正确率,人工操作个别只能串行,资源多的时候工夫会很长。最初,如果我须要依据开发环境的配置再创立一个测试环境和生产环境,人工操作可能会造成差别和谬误。
因而,对于这种简单须要,最佳的形式是通过代码来创立所有硬件资源。这种思维就是基础设施即代码(Infrastructure as Code,很简称 IaC),通过代码与定义、部署、更新和销毁基础设施。把硬件映射为软件,而开发和运维人员通过治理代码来治理硬件。
IaC 的益处有:
- 自动化:与软件代替人工,实现自动化,缩小危险和平安问题;
- 效率高:软件能够并行创立资源,大大提高效率;
- 记录与追踪:通过代码与执行状况,记录硬件变更,出问题也能够追溯;
- 重用与复制:抽取公共模块实现重用,如创立一个 Kubernetes 集群的资源能够封装成一个模块。
最终,实现疾速平安地利用部署交付(Devivery)。
IaC 工具
在 IaC 这方面的优良工具还是十分多的,而且不同的工具实现不同的职责,上面列出一些比拟常见的工具:
图标 | 工具名 | GitHub STAR 数 |
---|---|---|
<img src=”https://pkslow.oss-cn-shenzhen.aliyuncs.com/images/other/terraform-101/pictures/01.introduction/logo.ansible.png” width=”40″> | Ansible | 50.9k |
<img src=”https://pkslow.oss-cn-shenzhen.aliyuncs.com/images/other/terraform-101/pictures/01.introduction/logo.terraform.png” width=”80″> | Terraform | 30.2k |
<img src=”https://pkslow.oss-cn-shenzhen.aliyuncs.com/images/other/terraform-101/pictures/01.introduction/logo.vagrant-logo.png” width=”80″> | Vagrant | 23k |
<img src=”https://pkslow.oss-cn-shenzhen.aliyuncs.com/images/other/terraform-101/pictures/01.introduction/logo.chef.png” width=”40″> | Chef | 6.8k |
<img src=”https://pkslow.oss-cn-shenzhen.aliyuncs.com/images/other/terraform-101/pictures/01.introduction/logo.puppet.jpg” width=”40″> | Puppet | 6.4k |
<img src=”https://pkslow.oss-cn-shenzhen.aliyuncs.com/images/other/terraform-101/pictures/01.introduction/logo.aws-cf.png” width=”40″> | AWS CloudFormation | |
<img src=”https://pkslow.oss-cn-shenzhen.aliyuncs.com/images/other/terraform-101/pictures/01.introduction/logo.azure-resource-manager.jpg” width=”40″> | Azure Resource Manager | |
<img src=”https://pkslow.oss-cn-shenzhen.aliyuncs.com/images/other/terraform-101/pictures/01.introduction/logo.google-deployment-manager.jpg” width=”40″> | Google Cloud Deployment Manager |
其中,Ansible 在配置自动化应该是领头羊的位置。而 Terraform 则在服务开明上的事实标准。这里并不想给各个工具做具体介绍,感兴趣的能够去官网或 GitHub 理解。
注:有些文章或书籍会把 Docker 和 Kubernetes 也列为 IaC 工具,它们的主要职责是在容器与服务编排方面。
Terraform 隆重退场
Terraform 是什么
咱们的配角 Terraform 终于退场了。它是由 HashiCorp 公司研发的开源的 IaC 工具,它是由 GO 语言编写的,能够在各个平台上运行,反对 Linux、Mac、Windows 等。它简略易用,即便没有太多代码教训的人,也能读懂 Terraform 的配置代码 HCL。
HCL,即 HashiCorp Configuration Language,是 HashiCorp 公司开发的配置语言。后续咱们会介绍一些罕用语法。
Terraform 是一个平安高效的用于对基础设施进行创立和变更且进行版本控制的工具。它反对公有云和私有云,如 AWS、Azure、GCP 和阿里云等。它的官方网站为 https://www.terraform.io。
个性
次要个性有:
- 基础设施即代码:通过配置语言 HCL 来形容基础设施,也让代码更好地共享和重用。
- 变更打算:在理论变更前能够依据代码和状态生成行将要产生变更的打算,它能通知你将要生成、扭转和销毁哪些资源。这能够在执行变更前再做最好的查看,为基础设施提供多一层爱护。
- 资源视图:能够依据依赖关系创立出资源视图,能够直观地查看整个基础设施的关系。
- 自动化:毋庸人工干预就能够实现变更。
版本号
截至 2021 年 12 月 02 日,Terraform 的最新版本为 1.0.11,而它在 2021 年 6 月 8 日才正式公布 1.0.0 版本。可见 Terraform 是如此年老且有生机。而在 Terraform 还不是 1.0.0 版本的时候,曾经有大量公司在生产环境上应用了。
架构与原理
Terraform 是一个由 Go 语言编写的程序,它会读取 HCL 语言编写的配置文件,而后将变更信息通过 RPC 与插件通信,由插件调用云厂商的 API 实现变更操作。这就是 Terraform 的工作原理,架构图如下:
基本概念
Terraform core:Terraform 的外围组件,相似于指挥官,负责解析配置、治理状态、模块等外围性能。
插件 Plugin:实现具体变更的组件,因为 Terraform 反对多种平台,它并没有把对所有平台的反对都放到外围组件中实现,而是通过插件的形式来提供这些性能。须要对接什么平台,就退出什么平台的插件,十分方面。
模块 module:能够将实现特定性能的 HCL 封装成一个模块,以实现代码复用。相似于其它编程语言中的函数或办法。有入参和出参,所有都可自定义。
状态 state:状态存在专门的状态文件里,它是作用是记录理论基础设施的状态。当再次执行变更申请时,Terraform 会读取状态文件,判断是否真的须要变更理论的基础设施。如果状态文件记录的状态与 HCL 形容的统一,就不必再执行变更操作了。
初体验
下载安装
Terraform 就是一个二进制的程序,只有下载并增加到 PATH 中去就能够了。各个系统的装置形式没有太大差别。这里以 Mac 零碎为例,做个简略介绍。
下载程序:
能够间接到官网界面(https://www.terraform.io/down…)去下载,请依据本人的零碎抉择对应的文件:
下载后进行解压,并将该程序增加到环境变量中。
比方我的 Terraform 放在门路 /Users/larry/Software/terraform 中,则增加到环境变量的命令如下:
export PATH=$PATH:/Users/larry/Software/terraform
为了让它始终失效,我把下面命令放在 home 目录下的.bash_profile 文件中。
查看是否装置胜利如下:
$ terraform version
Terraform v1.0.11
on darwin_amd64
如果在纯终端的环境下,也能够通过命令进行下载和解压,命令如下:
# 下载安装包
$ wget https://releases.hashicorp.com/terraform/1.0.11/terraform_1.0.11_darwin_amd64.zip
# 解压
$ unzip terraform_1.0.11_darwin_amd64.zip
最简略的工作:创立一个文件
Terraform 的次要利用场景是云服务的基础设施治理,但为了让大家能疾速的接触与体验 Terraform,我会先抉择最简略的一个插件来入门,免得须要太多的环境设置。咱们的工作是创立一个文本文件,内容由咱们来指定。能够通过插件 hashicorp/local 来实现。
在当前目录创立一个 main.tf 文件,残缺的代码如下:
terraform {
required_version = "= v1.0.11"
required_providers {
local = {
source = "hashicorp/local"
version = "= 2.1.0"
}
}
}
resource "local_file" "terraform-introduction" {
content = "Hi guys, this the tutorial of Terraform from pkslow.com"
filename = "${path.module}/terraform-introduction-by-pkslow.txt"
}
而后执行上面命令:
$ terraform init
Initializing the backend...
Initializing provider plugins...
- Finding hashicorp/local versions matching "2.1.0"...
- Installing hashicorp/local v2.1.0...
- Installed hashicorp/local v2.1.0 (signed by HashiCorp)
Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run "terraform init" in the future.
Terraform has been successfully initialized!
You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.
If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
看命令的输入后果能够晓得,Terraform 会主动帮咱们去下载对应版本的插件 hashicorp/local,并做一些初始化的操作。
接着咱们通过命令 terraform plan
来查看将要执行的变更打算:
$ terraform plan
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# local_file.terraform-introduction will be created
+ resource "local_file" "terraform-introduction" {
+ content = "Hi guys, this the tutorial of Terraform from pkslow.com"
+ directory_permission = "0777"
+ file_permission = "0777"
+ filename = "./terraform-introduction-by-pkslow.txt"
+ id = (known after apply)
}
Plan: 1 to add, 0 to change, 0 to destroy.
输入日志中会提醒须要创立、扭转和销毁多少资源。
Plan: 1 to add, 0 to change, 0 to destroy
这里示意会创立一个资源。
废话少说,咱们间接执行变更:
$ terraform apply
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# local_file.terraform-introduction will be created
+ resource "local_file" "terraform-introduction" {
+ content = "Hi guys, this the tutorial of Terraform from pkslow.com"
+ directory_permission = "0777"
+ file_permission = "0777"
+ filename = "./terraform-introduction-by-pkslow.txt"
+ id = (known after apply)
}
Plan: 1 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value:
会让你确认是否执行变更,如果是,则输出 yes。咱们间接输出 yes 并按回车。
Enter a value: yes
local_file.terraform-introduction: Creating...
local_file.terraform-introduction: Creation complete after 0s [id=f63c7933c953ea2d03820d1ec35a80c718bd4777]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
胜利执行,创立了文件。
$ ls -l
total 24
-rw-r--r-- 1 larry staff 344 Dec 3 00:01 main.tf
-rwxr-xr-x 1 larry staff 55 Dec 3 00:13 terraform-introduction-by-pkslow.txt
-rw-r--r-- 1 larry staff 921 Dec 3 00:13 terraform.tfstate
下面还有一个 tfstate 文件,是用来记录状态的,当前会具体讲这块内容。
查看一下文件内容:
$ cat terraform-introduction-by-pkslow.txt
Hi guys, this the tutorial of Terraform from pkslow.com
与咱们预期的内容统一。
如果再次执行 apply 会不会再次创立一个文件呢?还是创立失败,因为文件已存在?
带着这样的问题,咱们再执行一次:
$ terraform apply
local_file.terraform-introduction: Refreshing state... [id=f63c7933c953ea2d03820d1ec35a80c718bd4777]
No changes. Your infrastructure matches the configuration.
Terraform has compared your real infrastructure against your configuration and found no differences, so no changes are needed.
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
发现提醒不须要变更,不会执行任何操作。
大家能够思考一下为什么,答案会在前面章节揭晓。
当初我不须要这个文件呢,通过 destroy 命令能够删除:
$ terraform destroy
local_file.terraform-introduction: Refreshing state... [id=f63c7933c953ea2d03820d1ec35a80c718bd4777]
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
- destroy
Terraform will perform the following actions:
# local_file.terraform-introduction will be destroyed
- resource "local_file" "terraform-introduction" {
- content = "Hi guys, this the tutorial of Terraform from pkslow.com" -> null
- directory_permission = "0777" -> null
- file_permission = "0777" -> null
- filename = "./terraform-introduction-by-pkslow.txt" -> null
- id = "f63c7933c953ea2d03820d1ec35a80c718bd4777" -> null
}
Plan: 0 to add, 0 to change, 1 to destroy.
Do you really want to destroy all resources?
Terraform will destroy all your managed infrastructure, as shown above.
There is no undo. Only 'yes' will be accepted to confirm.
Enter a value: yes
local_file.terraform-introduction: Destroying... [id=f63c7933c953ea2d03820d1ec35a80c718bd4777]
local_file.terraform-introduction: Destruction complete after 0s
Destroy complete! Resources: 1 destroyed.
一样须要你确认是否真的须要删除,输出 yes 回车即可。
到这里,就曾经真正地带大家体验了一下 Terraform 是如何工作的,介绍了它的整个流程,也就是 Terraform 官网所说的Write, Plan, Apply。心愿大家能真正入手实际,包含后续的试验,这跟学编程语言是一样的。
最初,对于本次试验我想提几点:
- 其中的 plan 命令不是必须的,它是展现行将产生的变更,你能够间接 apply 也是能够的;
- 能够通过 plan 命令输入打算文件,而后 apply 的时候指定打算文件;
- 命令 apply 和 destroy 能够不用交互式输出 yes,通过增加参数
-auto-approve
即可。