嘿,我是 Bobby,一名 DevOps 工程师,并且是 《Terraform 入门电子书》 的作者。
在这篇文章里,我将分享五个我希望在刚开始使用Terraform时就了解的最佳实践,这五个实践是关于Terraform的。这些建议将帮助你编写更干净、更易维护的基础设施即代码,并避免可能导致部署麻烦的常见错误。
前提条件要跟上,你需要:
你应准备好。
- Terraform的基本知识
- 您系统上已安装的Terraform
如果你是刚接触 Terraform,我非常推荐你看我的《Terraform 入门指南》(这本书从基础讲起,一直到大规模基础设施管理),确保使用“Terraform”时都保持大写,以符合技术术语的习惯用法。
此处为空
始终使用远程状态存储默认而言,Terraform 将状态文件 (terraform.tfstate
) 存储在本地。但是,在实际项目中,这样做并不理想,因为:
- 本地状态文件可能会丢失,导致数据不一致的问题。
- 团队合作时需要一个共享状态以防止冲突。
- 如果状态文件没有得到妥善保护,敏感数据可能会泄露。
更好的做法是借助 Terraform Cloud、S3 等工具将您的状态存储在远程位置。
在 AWS S3 中存储 Terraform 状态示例
以下是一个Terraform配置示例,定义了S3后端的配置信息:
terraform {
backend "s3" {
bucket = "my-terraform-state" // 存储桶 = "my-terraform-state"
key = "state/terraform.tfstate" // 键 = "state/terraform.tfstate"
region = "us-east-1" // 区域 = "us-east-1"
encrypt = true // 加密 = true
dynamodb_table = "terraform-lock" // DynamoDB表 = "terraform-lock"
}
}
全屏模式, 退出全屏
这种设置:
- 将状态文件存放在 AWS S3 中。
- 对状态文件进行加密以确保安全。
- 使用 DynamoDB 进行状态锁定,防止同时更新。
💡 小贴士: 如果你在使用 Terraform Cloud,它自带远程状态存储和锁定机制。
此处省略此处省略内容……
使用模块保持代码简洁(DRY)最常见的 Terraform 错误之一是从一个项目复制粘贴 🍝 基础设施脚本到其他项目。相反,你应该这样做:使用 Terraform 模块来保持你的配置既可重用又易于维护。
比如说,不用为每个EC2实例重复写相同的代码,而是可以创建一个复用模块:
主模块目录结构示例:
modules/
ec2-instance/
main.tf
variables.tf
outputs.tf
点击这里切换到全屏模式,点击这里退出全屏
示例模块:简易的 EC2 模块 (main.tf
)
资源 "aws_instance" "web" {
ami = var.ami_id
instance_type = var.instance_type
标签 = {
名称 = var.name
}
}
进入全屏,退出全屏
然后,在你的主的 Terraform 配置文件中,你可以调用这个模块:
模块定义 "web_server" {
来源路径 = "./modules/ec2-instance"
ami_id = "ami-12345678"
instance_type = "t2.micro"
实例名称 = "web-server"
}
点击进入全屏模式 点击退出全屏模式
使用模块的好处有:包括
- 一次定义基础设施并多次使用。
- 只需修改单个模块,无需更新多个文件。
-
保持你的主要配置文件简洁清晰。
-
- *
在管理多个环境(例如开发、测试、生产)时,很多人最初会直接复制粘贴 Terraform 文件。这将导致配置漂移和不一致。
更好的方法是使用Terraform工作区,这样你可以用同一份代码管理不同的环境配置。
示例:切换工作空间
terraform workspace new 测试环境
terraform workspace list
terraform workspace select 测试环境
您可以进入全屏模式,也可以退出全屏模式。
您可以在 Terraform 配置文件中使用 terraform.workspace
。
定义一个名为 example 的 aws_s3_bucket 资源,桶名设置为 "my-app-${terraform.workspace}"。
// 注意:${terraform.workspace} 是 Terraform 工作区的占位符
进入全屏 退出全屏
这会根据工作区,如 my-app-dev
、my-app-staging
等,自动创建不同的 S3 存储桶。
💡 小贴士: 若你需要更复杂的环境配置,考虑使用独立的状态配置文件而不是工作区内的配置。
第 4 步 — 锁定提供者的版本以防止意外中断服务
Terraform 提供程序更新频繁,这些更新会引入不兼容的更改。如果不固定提供程序版本,运行 terraform apply
时,你的基础设施可能会突然无法运行。
例子:固定 Provider 版本
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0" # 锁定版本5
}
}
required_version = ">= 1.5.0"
}
点击这里进入全屏 点击这里退出全屏
这样一来:
通过这种方式:
- 你在运行 Terraform 命令时防止意外变更。
- 你的基础设施每次部署都能保持稳定。
💡 小贴士: 在将提供者版本更新到生产环境之前,最好先在单独的分支中测试更新。
在应用更改前使用 Terraform 进行 validate 和 format 检查(验证和格式化)
在运行 terraform apply
之前,最好先验证并格式化你的 Terraform 配置文件,以便尽早发现问题。
使用 terraform fmt
和 terraform validate
检查代码格式和验证
terraform fmt, 使代码自动格式化,使其更规范 #
terraform validate, 检查语法错误并确保代码正确无误 #
切换到全屏 退出全屏
也可以在 CI/CD 流水线中自动化此步骤,以确保代码的一致性。
name: Terraform CI
on: [push]
jobs:
validate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: 配置 Terraform
uses: hashicorp/setup-terraform@v1
- name: 验证 Terraform
run: terraform validate
切换到全屏模式 退出全屏模式
使用这些命令能确保...
- 你的 Terraform 代码符合最佳实践。
- 你在应用更改前就能发现问题。
-
你的团队使用统一的代码风格。
-
- *
Terraform配置经常需要API密钥、密码和数据库凭据。在.tf
文件中硬编码这些敏感信息存在重大安全隐患。
相反,建议使用环境变量或密钥管理工具。
环境变量示例
导出 TF_VAR_db_password="supersecretpassword" (设置数据库密码)
运行 terraform apply (应用配置)
切换到全屏模式,退出全屏
在 Terraform 中
variable "db_password" {}
resource "aws_db_instance" "example" {
password = var.db_password
}
全屏查看 退出全屏
更好的是,使用HashiCorp Vault或其他类似的密钥管理工具来安全地管理密钥。
总结
这些五个最佳实践:使用远程状态管理、利用模块、使用工作区、锁定提供器版本以及验证Terraform配置,将帮助你更高效地管理你的基础设施。
想深入了解Terraform的朋友,可以看看我的付费电子书(ebook):
👉 Terraform入门:
而且如果你正在 DigitalOcean 上搭建你的 Terraform 基础架构,你可以享受 $200 的免费信用额度 开始吧!
祝你地球改造愉快!🚀
共同学习,写下你的评论
暂无评论
作者其他优质文章