Terraform

news2024/11/25 8:21:57

文章目录

    • 简介
    • 安装
      • 简单使用案例
    • 概念
      • 原理
      • 状态管理
        • Backend 远程状态存储机制
    • 配置语法
      • Argument 参数
      • Block 块
        • terraform块
          • required_providers
          • backend
        • provider块: 与基础设施交互
        • resource块: 定义基础架构
        • data块: 数据源
      • 表达式(Experssion)和函数(Functions)
      • 变量
        • variable 输入变量(入参)
        • output 输出变量(出参)
        • local 局部变量
      • Modules 模块
        • 创建模块
        • 调用子模块
          • 使用子模块输出值
    • cli基本命令
        • terraform init
        • terraform workspace 工作空间
        • terraform plan 预览计划、不执行
        • terraform apply 执行计划
        • terraform state 状态管理
        • terraform destroy 销毁资源

简介

编写一些 配置文件 就可以管理多个云平台上的基础设施。

安装

https://developer.hashicorp.com/terraform/downloads

  • mac brew安装【对xcode版本有要求】
#安装 HashiCorp tap
brew tap hashicorp/tap
 
#使用hashicorp/tap/terraform
brew install hashicorp/tap/terraform

# 验证安装
terraform version

简单使用案例

  1. 新建terraform项目的文件夹
  2. 编写 Terraform 配置文件:创建一个名为的文件main.tf,语法是HCL
  3. 在文件夹下执行terraform命令
# 初始化(下载一个名为 provider 的插件,使terraform与云平台交互)
terraform init

# 把编写的配置 应用在云平台上
terraform apply

# 销毁
terraform destroy

示例项目

https://github.com/hashicorp/learn-terraform-init

概念

原理

通过 配置文件基础设施 进行绑定,将配置文件的改动执行成基础设施的变更

要做到这个,Terraform就需要记住当前基础设施的状态, 才能知道要改动那些资源

状态管理

  • 记录方式: backend
    默认将每次执行操作时的状态信息存储在当前工作目录下的terraform.tfstate文件里

  • 流程
    我们对Terraform的代码进行了一些修改,导致生成的执行计划将会改变状态,那么在实际执行变更之前,Terraform会复制一份当前的tfstate文件到同路径下的terraform.tfstate.backup中,以防止由于各种意外导致的tfstate损毁。

Backend 远程状态存储机制

支持远程状态存储与状态锁

配置语法

https://developer.hashicorp.com/terraform/language

Terraform的配置文件以 “.tf” 结尾

注释

# 		单行注释,其后的内容为注释
// 		单行注释,其后的内容为注释
/* 和 */	多行注释,可以注释多行

Argument 参数

将一个值或表达式赋值给指定的参数名

参数名 = 参数值

参数值的类型支持:

  • 基本类型
    • string:字符串类型,由一个或多个Unicode字符组成,例如 “hello”。
    • number:数字类型,可以表示整数和浮点数。
    • bool:布尔类型,只能是 true 或 false。
  • 集合类型
    • map(…):映射类型,以键值对(key-value pair) 的方式组合起来的数据元素集
      合,其中key为string类型,对应的值可以是string,number,bool等类型,且所
      有元素的值必须是同一类型。
    • list(…):列表类型,具有同类型的数据元素集合,元素可以是基本类型和块类
      型,列表索引从0开始。
    • set(…):集合类型,类似于列表类型,但是集合中的元素是没有任何辅助标识符
      或顺序,且元素具有唯一性。
  • 特殊类型 null

Block 块

块将多个参数聚合在一起,并支持嵌套。块由块类型、块标签和块主体构成

  • 顶级块:可以游离于任何其他块独立定义在配置文件中的块
    Terraform支持的顶层块类型包括:provider,resource,data,variable,output,module,locals等关键字
<BLOCK TYPE> "<BLOCK LABEL>" "<BLOCK LABEL>" {
  # Block body
  <IDENTIFIER> = <EXPRESSION> # Argument
}

<顶级块类型> "<块标签>" "<块标签>" {
  //块主体
  <参数名>           = "参数值"
  <嵌套块类型> "<块标签>" {
  }
}

