GrowingIO Terraform 实践

Terraform入门到精通 Terraform 是一种开源的基础设施即代码(Infrastructure as Code,IaC)工具,由 HashiCorp 公司开发。它允许用户通过编写声明式的配置文件(通常是 HCL,即 HashiCorp 配置语言)来定义和管理云基础设施资源,从而实现基础设施的自动化部署、管理和更新。 阅读详情

背景

为满足 GrowingIO 客户多样性的需求,在公有云设施上使用 Terraform 作资源管理。采取 Terrform 具有以下相关优势:

  • 多云支持,主流云厂商均提供对应的Provider支持。
  • 自动化管理基础结构,可重复对资源进行编排使用。
  • 基础架构即代码(Infrastructure as Code),允许保存基础设施状态,便于追踪管理。
  • 统一的语法来管理不同的云服务,实现标准化管理。

Terraform 介绍

概念

Terraform是一个开源 IAS 工具,提供一致的 CLI工作流,可管理数百个云服务。 Terraform通过将云厂商提供的 API 编写为声明式配置文件,通过Terraform的命令行接口,可将资源调度配置应用到任意支持的云上,并实现版本控制。更多详情请参见HashiCorp Terraform。

Terraform通过不同的Provider来支持不同云平台。国外云服务商如 Azure, AWS, GoogleCloud, DigtalOcean,国内云服务商如 Aliyun, TencentCloud, Ucloud, BaiduCloud均有提供官方的 Provider。

架构

Terraform通过解析用户书写的HCL(HashiCorp Configuration Language)格式的DSL文件,然后通过Terraform core与各云厂商提供的Providers进行交互,从而进行相关资源的调度。各云厂商依HCL代码风格,将自家资源调用API重新封装,以生成对应的 Providers。

项目实践

项目设计

  • 客户项目存在多个同构环境,环境交付需要一致。
  • 每个环境中存在中多个项目,各项目对资源调度需求各异。
  • 每个项目需要使用EC2、ELB、EBS、 EMR等多种资源。

项目实现

项目结构

# tree -L 3 .
├── README.MD  
├── module
│   ├── app1
│   │   ├── config.tf
│   │   ├── locals.tf
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   └── variables.tf
│   ├── global
│   │   └── config.tf
└── dev
    ├── main.tf
    └── output.tf

目录结构拆解:

  • module中依项目名进行封装。其中 app1为项目名。
  • global为全局参数设置。
  • dev为各环境对 module的引用封装。

module细节:

  • config.tf为配置的相关参数,如 Providers的相关参数设定。
  • locals.tf为变量的计算生成与其它变量引用,如 module 的引用与一些复杂变量的重生成。
  • main.tf为 resource 与 data 相关的资源编排调用。
  • outputs.tf为项目输出值,如创建 ecs之后主机的 ip 等。
  • variables.tf 为传参的相关设置,如需创建 ecs的数量。

module 封装

module 的资源引用

在对资源调度的实施过程中,往往需要多次重复作业,故需将多个原子操作,统一封装成module,后续在外部引用module并传入对应参数即可。

apply构建文件代码:

# dev/main.tf
...
module "app1" {
  source                                 = "../module/app1"
  aws_ec2_create_number                  = 3
  ...
}

module 的条件判断

在 Terraform 中,往往将循环与判断结合使用,主要使用场景有两种:

  • 确认变量形式
  • 确认资源是否创建

如创建 ecs时的主机名设置,当创建多台主机时,主机名需数字后缀以区分,而只有一台主机时,不需要数字后缀。

相关实例代码如下:

