跳到主要内容

Terraform 速查表

常用命令

基础命令

命令说明
terraform init初始化工作目录,下载 Provider 插件
terraform validate验证配置文件的语法
terraform plan预览将要执行的变更
terraform apply应用配置,创建或更新资源
terraform destroy销毁所有管理的资源
terraform refresh刷新状态文件,同步实际资源状态
terraform show显示当前状态或计划详情
terraform version显示 Terraform 版本

状态管理命令

命令说明
terraform state list列出所有管理的资源
terraform state show <资源>显示特定资源的详细状态
terraform state rm <资源>从状态中移除资源(不销毁实际资源)
terraform state mv <旧名> <新名>重命名或移动状态中的资源
terraform state pull下载并输出当前状态
terraform state push <文件>上传状态文件
terraform import <资源> <ID>将现有资源导入 Terraform 管理
terraform force-unlock <ID>强制解锁状态

工作区命令

命令说明
terraform workspace list列出所有工作区
terraform workspace new <名称>创建新工作区
terraform workspace select <名称>切换到指定工作区
terraform workspace show显示当前工作区
terraform workspace delete <名称>删除工作区

格式化命令

命令说明
terraform fmt格式化当前目录的配置文件
terraform fmt -recursive递归格式化所有配置文件
terraform fmt -check检查格式是否正确(不修改文件)
terraform fmt -diff显示格式变更的差异

HCL 语法速查

基本语法

# 单行注释
/* 多行注释 */

# 块定义
block_type "label1" "label2" {
argument_name = argument_value
}

# 变量引用
var.variable_name
local.local_name
module.module_name.output_name
resource.resource_type.resource_name.attribute

数据类型

# 字符串
"hello world"
"hello ${var.name}"
<<EOF
多行
字符串
EOF

# 数字
42
3.14

# 布尔值
true
false

# 列表
["a", "b", "c"]

# 映射
{
key1 = "value1"
key2 = "value2"
}

# null
null

常用函数

字符串函数

upper("hello")              # "HELLO"
lower("WORLD") # "world"
substr("hello", 0, 3) # "hel"
join("-", ["a", "b"]) # "a-b"
split(",", "a,b,c") # ["a", "b", "c"]
replace("hello", "l", "x") # "hexxo"
format("%s-%d", "test", 1) # "test-1"

数字函数

max(1, 5, 3)      # 5
min(1, 5, 3) # 1
ceil(1.2) # 2
floor(1.8) # 1
abs(-10) # 10

集合函数

length(["a", "b"])          # 2
concat(["a"], ["b"]) # ["a", "b"]
distinct(["a", "a", "b"]) # ["a", "b"]
contains(["a", "b"], "a") # true
keys({a=1, b=2}) # ["a", "b"]
values({a=1, b=2}) # [1, 2]
merge({a=1}, {b=2}) # {a=1, b=2}

类型转换函数

tostring(123)         # "123"
tonumber("123") # 123
tobool("true") # true
tolist([1, 2, 3]) # [1, 2, 3]
tomap({a=1}) # {a=1}

文件函数

file("script.sh")           # 读取文件内容
filebase64("file") # Base64 编码文件内容
fileexists("file") # 检查文件是否存在
filemd5("file") # 计算文件 MD5
templatefile("template.tmpl", {var = "value"})

编码函数

jsonencode({a=1})           # '{"a":1}'
jsondecode('{"a":1}') # {a=1}
yamlencode({a=1}) # "a: 1\n"
yamldecode("a: 1") # {a=1}
base64encode("text") # "dGV4dA=="
base64decode("dGV4dA==") # "text"

路径函数

path.module           # 当前模块路径
path.root # 根模块路径
path.cwd # 当前工作目录

时间和哈希函数

timestamp()           # 当前时间戳
uuid() # 生成 UUID
md5("text") # 计算 MD5
sha256("text") # 计算 SHA256

配置块速查

terraform 块

terraform {
required_version = ">= 1.0"

required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}

backend "s3" {
bucket = "my-terraform-state"
key = "terraform.tfstate"
region = "us-east-1"
encrypt = true
dynamodb_table = "terraform-locks"
}
}

provider 块

provider "aws" {
region = "us-east-1"

default_tags {
tags = {
Environment = "Production"
}
}
}

# 别名 Provider
provider "aws" {
alias = "west"
region = "us-west-2"
}

resource 块

resource "aws_instance" "web" {
ami = "ami-12345678"
instance_type = "t2.micro"

tags = {
Name = "WebServer"
}

lifecycle {
create_before_destroy = true
prevent_destroy = false
ignore_changes = [tags]
}
}

data 块

data "aws_ami" "amazon_linux" {
most_recent = true
owners = ["amazon"]

filter {
name = "name"
values = ["amzn2-ami-*"]
}
}

variable 块