terraform块

// Terraform 配置
terraform {
 // 指定 Terraform 版本要求
 required_version = "Terraform版本约束"
 
 // 指定 Provider要求
 required_providers {
 	<Provider1本地名称> {
 	  source  = "Provider源地址, 全球唯一" //registry源
      version = "Provider版本约束"	//版本约束
 	}
 	<Provider2本地名称> {
 	  source  = "Provider源地址, 全球唯一"
      version = "Provider版本约束"
 	}
 }

  // 定义 Terraform 存储其状态数据文件的位置
 backend "backend类型" {
    organization = "example_corp"

    workspaces {
      name = "my-app-prod"
    }
 }
}

required_providers
  1. 必须在required_providers 必须声明需要哪些Provider, 才能安装和使用它们
  2. <本地名称>是特定于模块的,并在需要提供程序时分配。每个模块的本地名称必须是唯一的
  3. 内置供应商:内置于 Terraform 中,因此您无需在required_providers块中声明它即可使用其功能

Terraform 依靠 provider的插件与基础设施 (云提供者、SaaS 提供者和其他 API )进行交互
每种资源类型都由provider实现;没有provider,Terraform 无法管理任何类型的基础设施。

backend
  1. 默认后端local,它将状态存储在磁盘上的本地文件
  2. 更改后端的配置时,必须terraform init再次运行以验证和配置后端
  3. 目前支持的backend类型 及其配置:https://developer.hashicorp.com/terraform/language/settings/backends/local

在这里插入图片描述

provider块: 与基础设施交互

一些provider会要求配置一些信息来使用它们,如:端点URL、云区域…

  • 为 <Provider1本地名称> 提供配置
// 默认配置
provider "<Provider1本地名称>" {
  // Provider需要的配置参数
  region = "1"
  url	 = "1.1.1.1"
 ...
}
// alias 广州 配置
provider "<Provider1本地名称>" {
  alias  = "广州"
  region = "2"
  url	 = "2.2.2.2"
  ...
}
// alias 北京 配置
provider "<Provider1本地名称>" {
  alias  = "北京"
  region = "3"
  url	 = "3.3.3.3"
  ...
}
  1. <Provider1本地名称>应该要已包含在一个required_providers 块中
  2. 用 alias 可以为同一个provider的不同资源提供不同配置
  • 官方支持的provider
    https://developer.hashicorp.com/terraform/language/providers

resource块: 定义基础架构

//resource块
resource "<资源类型>" "<本地名称>" {
  //resource块体
  <资源参数>           = "参数值"
  <资源参数>           = "参数值"
  //metadata块
  metadata {
    //metadata块体
    参数           = "参数值"
  }
}
  1. <资源类型>, <资源参数>: 每个 Terraform 提供者都有自己的文档,描述其资源类型及其参数。
  2. <本地名称>:用于从同一 Terraform 模块的其他位置引用此资源,但在该模块的范围之外没有任何意义

data块: 数据源

Data Source 可以认为是特殊的Resource,通过关键字 “data” 进行声明。
Data Source 用于查询或计算一些已经存在资源的属性和信息 供其他地方使用
每个Data Source都属于一个provider

data "<data类型>" "<本地名称>" {
  // 查询条件
  most_recent = true

  owners = ["self"]
  tags = {
    Name   = "app-server"
    Tested = "true"
  }
}
  • Data Source会导出一个或多个属性。引用ata Source属性的语法是data.<data类型>.<本地名称>.<ATTRIBUTE>
resource  {
  参数           = data.data类型.本地名称.id
}

data类型 和 本地名称 的组合必须是唯一的

表达式(Experssion)和函数(Functions)

支持:

基础运算符
条件表达式
循环

字符串函数
数学计算函数
集合函数
类型转换
加密编码
文件操作

变量

variable 输入变量(入参)

声明变量

variable "<变量名称>" {
  type =  <变量接受的值类型:number、string、bool、list()、set()、map()>
  default = <默认值>
  description = <描述文档>
  validation {
    condition = <验证规则>
    error_message = <报错信息>
  }
  sensitive = true // 是否敏感值,敏感值不打印
  nullable = false // 是否可为空
}

