一、IaC基础概念
基础设施即代码 (IaC):使用配置文件而非图形用户界面来管理基础设施
优势:
- 自动化和可重复:同一配置可多次部署,确保环境一致。
- 版本控制:基础设施配置可以像代码一样审查、回滚。
- 可集成 CI/CD 流程:基础设施变更可自动化管理。
- 单一可靠来源:所有配置都统一管理,减少人为错误。
主要使用 Terraform
- 使用HashiCorp Terraform配置 Google Cloud 资源。
- 支持版本控制、共享和复用配置。
- 可以通过Terraform CLI预配和管理资源。
二、Terraform概念
学习文档:https://developer.hashicorp.com/terraform/docs
官网资料文档:https://developer.hashicorp.com/terraform/language/providers
模板仓库:https://registry.terraform.io/browse/modules
HashiCorp Terraform是一款基础设施即代码 (IaC) 工具,它允许您使用易于阅读的配置文件定义云端和本地资源,这些配置文件可以进行版本控制、重用和共享。Terraform 通过应用程序编程接口 (API) 在云平台和其他服务上创建和管理资源。
优势:
声明式配置:你定义最终想要的基础设施状态,而不是编写具体执行步骤。
可重复部署:相同配置可创建开发、测试、生产环境,保证一致性。
执行计划 (plan):生成操作清单,显示 Terraform 将对基础设施做哪些更改,避免意外。
模块化:
- 可将常用代码封装成模块。
- 提高可读性和复用性。
- Google Cloud 提供官方模块和蓝图示例。
状态管理:
Terraform 通过状态文件记录资源的实际状态。
状态文件是 JSON 格式,映射配置文件与实际资源。
三、Terraform工作流程
- 定义配置:使用 Terraform 配置文件描述要创建的 Google Cloud 资源。
- 生成执行计划:会创建一个执行计划,根据现有基础设施和您的配置来描述它将创建、更新或销毁的基础设施,查看 Terraform 将执行的操作(创建、更新、删除)
terraform plan - 应用配置:调用 Google Cloud API 创建/更新资源。更新 Terraform 状态文件。
terraform apply - 后续变更:再次运行
terraform apply,更新与创建资源
使用 Terraform 部署基础设施:
- 范围- 确定项目的基础设施。
- 作者- 编写基础架构的配置。
- 初始化-安装 Terraform 管理基础设施所需的插件。
- 计划- 预览 Terraform 将根据您的配置所做的更改。
- 执行——进行计划中的更改。
四、Terraform快速入门
https://developer.hashicorp.com/terraform/tutorials/gcp-get-started/google-cloud-platform-build
需要身份验证
gcloud auth application-default下载Terraform并解压配置环境变量 :https://developer.hashicorp.com/terraform/install
创建main.tf的文件,写入
# Google Provider 配置provider"google"{project="your-gcp-project-id"# 替换成你的 GCP 项目 IDregion="us-central1"# 区域,例如 us-central1zone="us-central1-a"# 可用区,例如 us-central1-a}# VPC 网络配置resource"google_compute_network""vpc_network"{#资源类型:google_compute_network 内部标识符:vpc_network(内部引用这个资源使用的)name="my-vpc-network"# VPC 网络在 GCP 上的名字auto_create_subnetworks=true# 自动创建子网(默认每个区域一个)}# 防火墙规则resource"google_compute_firewall""allow_ssh_http_https"{name="allow-ssh-http-https"# 防火墙规则名字network=google_compute_network.vpc_network.name# 关联到上面创建的网络# 允许的协议和端口allow{protocol="tcp"ports=["22","80","443"]# 22: SSH, 80: HTTP, 443: HTTPS}# 来源 IP 范围source_ranges=["0.0.0.0/0"]# 允许任何 IP 访问}# 静态公网 IPresource"google_compute_address""static_ip"{name="my-static-ip"# 静态 IP 名称region="us-central1"# 区域必须和 VM 匹配}# Compute Engine VM 配置resource"google_compute_instance""default"{name="my-vm"# GCP 上虚拟机名字machine_type="n1-standard-1"# 机器类型(CPU/内存配置)zone="us-central1-a"# 所属可用区# 标签(用于资源管理和计费)labels={environment="dev"# 环境标签team="devops"# 团队标签}# 启动磁盘配置boot_disk{initialize_params{image="ubuntu-minimal-2210-kinetic-amd64-v20230126"# 系统镜像size=20# 磁盘大小,单位 GBtype="pd-standard"# 磁盘类型:标准持久磁盘}}# 网络接口配置network_interface{network=google_compute_network.vpc_network.name# 关联网络subnetwork=null# 使用自动子网# 使用静态公网 IPaccess_config{nat_ip=google_compute_address.static_ip.address}}# 元数据(可执行启动脚本)metadata={startup-script=<<-EOT#!/bin/bashapt-getupdateapt-getinstall-ynginx systemctlenablenginx systemctl start nginx EOT}# 服务账户(VM 权限)service_account{email="default"# 使用默认服务账户scopes=["https://www.googleapis.com/auth/cloud-platform"]# 访问 GCP 全部 API 权限}# 生命周期设置lifecycle{create_before_destroy=true# 更新资源时先创建新资源,再销毁旧资源,保证不中断}}# 输出 VM 公网 IPoutput"instance_ip"{value=google_compute_address.static_ip.address description="VM 使用的静态公网 IP"}terraform init#初始化项目,下载程序需要的包(三方依赖)terraform plan#验证 main.tf 的语法是否正确,显示将要创建的资源的预览terraform apply#应用配置以预配 main.tf 文件中描述的资源terraform destroy#删除 Terraform 资源--------- terraformfmt#以标准样式格式化配置terraform validate#检查配置是否有效terraform show#查看状态terraform state list#列出所有资源五、目录结构与命令规范
标准模块结构:
├─ main.tf # 模块主要资源 ├─ variables.tf # 变量定义 ├─ outputs.tf # 输出 ├─ README.md # 模块文档 ├─ examples/ # 示例配置,每个示例一个子目录 ├─ docs/ # 其他文档 ├─ scripts/ # Terraform 调用的脚本 ├─ helpers/ # 辅助脚本 ├─ files/ # 静态文件(未执行,如启动脚本) ├─ templates/ # Terraform templatefile 模板(.tftpl) └── modules/ # 模块化目录模块(module) = 复用的 Terraform 配置
好处:别人写好了、你直接引用即可
官方模块库:https://registry.terraform.io/browse/modules
资源文件组织:
- 按逻辑组而非每个资源一个文件,例如:
network.tf:所有网络相关资源instances.tf:所有实例
配置对象用下划线分隔:web_server
定义位置:在variables.tf中
说明:每个变量必须有description,用于文档生成。
在outputs.tf中定义 输出值应引用资源特性
限制自定义脚本:
- 仅在 Terraform 不支持功能时使用。
- 放在
scripts/目录并有文档说明。
辅助脚本放在helpers/。
静态文件放在files/。
模板文件放在templates/,扩展名.tftpl。
对数据库等有状态资源启用prevent_destroy:
lifecycle{prevent_destroy=true}