基础设施即代码(IaC)的核心是让云资源像应用代码一样被声明、评审、版本化。Terraform是目前应用最广的IaC工具,通过HCL语言声明资源最终状态,再由provider自动完成创建、更新、销毁。本文从工作流、资源编排、状态文件管理和变更控制四个维度说明落地方法。
Terraform工作流:声明、计划、应用
Terraform的工作流程固定在三个命令:terraform init加载provider插件;terraform plan读取配置并与真实状态比对,生成变更计划,变更清单在apply之前完整展示,这是它比脚本化创建更安全的关键;terraform apply执行变更。销毁使用terraform destroy,但正式环境要设置protect与删除保护,避免误操作清空生产资源。
# 简单的主机声明示例(以阿里云为例)
provider "alicloud" {
region = "cn-hangzhou"
}
resource "alicloud_instance" "web" {
instance_name = "prod-web-01"
instance_type = "ecs.g7.large"
image_id = "aliyun_2_1903_x64_20G_alibase"
vswitch_id = alicloud_vswitch.main.id
security_groups = [alicloud_security_group.web.id]
}
resource "alicloud_security_group" "web" {
name = "prod-web-sg"
rules = [
{ port = 80, cidr = "0.0.0.0/0" },
{ port = 22, cidr = "10.0.0.0/8" }
]
}
资源的声明顺序不代表执行顺序,Terraform通过依赖图解析资源间的引用关系,alicloud_instance.web里的vswitch_id与security_groups引用了其他资源的属性,plan阶段会自动排序执行。
状态文件管理:多人协作的安全底座
terraform.state记录资源ID与实际属性的映射,是Terraform的命脉。默认存本地terraform.tfstate文件,多人协作时必须迁移到远程后端,推荐对象存储加版本控制,配合后端自带锁,才能避免两人同时执行导致状态错乱。常见配置:
terraform {
backend "s3" {
bucket = "tf-state-prod"
key = "prod/network.tfstate"
region = "ap-northeast-1"
encrypt = true
dynamodb_table = "tf-lock"
}
}
状态文件里的属性可能包含敏感字段,开启加密存储、限制桶策略仅允许运维账号读写,同时配置state校验、必要时用terraform state list、terraform state rm等命令进行状态手术,所有状态操作要遵循变更评审流程。
资源变更与风险控制
生产变更风险集中在两个环节:其一,Terraform删掉手改的资源,一旦资源脱离管理,必须用terraform import把资源纳入状态,直接重写会重建;其二,磁盘、数据库等有状态资源,变更计划会提示销毁重建,此时在resource上配置lifecycle的prevent_destroy属性。
resource "alicloud_db_instance" "db" {
lifecycle {
prevent_destroy = true
}
}
terraform plan生成的变更清单要纳入代码评审,实施变更先在staging环境验证,生产环境apply前用-drive-run预演,配合CI流水线自动化发布,同时保留历史版本以便回滚。
模块化与团队规范落地
规模变大后,把共享资源抽成模块(module),模块内保持输入输出契约稳定。目录结构按环境拆,prod/staging/dev各自独立后端,避免跨环境状态污染。标签规范统一,便于成本分摊。团队内约定provider版本锁定、terraform版本约束,防止不同机器生成不同的变更计划。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/terraform-ji-chu-she-shi-ji-dai-ma-shi-zhan-yun-zi-yuan/