引用变量: var.<变量名称>

resource "aws_instance" "example" {
  instance_type = "t2.micro"
  ami           = var.<变量名称>
}

output 输出变量(出参)

output "<变量名称>" {
  value = <表达式>
  description = <描述文档>
  sensitive = true // 是否敏感值,敏感值不打印

}

local 局部变量

只能在声明它的模块内的表达式中访问

locals  { 
  <名称>  =  <> 
}

// 使用
local.<名称>

Modules 模块

对资源封装,模块是使用 Terraform 打包和重用资源配置的主要方式。

可以引用其他人的模块,发布自己的模块(Terraform Registry托管了大量公开可用的 Terraform 模块)

  1. 模块使用variable 输入变量 接受来自调用模块的值
  2. 使用output 输出变量 将结果返回给调用模块
  • 根模块
    每个 Terraform 配置至少有一个模块,称为它的 根模块.tf
  • 子模块
    被另一个模块调用的模块通常称为子模块

创建模块

  1. 创建一个新目录
  2. 在其中放置一个或多个文件.tf
  • 简单模块可以直接全部定义都放在一个main.tf
|- 模块目录/
|- |- main.tf 【模块入口】
|- |- variables.tf 【输入变量】
|- |- outputs.tf 【输出变量】
  • 复杂模块建议拆分 嵌入模块
|- 模块目录/
|- |- main.tf 
|- |- variables.tf 
|- |- outputs.tf 
|- |- modules/ 	【嵌入模块目录】
|- |- |- 嵌入模块a/
|- |- |- |- main.tf 
|- |- |- |- variables.tf 
|- |- |- |- outputs.tf 
|- |- |- 嵌入模块b/
|- |- |- 嵌入模块c/
|- |- examples/ 【调用样例目录】

调用子模块

调用模块意味着将该模块的内容包含到配置中,并为其 输入变量赋值

module "<子模块本地名称>" { 
  // 模块的参数
  source  = "【必输参数】子模块的源代码路径"
  version = "模块版本"
  <输入变量>  =  <> 
}

使用子模块输出值

module.<子模块本地名称>.<输出值>


cli基本命令

# 检查语法错误
terraform validate

# 格式化代码格式
terraform fmt

# 生成依赖图
terraform graph
# 转为图片格式
terraform graph | dot -Tsvg > graph.svg

terraform init

terraform init会完成代码中所使用到的Provider、Backend、Modules等模块的加载

terraform init -migrate-state

terraform init -reconfigure

terraform workspace 工作空间

# 创建工作区
terraform workspace new [NAME]

# 查看所有的
terraform workspace list
# 查看当前选择的
terraform workspace show

# 选择使用的工作区
terraform workspace select [NAME]

# 删除工作区
terraform workspace delete [NAME]

terraform plan 预览计划、不执行

检测云上资源的属性和状态文件差异,将差异结果显示在命令下方

# 创建变更计划,检查当前的变更是否符合预期
terraform plan

# 输出:
......
Plan: 15 to add, 26 to change, 15 to destroy.

......
No changes. Infrastructure is up-to-date.

Terraform 将您的 Terraform 配置与在该工作区的状态文件中跟踪的真实世界基础设施进行协调,并创建一个资源列表以创建、修改或销毁。

terraform apply 执行计划

# 扫描当前目录下的代码文件(自动创建一个新的变更计划),并执行相应的变更
terraform apply

terraform state 状态管理


# 【废弃】刷新当前 state 文件的配置(远端获取最新数据并将结果写入 state 文件中)
terraform refresh

# 列出当前 state文件中配置的资源
terraform state list
# 展示当前 state文件中配置的资源及其属性值
terraform show
# 展示某个资源的所有属性值
terraform state show <资源类型>.<资源名称>

# 加载您的远程状态并将其输出到标准输出
terraform state pull

# 手动写入状态
terraform state push # 这是极其危险的,应尽可能避免

terraform destroy 销毁资源

# 销毁并回收所有Terraform管理的基础设施资源
terraform destroy

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/472112.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Celery】任务Failure或一直超时Pending

