news 2026/10/21 7:43:00

Terraform

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Terraform

一、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) 在云平台和其他服务上创建和管理资源。

优势:

  1. 声明式配置:你定义最终想要的基础设施状态,而不是编写具体执行步骤。

  2. 可重复部署:相同配置可创建开发、测试、生产环境,保证一致性。

  3. 执行计划 (plan):生成操作清单,显示 Terraform 将对基础设施做哪些更改,避免意外。

  4. 模块化:

    • 可将常用代码封装成模块。
    • 提高可读性和复用性。
    • Google Cloud 提供官方模块和蓝图示例。
  5. 状态管理:

    • Terraform 通过状态文件记录资源的实际状态。

    • 状态文件是 JSON 格式,映射配置文件与实际资源。

三、Terraform工作流程

  1. 定义配置:使用 Terraform 配置文件描述要创建的 Google Cloud 资源。
  2. 生成执行计划:会创建一个执行计划,根据现有基础设施和您的配置来描述它将创建、更新或销毁的基础设施,查看 Terraform 将执行的操作(创建、更新、删除)terraform plan
  3. 应用配置:调用 Google Cloud API 创建/更新资源。更新 Terraform 状态文件。terraform apply
  4. 后续变更:再次运行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}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/21 7:42:49

生成式创作工具怎么选?四大AI图像视频工具对比

最近朋友要出一套系列概念海报&#xff0c;八张图&#xff0c;画面各不相同但整体气质必须统一。他在几个生成工具之间来回纠结&#xff0c;跑来问我怎么选。我给他比了一圈&#xff0c;最后发现真正值得放在一起反复琢磨的&#xff0c;其实就四个名字&#xff1a;ComfyUI、Day…

作者头像 李华
网站建设 2026/10/21 7:41:25

APF谐波抑制策略:PI+重复控制Simulink仿真建模全流程解析

在电能质量治理这个行当干了这些年&#xff0c;三相整流设备带来的谐波问题一直是块硬骨头。前阵子把基于PI重复控制的有源滤波器&#xff08;APF&#xff09;谐波抑制策略在Simulink里完整搭了一遍&#xff0c;从检测环节到复合控制器再到主电路联动&#xff0c;整个过程踩了不…

作者头像 李华
网站建设 2026/10/21 7:40:10

LeetCode数组与排序刷题指南:双指针与哈希表核心模板

刷LeetCode的数组和排序题&#xff0c;可以说是每一个准备面试、打算法基础的人绕不开的起点。我当年就是从这两块开始&#xff0c;一点点把“看到题目脑子里一片空白”的状态磨成了“先想到暴力解&#xff0c;再想到优化点”的思维习惯。数组题看似简单&#xff0c;但它几乎覆…

作者头像 李华
网站建设 2026/10/21 7:40:10

HTTPS证书部署全指南:现状、常见坑与系统化检查方法

“重新检查你的证书”这句话&#xff0c;听起来像是系统提醒&#xff0c;但我更愿意把它当成一种职业习惯。做网站运维和前后端开发这些年&#xff0c;HTTPS证书部署是我见过“出事概率”最高的隐形故障源&#xff1a;平时没人注意&#xff0c;一旦过期或配置错误&#xff0c;几…

作者头像 李华
网站建设 2026/10/21 7:40:08

MCP协议:AI安全调用私有API与数据库的工程实践

1. 为什么“让AI调用我的API”这件事&#xff0c;突然变得又急迫又危险&#xff1f;最近两周&#xff0c;我连续被三位不同行业的开发者朋友拉进紧急会议。不是因为线上服务崩了&#xff0c;也不是数据库慢得像蜗牛&#xff0c;而是他们各自在内部测试一个“AI助手”时&#xf…

作者头像 李华
网站建设 2026/10/21 7:39:46

模板方法模式详解:父类定流程,子类补细节

1. 同样一段流程写三遍之后&#xff0c;我开始认真琢磨模板方法先说个背景。这是我设计模式学习笔记的第15篇&#xff0c;标题里写的是"模版方法模式"&#xff0c;规范叫法其实是"模板方法模式"——我当年也经常写错&#xff0c;慢慢才习惯。编号23-13&…

作者头像 李华