variable "instance_type" {
description = "EC2 实例类型"
type = string
default = "t2.micro"
sensitive = false

validation {
condition = contains(["t2.micro", "t2.small"], var.instance_type)
error_message = "无效的实例类型。"
}
}

output 块

output "instance_ip" {
description = "实例 IP 地址"
value = aws_instance.web.public_ip
sensitive = false
}

locals 块

locals {
common_tags = {
Environment = var.environment
ManagedBy = "Terraform"
}

name_prefix = "${var.project}-${var.environment}"
}

module 块

module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "~> 5.0"

name = "my-vpc"
cidr = "10.0.0.0/16"
}

表达式速查

字符串插值

name = "${var.project}-${var.environment}"

条件表达式

instance_type = var.environment == "prod" ? "t2.large" : "t2.micro"
count = var.enabled ? 1 : 0

for 表达式

# 列表推导
[for s in var.subnets : s.cidr_block]
[for s in var.subnets : s.name if s.public]

# 映射推导
{for s in var.subnets : s.name => s.cidr_block}
{for s in var.subnets : s.name => s.cidr_block if s.public}

解构表达式

# 展开操作符
security_groups = [aws_security_group.web.id, aws_security_group.app.id]
all_groups = concat(local.base_groups, var.additional_groups)

# 星号操作符
instance_ips = aws_instance.web[*].public_ip

版本约束

约束含义
= 1.2.3精确匹配 1.2.3
!= 1.2.3排除 1.2.3
> 1.2.3大于 1.2.3
>= 1.2.3大于或等于 1.2.3
< 1.2.3小于 1.2.3
<= 1.2.3小于或等于 1.2.3
~> 1.2.3兼容版本(>= 1.2.3, < 1.3.0)
~> 1.2兼容版本(>= 1.2.0, < 2.0.0)
>= 1.0, < 2.0版本范围

变量类型

# 基本类型
string
number
bool

# 集合类型
list(<TYPE>)
set(<TYPE>)
map(<TYPE>)
object({<ATTR_NAME> = <TYPE>, ...})
tuple([<TYPE>, ...])

# 示例
variable "tags" {
type = map(string)
}

variable "subnets" {
type = list(object({
name = string
cidr = string
public = bool
}))
}

环境变量

变量说明
TF_LOG日志级别(TRACE, DEBUG, INFO, WARN, ERROR)
TF_LOG_PATH日志文件路径
TF_VAR_<name>设置变量值
TF_CLI_ARGS全局 CLI 参数
TF_CLI_ARGS_<command>特定命令的 CLI 参数
TF_DATA_DIR数据目录(默认 .terraform)
TF_WORKSPACE当前工作区
TF_IN_AUTOMATION自动化模式标志

常用 Provider 配置

AWS

provider "aws" {
region = "us-east-1"

default_tags {
tags = {
Environment = "Production"
ManagedBy = "Terraform"
}
}
}

阿里云

provider "alicloud" {
region = "cn-hangzhou"
}

Azure

provider "azurerm" {
features {}
}

Google Cloud

provider "google" {
project = "my-project"
region = "us-central1"
}

Kubernetes

provider "kubernetes" {
config_path = "~/.kube/config"
}

Docker

provider "docker" {
host = "unix:///var/run/docker.sock"
}

生命周期元参数

resource "aws_instance" "web" {
lifecycle {
# 创建新资源后再销毁旧资源
create_before_destroy = true

# 防止资源被销毁
prevent_destroy = true

# 忽略特定属性的变更
ignore_changes = [
tags,
user_data
]

# 替换资源时触发的条件
replace_triggered_by = [
aws_security_group.web.id
]
}
}

动态块

resource "aws_security_group" "example" {
name = "example-sg"

dynamic "ingress" {
for_each = var.ingress_rules
content {
from_port = ingress.value.port
to_port = ingress.value.port
protocol = ingress.value.protocol
cidr_blocks = ingress.value.cidr_blocks
}
}
}

远程状态数据源

data "terraform_remote_state" "vpc" {
backend = "s3"

config = {
bucket = "terraform-state"
key = "vpc/terraform.tfstate"
region = "us-east-1"
}
}

# 使用远程状态
vpc_id = data.terraform_remote_state.vpc.outputs.vpc_id

故障排除

启用调试日志

export TF_LOG=DEBUG
export TF_LOG_PATH=terraform.log
terraform apply

常见错误处理

# 状态锁定
terraform force-unlock <LOCK_ID>

# 资源导入
terraform import aws_instance.web i-1234567890abcdef0

# 状态修复
terraform state rm aws_instance.web
terraform import aws_instance.web i-1234567890abcdef0

# 刷新状态
terraform refresh

推荐工具

工具用途安装
tflint代码检查brew install tflint
tfsec安全扫描brew install tfsec
checkov合规性检查pip install checkov
terraform-docs文档生成brew install terraform-docs
terragruntTerraform 包装器brew install terragrunt
tfenv版本管理brew install tfenv

官方资源