编写背景 task进入队列后&#xff0c;部分任务出现Failure或者一直Pending,且业务代码没有报错。 运行环境 celery配置 from celery import Celery broker redis://:127.0.0.1:6379/1 backend redis://:127.0.0.1:6379/2 app Celery(brokerbroker,backendbackend,includ…

【文心一言】广告文案、演讲稿与请假条自动生成

前言 作为一名大学生而言&#xff0c;平时参加或者举办一些学校组织的活动的时候&#xff0c;总是避免不了需要准备一些演讲稿、广告宣传文案等内容&#xff0c;甚至于在疫情十分严重的这几年内&#xff0c;如何跟老师“委婉的”请假&#xff0c;也成为了我日常头疼的事情。但在…

React之redux的模板

文章目录 以下为模板代码安装(添加 Redux Toolkit 和 React-Redux 依赖包到你的项目中)以下为项目目录在store/index.js里面的模板创建模块(模块化思想),这里就是模板,所有模块通用(src/features/userSlice.js)在main.jsx引入模板(只需要看下面画横线的四行)在组件内使用 以下是…

【网课平台】Day16.项目优化:压测、加缓存优化与分布式锁

文章目录 一、压力测试1、优化需求2、性能指标3、安装Jmeter4、压力测试5、优化日志 二、缓存优化1、给接口加Redis缓存2、缓存穿透3、解决缓存穿透4、缓存雪崩5、缓存击穿 三、分布式锁1、本地锁的问题2、IDEA一个项目启动多个实例3、分布式锁4、Redis NX实现分布式锁5、Redis…

多项式加法(用 C 语言实现)

目录 一、多项式的初始化 二、多项式的创建 三、多项式的加法 四、多项式的输出 五、清除链表 六、主函数 用链表实现多项式时&#xff0c;每个链表节点存储多项式中的一个非零项&#xff0c;包括系数&#xff08;coef&#xff09;和指数&#xff08;exp&#xff09;两个…

Java8新特性函数式编程 - Lambda、Stream流、Optional

1.Lambda表达式 1.1 概述 ​ Lambda是JDK8中一个语法糖。他可以对某些匿名内部类的写法进行简化。它是函数式编程思想的一个重要体现。让我们不用关注是什么对象。而是更关注我们对数据进行了什么操作。 1.2 核心原则 可推导可省略 1.3 基本格式 (参数列表)->{代码}例一…

python毕业设计之django+vue公司企业物流信息管理系统

基于 开发语言&#xff1a;Python 框架&#xff1a;django Python版本&#xff1a;python3.7.7 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发软件&#xff1a;PyCharm 语言设计并实现了速运公司物流信息管理系统。该系统基于B/S即所谓浏览器/服务器模式&…

智慧物流信息系统开发需具备哪些功能?

智慧物流软件开发公司在制作管理系统的时候&#xff0c;需要具备的功能有哪些呢&#xff1f; 一、采集跟踪功能。 &#xff08;1&#xff09;、信息采集&#xff1a;信息采集跟踪系统是智能物流系统的重要组成部分。物流信息采集系统主要由RFID射频识别系统和Savan…

【Hadoop-HDFS】HDFS中Fsimage与Edits详解

【Hadoop-HDFS】HDFS中Fsimage与Edits详解 1&#xff09;概述2&#xff09;NameNode元数据解析3&#xff09;Fsimage3.1.Fsimage 的作用3.2.FSimage 的文件信息查看 4&#xff09;Edits4.1.Edits 的作用4.2.Edits 的文件信息查看 5&#xff09;元数据信息目录的配置 1&#xff…

【2023.04.28】Windows配置MongoDB服务

【2023.04.28】Windows配置MongoDB服务 1、背景2、操作2.1 配置环境变量2.2 配置本地Windows MongoDB服务 环境&#xff1a;Windows11&#xff0c;Mongo 6.0.5【该版本没有mongo.exe】 1、背景 某一天想使用电脑以前安装的 MongoDB&#xff0c;发现用 Navicat 连接不了&#…

