3. Terraform 安装与配置
在开始使用 Terraform 管理基础设施之前,必须完成安装、环境配置和基础命令熟悉。本章将引导你完成从下载到编写第一个 .tf 文件的完整流程,为后续构建 CI/CD 自助服务管道打下坚实基础。
3.1 下载与安装
Terraform 以单一二进制文件分发,支持主流操作系统。推荐从 HashiCorp 官方发布页面 获取最新稳定版本。
| 操作系统 | 安装方式 | 命令 / 步骤 |
|---|---|---|
| macOS (Homebrew) | 包管理器 | brew tap hashicorp/tap && brew install hashicorp/tap/terraform |
| Windows (Chocolatey) | 包管理器 | choco install terraform |
| Linux (Ubuntu/Debian) | APT 仓库 | wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpgsudo apt-add-repository "deb [arch=$(dpkg --print-architecture)] https://apt.releases.hashicorp.com $(lsb_release -cs) main"sudo apt-get update && sudo apt-get install terraform |
| 手动安装 (所有平台) | 下载 ZIP | 下载对应平台 ZIP → 解压 → 将 terraform 二进制文件放入 PATH 目录 |
💡 版本管理建议: 在 CI/CD 环境中,建议使用
tfenv (macOS/Linux) 或 tenv (Windows) 管理多个 Terraform 版本,确保管道与本地开发环境版本一致。
3.2 环境变量设置
Terraform 通过环境变量控制行为、配置 Provider 认证以及传递敏感信息。以下是最核心的变量:
TF_VAR_<变量名>:在命令行或 CI/CD 中注入输入变量,避免硬编码。TF_LOG:设置日志级别(TRACE、DEBUG、INFO、WARN、ERROR),调试时常用TF_LOG=DEBUG。TF_WORKSPACE:指定工作区名称,用于多环境隔离。TF_IN_AUTOMATION:设置为true时,Terraform 会调整输出格式,避免交互式提示,适合 CI/CD 管道。AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY:云 Provider 认证凭据(以 AWS 为例)。
⚠️ 安全警告: 永远不要将
TF_VAR_ 或云凭据硬编码在 .tf 文件中。在 CI/CD 中应使用 Secret 管理服务(如 GitHub Actions Secrets、GitLab CI Variables、HashiCorp Vault)注入环境变量。
3.3 CLI 基础命令
Terraform CLI 遵循 terraform <子命令> [选项] 结构。掌握以下命令即可完成日常操作:
| 命令 | 功能 | 典型使用场景 |
|---|---|---|
terraform init |
初始化工作目录,下载 Provider 插件和模块 | 每次克隆仓库或添加新 Provider 后执行 |
terraform validate |
检查配置文件语法和内部一致性 | 编写代码后快速验证 |
terraform plan |
预览将要执行的操作,生成执行计划 | CI/CD 中作为审核步骤 |
terraform apply |
执行计划,创建/更新/删除资源 | 部署基础设施 |
terraform destroy |
销毁所有由当前配置管理的资源 | 清理临时环境或测试资源 |
terraform fmt |
自动格式化 .tf 文件为标准风格 |
代码审查前统一格式 |
terraform output |
查看定义的输出变量值 | CI/CD 中获取资源属性(如 IP 地址) |
terraform state list |
列出当前状态文件中管理的所有资源 | 排查状态与配置不一致问题 |
🔧 CI/CD 管道核心命令链:
terraform init -input=false → terraform validate → terraform plan -out=tfplan → terraform apply tfplan → terraform output -json
3.4 Terraform 配置文件结构 (.tf 文件)
Terraform 使用 HashiCorp Configuration Language (HCL) 编写配置文件,文件扩展名为 .tf。一个典型的 Terraform 项目包含以下文件结构:
project-root/
├── main.tf # 核心资源定义
├── variables.tf # 输入变量声明
├── outputs.tf # 输出值定义
├── terraform.tfvars # 变量赋值(敏感值应使用 .auto.tfvars 或环境变量)
├── providers.tf # Provider 配置(云平台、版本)
└── versions.tf # Terraform 和 Provider 版本约束
每个 .tf 文件由 块 (Block) 和 参数 (Argument) 组成。以下是各文件的核心内容示例:
providers.tf — 定义云平台连接
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
provider "aws" {
region = var.aws_region
}
main.tf — 声明基础设施资源
resource "aws_instance" "web_server" {
ami = var.ami_id
instance_type = var.instance_type
tags = {
Name = "CI-CD-Demo-Server"
Environment = var.environment
}
}
variables.tf — 定义可复用输入
variable "aws_region" {
description = "AWS 部署区域"
type = string
default = "us-east-1"
}
variable "instance_type" {
description = "EC2 实例规格"
type = string
}
outputs.tf — 暴露资源属性
output "instance_public_ip" {
description = "Web 服务器的公网 IP"
value = aws_instance.web_server.public_ip
}
📁 文件组织最佳实践: 在 CI/CD 自助服务场景中,建议按环境拆分目录(如
envs/dev/、envs/prod/),每个环境目录内包含独立的 terraform.tfvars 和 backend.tf,实现配置与环境的完全解耦。
3.5 验证安装与快速测试
完成安装后,执行以下命令验证环境:
# 检查版本
terraform --version
# 创建一个测试目录
mkdir terraform-test && cd terraform-test
# 创建最小配置文件
cat > main.tf <<EOF
terraform {
required_version = ">= 1.5"
}
resource "null_resource" "hello" {
provisioner "local-exec" {
command = "echo 'Terraform 安装配置成功!'"
}
}
EOF
# 初始化并应用
terraform init
terraform apply -auto-approve
✅ 验证成功标志: 终端输出
Terraform 安装配置成功!,且 .terraform 目录和 .terraform.lock.hcl 文件已生成。
3.6 常见安装问题与排查
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
command not found: terraform |
二进制文件未加入 PATH |
将 Terraform 所在目录添加到 ~/.bashrc 或 ~/.zshrc 的 PATH 中 |
Error: Inconsistent dependency lock file |
.terraform.lock.hcl 与当前 Provider 版本不匹配 |
删除 .terraform.lock.hcl 并重新执行 terraform init |
Error: No valid credential sources found |
云 Provider 认证环境变量未设置 | 检查 AWS_ACCESS_KEY_ID 等变量是否已导出,或配置 ~/.aws/credentials |
Error: Failed to query available provider packages |
网络无法访问 registry.terraform.io | 配置 HTTP 代理或使用 terraform providers mirror 离线同步 Provider |
⚠️ CI/CD 环境特别提醒: 在管道中执行
terraform init 时,务必添加 -input=false 和 -upgrade=false 参数,避免因交互式输入或意外升级 Provider 导致管道挂起或行为不一致。