# module/app1/main.tf
...
resource "aws_instance" "aws-ec2-create" {
  count = var.aws_ec2_create_number
	...
  tags = {
    Name = var.aws_ec2_create_number < 2 ? "${var.env}-${var.aws_ec2_name}" : "${var.env}-${var.aws_ec2_name}-${count.index + 1}"
	...
  }
...

如在ECS的创建之中,无法判断用户是否需要数据盘。

相关实例代码如下:

# module/app1/main.tf
...
resource "aws_instance" "aws-ec2-create" {
  count                = var.aws_ec2_create_number
  ...
  dynamic "ebs_block_device" {
    for_each = var.aws_ebs_block_device_volume_size != 0 ? [1] : []
    content {
      delete_on_termination = true
      device_name           = var.aws_ebs_block_device_name
      volume_size           = var.aws_ebs_block_device_volume_size
      volume_type           = var.aws_ebs_block_device_volume_type
    }
  }
  ...
}
...

当用户传入var.aws_ebs_block_device_volume_size的值为0时,即循环一个空列表,即不创建该资源,亦即不创建数据盘。

module 的复杂循环

在 Terraform中,循环主要依赖于count与for_each,这两种方法均只支持简单的循环,而for循环更多的是参与计算,并不会直接在resource中直接进行使用。

如在app1项目中,需要创建5台实例,同时实例需分布在不同的subnet之中,但subnet只有3个。在该情况下,我们无法简单的以subnet的id作循环,更为重要的是,如果后期 subnet的数量也可能会变化,所以无法固定循环列表。

对于复杂的循环需求,一般将其置于locals中作相关计算,其后在resource中进行引用 。

在locals中的计算,相关代码如下:

# module/app1/locals.tf
...

//case for the rc2 number is more than the number of zone for subnet
locals {
  times = ceil(var.aws_ec2_create_number / length(var.aws_subnet_id_list))
}

locals {
  // loop two list to generate a new list
  subnet_list_combine = flatten([
    for p in range(local.times) : [
      for q in var.aws_subnet_id_list : [join(",", [q])]
    ]
    ]
  )
}

...

通过在locals中的计算,我们可以得到一个名为subnet_list_combine的list,其后在resource中进行引用即可。

resource相关代码如下:

# module/app1/main.tf
...
resource "aws_network_interface" "aws-network-interface" {
  count           = var.aws_ec2_create_number
  subnet_id       = local.subnet_list_combine[count.index]
...

全局变量

在Terraform中,官方为了层级的简洁,默认不推荐使用全局变量,因为全局变量的设置,会出现所见非所得的现象,详见Terraform global variables

但在实际生产中,却有相关需求,如 aws_profile_name在每个项目中均一致,同时后期因为用户的 profile 设置不一致而需要统一变更。

我们可以将此类参数写入一个 module之中。

# module/global/config.tf
...
output "aws_profile_name" {
  value = "default"
}
...

在各项目中的module,再次对global的module作引用。

# module/application/locals.tf
...
// In order to make global variables --beginning
module "global" {
  source = "../global"
}

locals {
  ...
  aws_profile_name = module.global.aws_profile_name
}
// In order to make global variables --end
...

最后在项目中,作对应自身module的locals值作相关的引用。

# module/application/config.tf
...
Provider "aws" {
  profile = var.aws_profile_name == "" ? local.aws_profile_name :  var.aws_profile_name
  ...
}
...

环境隔离

在Terraform中,隔离一般有两种:

  • workspace隔离
  • 目录隔离

在 workspace隔离中,需要使用 terraform workspace子命令,与 git branch类似,但是 terraform workspace 中的隔离,并不直观,在生产中容易出现误操作,所以对于不同环境的 module调用,本项目中采用了目录隔离。

# dev/main.tf
...
module "app1" {
  source                                 = "../module/app1"
  aws_ec2_create_number                  = 3
  ...
}

# stage/main.tf
...
module "app1" {
  source                                 = "../module/app1"
  aws_ec2_create_number                  = 3
  ...
}

项目心得

Terraform 在基础资源编排中,使用方便,语法简洁,但由于各云厂商提供 Provider的风格并不完全统一,一定程度上增加了多云混合使用的成本。特别是对于国内非 AWS用户而言,国内部分云厂商提供的Provider,支持的资源种类相较于 AWS 偏少,部分场景可能无法实现。

同时也因为 Terraform的语法对于一些高级特性的支持欠缺,导致在部分复杂的场景中,有些捉襟见肘,而更多需要 Provider去提供对应功能。虽然有 module的设计,可以进行代码复用,但也有因部分参数无法动态区分,而不得不创建多个 module以区分,这点在国内云厂商提供的 Provider中尤为明显。

小结

本文简单介绍了Terraform的基本概念以及采用Terraform的原由。

同时例举了在生产实践中Terraform的目录结构编排与环境隔离,详细说明如何通过传参来动态调整资源编排的实际传参与调度,如何通过多次组合计算以动态生成新的参数来规避Terraform对高级特性支持的欠缺,以及如何构建全局变量以解决全局动态传参。基于篇幅限制, Terraform的使用无法逐一说明,对Terraform有兴趣的同学可自行学习了解。


参考

  1. Mikael Krief. Terraform Cookbook: Efficiently define, launch, and manage Infrastructure as Code across various cloud platforms. Packt Publishing 2020
  2. Scott Winkler. Terraform in Action. Manning 2021
  3. Yevgeniy Brikman. Terraform: Up & Running: Writing Infrastructure as Code. O'Reilly Media 2019
  4. Terraform

GX Works2系统启动失败排查指南:从环境配置到修复方案 在工业自动化与PLC编程调试中,软件启动异常是常见的工程痛点。当开发工具因系统环境配置不当而频繁报错时,往往不是简单的重启能解决的。运行库缺失、区域设置错误、临时目录失效或系统服务被禁用,都可能导致编程软件无法完成初始化流程。掌握从基础环境检查到系统组件修复的系统性排查思路,是提升工控开发效率的关键能力。本文从软件初始化原理出发,结合Windows系统维护实践,梳理一套适用于工业软件启动故障的通用诊断方法,并自然聚焦到三菱GX Works2常见启动失败问题的实际处理,帮助工程师快速定位并解决环境性故障,保障 阅读详情

相关推荐

红米12C刷机避坑指南:NV数据损坏的修复与系统版本选择

本文提供了红米12C刷机过程中避免NV数据损坏的详细指南,涵盖系统版本选择、SP刷机工具使用和fastboot命令修复。重点分析了NV数据损坏的原因与表现,并给出通过工程固件和深度修复技巧解决基带未知、IMEI丢失等问题的实操方案,帮助用户安全完成刷机。

cuda7parallel的博客 1075

探索在三大云中使用 Terraform 配置 Kubernetes

在充斥着大量组件和配置的环境中,配置和管理基础架构可能会让人十分头疼。尤其是当您还需要手动完成这些操作时,或者您需要部署许多类似的环境,而每个环境只需进行些许更改。 幸运的是,基础架构即代码 (IaC) 可以帮助您解决这个难题。 对于 Kubernetes (K8S) 来说尤其如此,因为其本身就是一个完整的生态系统。 由于本文不仅面向初学者,也面向有经验的 DevOps 从业者,因此我们将从简短的背景介绍开始。如果您已了解 IaC、K8S 和 Terraform 的背景,那么请直接跳到技术部分阅读。

讨论软件开发加速、持续集成/持续交付(CI/CD)、C++、开发者生产力以及所有相关话题。 892

物理与工程中的‘黑话’:Kronecker delta和Levi-Civita符号到底简化了什么?

本文深入解析了物理与工程中常用的Kronecker delta和Levi-Civita符号的简化作用。通过对比传统表示与张量表示,展示了这些符号在向量运算、矩阵迹计算及流体力学模拟中的高效应用,显著提升计算效率和代码可读性。特别适合理论物理和工程数学领域的学习者与从业者。

weixin_27215403的博客 399

Terraform 语法 variable变量 local本地变量的使用

在执行tf部署的时候,传递一个变量是region,可以通过-var,如果是传递很多变量,那么就写多个-var,变量类型有很多,比如list类型,注意使用单引号引用起来。变量参数类型还是很多的,之前在其他语言里面声明了变量,可能是字符串,或者是一个数值,或者是一个布尔值,甚至是any包含了下面的任意对象。之前在写tf的模板文件的时候用了很多变量,比如在写认证信息的时候,定义的变量存放了阿里云的ak和sk,最后就是region的信息。上面图片注意,一个是声明变量,另外一个是定义变量,那么tf才能读取进来。

小楼一夜听春雨,深巷明朝卖杏花 6373

告别ROS1!在Ubuntu 22.04上为VINS-Fusion适配ROS2 Humble的完整踩坑记录

本文详细记录了在Ubuntu 22.04上将VINS-Fusion从ROS1迁移到ROS2 Humble的完整过程,包括环境搭建、依赖管理、核心代码适配及性能优化。通过实战案例和调试技巧,帮助开发者高效解决迁移过程中的常见问题,提升系统稳定性和性能。

weixin_42628688的博客 281

声音事件检测metric:PSDS

这项工作为多声道声音事件检测(SED)系统的性能评估定义了一个新的框架,它克服了传统的collar-based事件决定、事件F-cores和事件错误率的限制。拟议的框架引入了对事件检测的定义,该定义对标签的主观性更为稳健。它还采用了多声道接收器操作特性(ROC)曲线,以提供比F1分数更全面的系统性能洞察力,并建议将这些曲线简化为单一的多声道声音检测分数(PSDS),这允许系统独立于操作点(OPs)进行比较。所提出的方法还能更好地了解不同声音类别的数据偏差和分类稳定性。

Maestro_T的博客 2730

【Terraform学习】使用 Terraform 托管 S3 静态网站(Terraform-AWS最佳实战学习)

【Terraform学习】使用 Terraform 托管 S3 静态网站(Terraform-AWS最佳实战学习) 确保您位于美国东部(弗吉尼亚北部)us-east-1 区域。 通过单击 AWS 控制台顶部导航到 S3。 单击您创建的存储桶。存储桶名称将与您在variables.tf文件中提供的名称相同。 打开存储桶后,存在两个文件index.html和error.html 切换到属性选项卡并向下滚动查找静态网站托管选项。 复制存储桶网站终端节点并粘贴到 Web 浏览器的新选项卡中访问。

zerotoall的博客 925

PyQt 随笔:信号与槽的两种使用方法:@pyqtSlot 和 connect

在 PyQt 中,信号与槽是实现事件驱动的一种重要机制。通过信号与槽的连接,可以实现对象之间的通信,例如在用户界面中响应按钮点击事件或者数据的变化等。PyQt 提供了两种主要的方法来创建信号与槽的连接:@pyqtSlot 装饰器和 connect 方法。本文将详细介绍这两种方法,并提供相应的源代码示例。在上面的示例中,我们定义了一个名为。

QasdCpp的博客 763

Terraform

因为这是一个复杂的数据结构(列表中的对象),你可能需要使用 type = list(object({ …现在,你可以在 Terraform 配置的其他部分通过。在Terraform中,将一个局部变量(locals块定义的变量)改为全局变量意味着你要将其定义为一个输入变量,这样可以在模块之间共享或者从命令行、变量文件等外部来源提供值。

weixin_43484225的博客 1086

DeepSeek:为文化创意产业注入AI新动能

沪南胜境,闵行新章。随后,2024 年 5 月,DeepSeek 宣布开源第二代 MoE 大模型 DeepSeek-V2,以其比肩 GPT-4Turbo 的卓越性能,以及仅为 GPT-4 百分之一的价格优势,迅速在市场中掀起波澜,收获了 “AI 届拼多多” 的独特名号,让更多人看到了高性价比 AI 大模型的可能性。创作者自身也应提高对创作伦理的认识,树立正确的创作观念,在使用 AI 工具时,保持对创作的主导权,充分发挥自己的创造力和想象力,将 AI 作为创作的辅助工具,而不是替代品。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 1962

低功耗设计-ir drop的signoff corner怎么选择?

2.tt的(tt85 是比较接近芯片真实工作情况的);我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?有要求就用要求的就好,没要求前两种看公司需求。3.signoff文档要求的;有几个方向,看公司需求吧。

m0_61544122的博客 1594

使用Terraform对主流三朵云进行ECS批量部署 | IaC | 资源编排

terraform是一种资源编排工具,这篇文章介绍如何对AWS, ALI, HUAWEI三多云做最简单的虚拟机资源编排

m0_62856417的博客 1602

华为od 面试八股文_前端_02_含答案

华为od 面试八股文_前端_02_含答案

MISAYAONE的博客 1998

terraform local

local 局部变量可以引用variable,resource,data中的一些资源属性,从而拼接改造需要的样式以供一起资源引用,local比variable更灵活,但local不能从外部来赋值。 局部值可能有助于避免在配置中多次重复相同的值或表达式,但是如果过度使用局部值,也可能通过隐藏使用的实际值而使以后的维护人员难以读取配置。 仅在某些地方使用单个值或结果且将来可能会更改该值的情况下,才应适度使用局部值。易于在中心位置更改值的能力是本地值的主要优势。 locals { # Ids for mult

yu15050186065的博客 1094

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Terraform 语法 module模块 简介/封装/实践

一个目录下就是一个模块,只不过它叫做根模块。在生产环境代码下都是根模块下面有很多子模块,甚至子模块里面还有子模块。(之前所有文件在一起,其实就已经是一个模块了,之前是大模块,里面没有子模块,现在需要做的就是添加子模块)建议就是根模块和子模块,不易套太深,套太深那么可读性和维护性都会变的很差了,到时候不方便去管理。一个目录下所有.tf文件组成的就是一个模块。这些模块写的资源的语法都是一致的。如果你是json语法,那么会有很多.json结尾的文件组成模块。

小楼一夜听春雨,深巷明朝卖杏花 6552

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

云平台运维工具 ——Terraform

Terraform 作为一款强大的基础设施即代码工具,通过声明式配置、跨云支持和自动化部署,极大简化了云基础设施的管理。本文从基础安装、核心概念到高级特性和最佳实践,全面介绍了 Terraform 的使用方法。

ececec12的博客 2364

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Terraform学习

DevOps tools 之 Terraform。

weixin_47252600的博客 2886

用terraform 创建一个GKE private cluster

GKE(Google Kubernetes Engine)是 Google Cloud 提供的容器管理服务,它基于 Kubernetes 构建,可以帮助您轻松部署、管理和扩展容器化的应用程序。您可以把它想象成一个强大的“容器编排大师”,让您的应用在云端高效、稳定地运行。GKE 简化了 Kubernetes 的复杂性,让您专注于应用开发,而无需花费大量精力在底层基础设施的管理上。它提供了自动伸缩、自动修复、滚动更新等功能,确保您的应用始终可用并保持最佳性能。

nvd11的专栏 1081

Terraform基础(四)-Terraform配置文件基础语法&格式

Terraform配置文件语法和工作目录下文件结构及其作用

qq522044637的博客 4928

Terraform使用模块

在Terraform代码中引用一个模块,使用的是module块。每当在代码中新增、删除或者修改一个module块之后,都要执行或是命令来获取模块代码并安装到本地磁盘上。

sre救赎之路 1858

Terraform之Workspace多环境部署

公司使用Terraform在多个环境(*INT,Staging, Prod*)上部署Elastic Cloud,用作系统及客户日志存储分析等 。结合 Terraform Workspace 我们可以实现在不同环境中使用同个Terraform Module 来动态部署资源, 本文我们将讨论如何使用terrform管理多个环境。

SRE进阶之路 1379

Terraform的零基础学习教程

创建。

weixin_45981509的博客 898

Terraform介绍与安装部署

Terraform 是一种安全有效地构建、更改和版本控制基础设施的工具(基础架构自动化的编排工具)。它的目标是 "Write, Plan, and create Infrastructure as Code"(编写、规划和创建基础架构作为代码), 基础架构即代码。Terraform 几乎可以支持所有市面上能见到的云服务。具体的说就是可以用代码来管理维护 IT 资源,把之前需要手动操作的一部分任务通过程序来自动化的完成,这样的做的结果非常明显:高效、不易出错。

sre救赎之路 1万+

DeBERTa-v3-large奖励模型性能优化:提升推理速度的7个技巧

想要让你的DeBERTa-v3-large奖励模型推理速度提升3倍以上吗?🤔 作为目前最先进的自然语言处理模型之一,DeBERTa-v3-large奖励模型在文本分类和奖励评分任务中表现出色,但大型模型往往面临推理速度慢的挑战。本文将为你分享7个实用的性能优化技巧,帮助你在保持模型准确性的同时显著提升推理效率。 ## 🔥 为什么需要优化DeBERTa-v3-large奖励模型? DeBER

gitblog_00015的博客 523

Terraform 示例项目教程

Terraform 示例项目教程 1. 项目目录结构及介绍 Terraform 示例项目包含了多个云服务提供商的配置示例,旨在帮助用户快速开始使用 Terraform 管理云资源。项目的目录结构如下: terraform-examples/ ├── aws/ # AWS 的配置示例 ├── azure/ # Azure...

gitblog_00275的博客 892

Terraform模块Module管理,聚合资源的抽取与复用

1 简介 最近工作中用到了Terraform,权当vb.net教程学习记录一下,希望能帮助到其它人。 模块是为了便为管理与复用,就跟函数是一样的。一个模块大概有以下文件: main.tf:就像是函数入口; README.md:如函数的声明; variables.tf: 变量说明,就像函数的入参; outputs.tf: 输出,如函数的返回值; examples: 使用示例; 另外,模块也是可以嵌套的,即模块里有子模块,但不建议嵌套太深。 2 创建及使用自定义模块 2.1 创建模块 .

chinaherolts2008的博客 1117
上一篇: 一文详解前端错误捕获和上报
下一篇: GrowingIO Reactor速成指南
GrowingIO_
博客等级 码龄8年 56粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值