4个很多人都不知道的现代JavaScript技巧

JavaScript在不断的进化和升级&#xff0c;越来越多的新特性让我们的代码变得更加简洁。因此&#xff0c;今天这篇文章&#xff0c;我将跟大家分享 4 个不常用的 JavaScript 运算符。让我们一起研究它们。 1.可选的链接运算符 这个功能非常好用&#xff0c;它可以防止我的代码…

pwm调节亮度

文章目录 运行环境&#xff1a;1.1 pwm1)占空比2)A板原理图3)PE11引脚配置4)定时器Timers配置 2.1代码解释1)定时器1初始化函数2)启动定时器中断3)启动PWM/设置占空比4)launch设置5) 编译调试 3.1实验效果 运行环境&#xff1a; ubuntu18.04.melodic 宏基暗影骑士笔记本 stm32…

Leetcode202. 快乐数

Every day a leetcode 题目来源&#xff1a;202. 快乐数 解法1&#xff1a;hash 根据几个例子&#xff0c;我们发现只有2种结果&#xff1a; 最终会得到1最终进入一个循环 其实得到1后&#xff0c;继续计算&#xff08;将该数替换为它每个位置上的数字的平方和&#xff09…

美妆“数字员工”来了!丸美:每月节省30人日!提升员工幸福感,企业效益稳增

美妆&#xff0c;因其效果可视觉化呈现的特征&#xff0c;决定了美妆品牌与直播带货的高匹配度。流量&#xff0c;是直播商家深入了解粉丝参与情况和商品销售状况的重要依据。因此&#xff0c;美妆商家需要每天下载直播数据报表&#xff0c;监测流量、成交变化趋势&#xff0c;…

数据可视化 —— 小练习1 KMeans聚类并数据可视化图像像素点

数据可视化Task1 任务描述&#xff1a;对图片RGB点进行Kmeans聚类&#xff0c;并将结果数据可视化于前端浏览器上 实验平台&#xff1a; Visual Studio CodeHTML/CSS/JavascriptEdge/Chorme/Firefox 浏览器Echart.min.js 3.8.5版 &#xff08;过高的版本浏览器无法include&a…

Python采集豆Top250电影数据 , 看看质量及评分

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 本次案例涉及点: 1、动态数据抓包演示 2、csv文件保存 3、requests模块的使用 4、parsel解析数据的使用 环境介绍&#xff1a; 软件安装 python 3.8 pycharm 不会安装的可以文末名片我获取哦 &#x1f60e; 模块使用…

windows安装flutter

在flutter官网下载flutter 在 Windows 操作系统上安装和配置 Flutter 开发环境 - Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 下载文件后&#xff0c;解压文件把文件存放在指定位置 打开flutter_console.bat文件 输入flutter doctor flutter报错提示&#xff08;…

unity-VRTK学习日记1(VRTK4|无头盔开发模拟器SpatialSimulator)

目录 前言 前期准备 1.配置VRTK4&#xff1a; 2.把几个插件给安装好 查看自己安装了哪些VRTK插件 3.添加模拟器 操作方法 操作方法&#xff1a;人话 前言 VRTK的较早版本不适用于Unity的新版本&#xff0c;原因好像是Unity将VR开发功能并入到自家的XR下了。就是之前更新…

即时通讯独立系统源码包含Android 、iOS、PC

demo软件园每日更新资源,请看到最后就能获取你想要的: 1.经典版哇呼星聊即时通讯独立系统源码 包含Android 、iOS、PC 自带教程 哇呼星聊即时通讯系统源码 AndroidiOSPC三端 附教程 服务器最低配置4H4G 这套安装跟shiku一样 1.安装宝塔&#xff0c;只安装Nginx&#xff0c;其他…

力扣,合并石头最低成本算法题

1&#xff1a;这个题有题解&#xff0c;自己可以去看力扣&#xff0c;合并石头 2&#xff1a;网上也有视频自己去看视频讲解 3&#xff1a;下面我自己的一些理解 4&#xff1a;原需求&#xff1a; 5&#xff1a;代码&#xff1a;使用贪心算法和最小堆来求解&#xff1a; im…