Terraform 基础设施即代码教程
Terraform 是由 HashiCorp 开发的基础设施即代码(Infrastructure as Code,IaC)工具,它允许你用声明式的配置文件来定义和管理基础设施资源。无论是云服务器、网络、DNS 还是数据库,都可以通过代码来创建、修改和版本控制。本文将在搬瓦工 VPS 上安装 Terraform 并讲解核心概念和实践。
一、安装 Terraform
1.1 Ubuntu/Debian 安装
apt update
apt install -y gnupg software-properties-common
wget -O- https://apt.releases.hashicorp.com/gpg | gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/hashicorp.list
apt update
apt install terraform -y
1.2 验证安装
terraform version
1.3 启用自动补全
terraform -install-autocomplete
source ~/.bashrc
二、Terraform 核心概念
- Provider:连接各种基础设施平台(AWS、GCP、Docker 等)的插件。
- Resource:要创建和管理的基础设施资源。
- State:Terraform 记录的当前基础设施状态。
- Plan:执行前预览将要进行的变更。
- Module:可复用的配置集合。
三、第一个 Terraform 项目
以使用 Docker Provider 为例,在搬瓦工 VPS 上管理容器:
3.1 创建项目目录
mkdir -p ~/terraform-demo && cd ~/terraform-demo
3.2 编写主配置文件
创建 main.tf:
terraform {
required_providers {
docker = {
source = "kreuzwerker/docker"
version = "~> 3.0"
}
}
}
provider "docker" {
host = "unix:///var/run/docker.sock"
}
resource "docker_image" "nginx" {
name = "nginx:alpine"
keep_locally = false
}
resource "docker_container" "nginx" {
name = "my-nginx"
image = docker_image.nginx.image_id
ports {
internal = 80
external = 8080
}
volumes {
host_path = "/opt/nginx/html"
container_path = "/usr/share/nginx/html"
}
restart = "always"
}
3.3 初始化项目
terraform init
此命令会下载所需的 Provider 插件。
3.4 预览变更
terraform plan
Terraform 会显示将要创建的资源,但不实际执行。
3.5 应用变更
terraform apply
输入 yes 确认后,Terraform 将创建 Docker 容器。
3.6 查看状态
terraform show
terraform state list
四、变量与输出
4.1 定义变量
创建 variables.tf:
variable "container_name" {
description = "容器名称"
type = string
default = "my-nginx"
}
variable "external_port" {
description = "外部端口"
type = number
default = 8080
}
variable "environment" {
description = "运行环境"
type = string
default = "production"
validation {
condition = contains(["development", "staging", "production"], var.environment)
error_message = "环境必须是 development、staging 或 production。"
}
}
4.2 定义输出
创建 outputs.tf:
output "container_id" {
description = "容器 ID"
value = docker_container.nginx.id
}
output "container_name" {
description = "容器名称"
value = docker_container.nginx.name
}
output "access_url" {
description = "访问地址"
value = "http://localhost:${var.external_port}"
}
4.3 使用变量文件
创建 terraform.tfvars:
container_name = "web-server"
external_port = 80
environment = "production"
五、多资源管理
创建一个包含 Nginx + Redis 的基础设施配置:
resource "docker_network" "app_network" {
name = "app-network"
}
resource "docker_container" "redis" {
name = "app-redis"
image = docker_image.redis.image_id
networks_advanced {
name = docker_network.app_network.name
}
restart = "always"
}
resource "docker_image" "redis" {
name = "redis:7-alpine"
}
resource "docker_container" "app" {
name = "app-web"
image = docker_image.nginx.image_id
ports {
internal = 80
external = var.external_port
}
networks_advanced {
name = docker_network.app_network.name
}
depends_on = [docker_container.redis]
restart = "always"
}
六、状态管理
6.1 状态文件
Terraform 默认将状态存储在本地的 terraform.tfstate 文件中。在团队协作时,建议使用远程后端:
terraform {
backend "s3" {
bucket = "my-terraform-state"
key = "prod/terraform.tfstate"
region = "us-east-1"
}
}
6.2 状态常用操作
# 查看状态中的资源
terraform state list
# 查看特定资源详情
terraform state show docker_container.nginx
# 从状态中移除资源(不删除实际资源)
terraform state rm docker_container.nginx
# 导入已有资源到状态
terraform import docker_container.nginx container_id
七、销毁资源
# 预览将要销毁的资源
terraform plan -destroy
# 执行销毁
terraform destroy
八、常见问题
Provider 下载慢
可以配置 Provider 镜像源,创建 ~/.terraformrc:
provider_installation {
network_mirror {
url = "https://mirrors.tencent.com/terraform/"
}
direct {
exclude = []
}
}
状态锁定冲突
如果遇到状态锁定问题,可以强制解锁(谨慎使用):
terraform force-unlock LOCK_ID
资源变更导致重建
使用 lifecycle 控制资源行为:
resource "docker_container" "app" {
# ...
lifecycle {
create_before_destroy = true
prevent_destroy = false
ignore_changes = [image]
}
}
总结
Terraform 是管理基础设施的强大工具,通过代码定义基础设施实现了可重复、可审计、可版本控制的运维流程。在搬瓦工 VPS 上结合 Docker Provider 可以优雅地管理容器化应用。选购搬瓦工 VPS 请参考 全部方案,使用优惠码 NODESEEK2026 享受 6.77% 折扣。