在之前看 Perfect Media Server 的时候看到作者有推荐一本叫做 《Infrastructure as Code》, O’REILLY 出品,作者描述了一个使用文本文件来定义基础设施的框架。在没有了解到这个概念之前我只是简单了解过 [[Ansible]] 这个代码即配置的应用,也就是定义了软件的配置,而 [[Terraform]] 则更像是用纯文本(代码)定义了硬件配置。
这句话让我茅塞顿开:
Infrastructure as Code
在过去很长的一段时间里面,我都保存我使用的 docker-compose 配置文件,这样使得我无论拿到哪一台机器都可以快速的恢复之前的服务,这都依赖于这些年 Docker 的兴起。
Infrastructure as Code - Ansible Terraform https://t.co/RlqVlXGUCk
— Ein Verne (@einverne) October 22, 2021
管理配置文件的方式就和代码开发一样,像 Ansible 和 Terraform 这样的工具可以将对基础设施的配置完全配置化。使用 Terraform 来创建基础设施,而使用 Ansible 来配置。想象一下如果有一台全新的 Ubuntu,可以通过一行配置,在几分钟之内就可以恢复到一个可用的环境,这远比维护很多 bash 脚本来的方便。
Terraform 是什么
[[Terraform]] 是一个安全有效地构建、更改和版本控制基础设施的工具(基础架构自动化的编排工具)。Terraform 由 HashiCorp 创立并开源,Terraform 提倡「基础架构即代码」的哲学。它的口号是「Write,Plan,and Create Infrastructure as Code」。
Terraform 是一种声明式编码工具,让开发人员通过 HCL(HashiCorp 配置语言)来描述运行应用程序的最终状态环境。
Terraform is a tool to express the nuts of bolts of infrastructure as code. Think VMs, load balancers, storage, DNS, etc defined as code and stored in versioned source control.
Terraform 的优点
- Multi-Cloud
- Stateful
- Version Controlled
- Declarative
- Manual Click-Ops
- Save Money
- Disaster Recovery
- Minimize user error
Terraform 解决了什么问题
在没有 Terraform 之前,运维人员需要手动定位对基础硬件进行管理,在有了 Terraform 之后运维人员也可以通过文本来定义硬件资源的分配,并让 Terraform 去管理资源的分配问题。
Terraform 特点:
- 开源
- 并发,效率高
- HCL 配置预发,使得基础设施的控制可以和代码一样管理,共享和重用
- planning 步骤会生成执行计划,调用时会显示所有操作,避免人为误操作
- 硬件资源分配问题
- 平台无关,可以配合任何云服务提供商
- 不可变基础架构
Terraform 安装
Ubuntu:
sudo apt install terraform
Ubuntu 下安装:
sudo wget https://releases.hashicorp.com/terraform/0.12.18/terraform_0.12.18_linux_amd64.zip
sudo unzip terraform_0.12.18_linux_amd64.zip
sudo mv terraform /usr/local/bin/
macOS:
brew install terraform
安装完成后命令是 terraform。常用的是 terraform init, terraform plan, terraform apply
更多安装方式可以参考官网
Terraform 配置
Terraform 的配置文件以 .tf 为后缀,配置文件有两种格式:
- JSON,以
.tf.json结尾 - Terraform,Terraform 格式支持注释,通常更加可读,推荐,以
.tf结尾
配置文档
Terraform 配置,将按照字母顺序加载指定目录中的配置文件。
配置举例:
provider "aws" {
region = "us-east-1"
access_key = "your-access-key-here"
secret_key = "your-secret-key-here"
}
resource "aws_s3_bucket" "b" {
bucket = "my-tf-test-bucket"
acl = "private"
tags = {
Name = "My bucket"
Environment = "Dev"
}
}
provider 部分指定了使用什么 provider,通过指定 access_key 和 secret_key 来访问资源。
aws_s3_bucket 表示的是配置 S3 Bucket 资源,更多的资源配置方式可以参考这里
如果指定的 my-tf-test-bucket 不存在的话,terraform apply 会创建。
terraform init
在执行 apply 等命令之前需要先初始化工作目录:
terraform init
执行后,会在当前目录中生成 .terraform 目录,并按照 *.tf 文件中的配置下载插件。
terraform plan
可以使用 terraform plan 命令预览执行计划。
terraform apply
执行 terraform apply 会根据配置应用,并生效。
工作目录设定
Terraform 执行时会读取所有 *.tf 命令
provider.tf -- provider 配置
terraform.tfvars -- 配置 provider 要用到的变量
varable.tf -- 通用变量
resource.tf -- 资源定义
data.tf -- 包文件定义
output.tf -- 输出
HCL
Terraform 配置语法称为 HashiCorp 配置语言,简称 HCL。 语法说明可以参考如下: https://www.terraform.io/docs/configuration/syntax.html
示例:
# An AMI
variable "ami" {
description = "the AMI to use"
}
/* A multi
line comment. */
resource "aws_instance" "web" {
ami = "${var.ami}"
count = 2
source_dest_check = false
connection {
user = "root"
}
}
http://hashivim.github.io/vim-terraform/
可以安装 hashivim/vim-terraform 插件,在 Vim 中实现 HCL 语法加亮。写好的 *.tf 文件后可以调用 terraform fmt 对配置文件进行格式化。
延伸
- awesome-terraform
- [[Terraform]]
- [[OpenTofu]]