terraform
Terraform 是 HashiCorp 出品的开源基础设施即代码(Infrastructure as Code, IaC)工具。用户可通过声明式配置语言 HCL(HashiCorp Configuration Language)编写代码,描述如云服务(AWS、Azure、GCP)、本地环境、Kubernetes 集群等各类基础设施资源,并通过命令行高效自动化地创建、变更和管理这些资源。
核心特性:
- 多平台支持:兼容主流云厂商、本地虚拟化、Kubernetes 等生态。
- 声明式配置:聚焦于最终期望状态,具体变更细节由 Terraform 自动推导与执行。
- 代码可审计:基础设施配置可纳入版本控制(如 Git),实现历史追踪与变更回滚。
- 自动管理依赖:自动分析资源依赖关系,按需有序创建/销毁。
- 模块化复用:支持自定义或社区模块,提升资源复用与可维护性。
Terraform 已广泛应用于 DevOps、云原生、自动化运维等领域,是实现基础设施自动化与一致性的关键工具。
常用命令速查
terraform init
初始化当前目录,下载 provider 插件与模块。每次 provider、模块变更后需重新执行。
可用--plugin-dir
参数指定本地插件目录。terraform plan
生成并展示变更执行计划,只预览不实际操作。terraform apply
执行 plan 阶段的变更,创建/修改/销毁资源。-auto-approve
可自动跳过交互确认。terraform destroy
一键销毁所有受管资源,操作需谨慎。
可配合-auto-approve
实现自动化。
建议:
- 每次变更(增删资源、provider 升级等)建议先
init
,再plan
,确认无误后apply
。- 生产环境强烈建议启用远程状态存储和 state 锁,避免多人冲突。
terraform import
将已有基础设施资源纳入 Terraform 管理,无需重建。
用法:terraform import ADDRESS ID
导入后建议执行terraform plan
核查与实际状态同步,并适当调整配置。terraform refresh
根据真实基础设施刷新本地 state 文件,保持一致性。terraform state list
列出现有 state 管理的所有资源地址。terraform state rm
从 state 中移除指定资源,仅影响 Terraform 管理,不实际删除资源。terraform state pull
拉取远程后端最新 state,常用于检查/备份。terraform state push
推送本地 state 到远程后端,常见于手动同步或恢复。
推荐目录结构
1 |
|
变量赋值方式与优先级
Terraform 支持多种变量赋值方式,优先级高→低如下:
- 命令行参数
terraform apply -var="key=value"
- 变量文件
terraform apply -var-file="xxx.tfvars"
- 环境变量
export TF_VAR_key=value
- 变量默认值
- 在
variables.tf
中通过default
指定
- 在
- 交互式输入
- 执行时手动输入
提示: 多种方式并存时,优先级高的覆盖低的。
表达式与函数实用笔记
- 基础表达式
- 属性引用:
var.name
、resource.type.name.attr
- 运算符:
!
,*
,/
,+
,-
,>=
,==
,!=
,&&
- 条件表达式:
condition ? true_val : false_val
- For 表达式:
[for s in var.list : upper(s)]
- Splat 表达式:
var.list[*].id
- 动态块:
dynamic "block" { ... }
- 属性引用:
- 约束与类型
- 变量类型约束、provider 版本约束等
- 常用内建函数
- 数值:
abs
、floor
、max
、min
、pow
- 字符串:
format
、join
、lower
、replace
、split
、substr
- 集合:
concat
、flatten
、merge
、sort
、tolist
- 编码:
base64encode
、jsonencode
、urlencode
- 文件系统:
abspath
、dirname
、basename
、file
、templatefile
- 时间日期:
timestamp
、formatdate
、timeadd
- 哈希加密:
sha1
、sha256
、md5
、uuid
- 类型转换:
tostring
、tomap
、tolist
、toset
- 数值:
详见官方文档:https://developer.hashicorp.com/terraform/language/functions
方案二:使用 Terraform Workspace 实现多环境隔离
1 |
|