Terraform基础入门 (Infrastructure as Code)
文章目录
- 前言
- 介绍
- Terraform 术语
- Terraform 如何工作
- 关于provider
- 安装
- 开启本地缓存
- demo1(docker+nginx)
- demo2(docker+zookeeper+kafka)
- 参考资料
前言
像写代码一样管理基础设施。
Terraform 使用较为高级的配置文件语法来描述基础设施,这个特性让你对配置文件进行版本化管理后,就等于对生产环境的基础设施进行类似于代码一样的版本化管理,而且这些基础设施的配置文件可以复用或者分享。
介绍
Terraform(https://www.terraform.io/)是 HashiCorp 旗下的一款开源(Go 语言开发)的 DevOps 基础架构资源管理运维工具。他的本质是基于版本化的管理能力上,安全、高效地创建和修改用户生产环境的基础设施。
Terraform 有很多非常强大的特性值得我们参考:
- 基础设施即代码:Infrastructure as Code。基础设施可以使用高级配置语法进行描述,使得基础设施能够被代码化和版本化,从而可以进行共享和重复使用。
- 执行计划:Execution Plans。Terraform有一个 "计划 "步骤,在这个步骤中,它会生成一个执行计划。执行计划显示了当你调用apply时,Terraform会做什么,这让你在Terraform操作基础设施时避免任何意外。
- 资源图谱:Resource Graph。Terraform建立了一个所有资源的图,并行创建和修改任何非依赖性资源。从而使得Terraform可以尽可能高效地构建基础设施,操作人员可以深入了解基础设施中的依赖性。
- 自动化变更:Change Automation。复杂的变更集可以应用于您的基础设施,而只需最少的人工干预。有了前面提到的执行计划和资源图,你就可以准确地知道Terraform将改变什么,以及改变的顺序,从而避免了许多可能的人为错误。
Terraform 术语
术语 | 基本介绍 |
---|---|
Provider | 又称为Plugin,主要用来跟其他的服务进行交互从而实现资源管理,服务安装等 |
Module | Module是一个将多种资源整合到一起的一个容器,一个module由一些列的.tf或者.tf.json后缀文件组成 |
Resource | 主要用来定义各种资源或者服务,而这些服务就组成了我们的基础设施架构 |
Registry | Provider仓库,主要用来存储各种的provider,同时我们也会从Registry下载本地定义的provider到本地 |
Terraform 如何工作
Terraform 采用了插件模式的运行机制。Terraform 使用 RPC(远程接口调用) 跟 Terraform Plugins 进行通信,同时也提供了多种方式来发现和加载 Plugins;而 Terraform Plugins 会和具体的 Provider 进行对接,例如:AWS、Kubernates、Azure 等等,封装各种资源操作的接口供 Terraform Core 使用。
Terraform使用的是HashiCorp自研的go-plugin库(https://github.com/hashicorp/go-plugin),本质上各个Provider插件都是独立的进程,与Terraform进程之间通过rpc进行调用。Terraform引擎首先读取并分析用户编写的Terraform代码,形成一个由data与resource组成的图(Graph),再通过rpc调用这些data与resource所对应的Provider插件;Provider插件的编写者根据Terraform所制定的插件框架来定义各种data和resource,并实现相应的CRUD方法;在实现这些CRUD方法时,可以调用目标平台提供的SDK,或是直接通过调用Http(s) API来操作目标平台。
关于provider
默认情况下Terraform从官方Provider Registry下载安装Provider插件。Provider在Registry中的原始地址采用类似registry.terraform.io/hashicorp/aws
的编码规则。通常为了简便,Terraform允许省略地址中的主机名部分registry.terraform.io
,所以我们可以直接使用地址hashicorp/aws。
有时无法直接从官方Registry下载插件,例如我们要在一个与公网隔离的环境中运行Terraform时。为了允许Terraform工作在这样的环境下,有一些可选方法允许我们从其他地方获取Provider插件。
安装
Terraform是以二进制可执行文件发布,只需下载terraform,然后将terraform可执行文件所在目录添加到系统环境变量PATH中即可。
登录Terraform官网,下载对应操作系统的安装包。
解压安装包,并将terraform可执行文件所在目录添加到系统环境变量PATH中。
在命令行中执行如下命令验证配置路径是否正确。
terraform version
开启本地缓存
有的时候下载某些Provider会非常缓慢,或是在开发环境中存在许多的Terraform项目,每个项目都保有自己独立的插件文件夹非常浪费磁盘,这时我们可以使用插件缓存。
Windows下是在相关用户的%APPDATA%目录(如C:\Users\Administrator\AppData\Roaming)下创建名为"terraform.rc"的文件,Macos和Linux用户则是在用户的home下创建名为".terraformrc"的文件。在文件中配置如下:
plugin_cache_dir = "$HOME/.terraform.d/plugin-cache"
当启用插件缓存之后,每当执行terraform init命令时,Terraform引擎会首先检查期望使用的插件在缓存文件夹中是否已经存在,如果存在,那么就会将缓存的插件拷贝到当前工作目录下的.terraform文件夹内。如果插件不存在,那么Terraform仍然会像之前那样下载插件,并首先保存在插件文件夹中,随后再从插件文件夹拷贝到当前工作目录下的.terraform文件夹内。为了尽量避免同一份插件被保存多次,只要操作系统提供支持,Terraform就会使用符号连接而不是实际从插件缓存目录拷贝到工作目录。
需要特别注意的是,Windows 系统下plugin_cache_dir的路径也必须使用/作为分隔符,应使用C:/somefolder/plugin_cahce而不是C:\somefolder\plugin_cache
demo1(docker+nginx)
可以用阿里云等做demo,但云资源一次执行要好几分钟,而且很多操作都是要收费的,学习的时候很不方便,就在本地用docker进行学习吧,第一次下载provider慢一点,后面就是几秒钟就可以测试一个例子了。
所以看下面的demo,需要先下载并安装docker。可以使用菜鸟教程
demo来自官方,但做了适当的简化。
使用docker,并在里面安装一个nginx。
provider 的使用文档,见 https://registry.terraform.io/browse/providers
新建一个文件,文件名随便,就叫main.tf
,内容如下
terraform {required_providers {// 声明要用的providerdocker = {source = "kreuzwerker/docker"// 要用的版本,不写默认拉取最新的//version = "~> 2.13.0"}}
}// 语法 resource resource_type name
// 声明docker_image的镜像,nginx只是一个名字,只要符合变量命名规则即可
resource "docker_image" "nginx" {// 使用的是镜像名,https://hub.docker.com/layers/nginx/library/nginx/latest/images/sha256-3536d368b898eef291fb1f6d184a95f8bc1a6f863c48457395aab859fda354d1?context=explorename = "nginx:latest"
}resource "docker_container" "nginx" {image = docker_image.nginx.namename = "nginx_test"ports {internal = 80 // docker 内部的端口external = 8000 // 对外访问的端口}volumes {container_path = "/usr/share/nginx/html"host_path = "/Users/jasper/data/nginx_home"}
}
新建目录/Users/jasper/data/nginx_home
,windows去VirtualBox那操作,里面新建一个文件index.html
,内容随便来点,就“Hello Terraform”吧。
terraform init
下载需要的provider,第一次可能有点慢
terraform plan
查看执行计划
terraform apply
输入yes即可
最后就可以在浏览器进行访问了
http://127.0.0.1:8000/index.html
demo2(docker+zookeeper+kafka)
kafka的安装是需要依赖zookeeper的,这个例子就展示terraform是如何处理依赖的,并且展示在多资源的情况下,模块编写的推荐方式。
下面显示了一个遵循标准结构的模块的完整示例。这个例子包含了所有可选的元素。
$ tree complete-module/
.
├── README.md
├── main.tf
├── variables.tf
├── outputs.tf
├── ...
├── modules/
│ ├── nestedA/
│ │ ├── README.md
│ │ ├── variables.tf
│ │ ├── main.tf
│ │ ├── outputs.tf
│ ├── nestedB/
│ ├── .../
├── examples/
│ ├── exampleA/
│ │ ├── main.tf
│ ├── exampleB/
│ ├── .../
- README文件用来描述模块的用途。
- examples文件夹用来给出一个调用样例(可选)
- variables.tf文件,包含模块所有的输入变量。输入变量应该有明确的描述说明用途
- outputs.tf文件,包含模块所有的输出值。输出值应该有明确的描述说明用途
- modules子目录,嵌入模块文件夹,出于封装复杂性或是复用代码的目的,我们可以在modules子目录下建立一些嵌入模块。
- main.tf,它是模块主要的入口点。对于一个简单的模块来说,可以把所有资源都定义在里面;如果是一个比较复杂的模块,我们可以把创建的资源分布到不同的代码文件中,但引用嵌入模块的代码还是应保留在main.tf里
代码见:https://gitee.com/zhongxianyao/terraform-demo/tree/master/demo-zk-kafka
main.tf
terraform {required_providers {docker = {source = "kreuzwerker/docker"}}
}module "zookeeper" {// 一个本地路径必须以./或者../为前缀来标明要使用的本地路径,以区别于使用Terraform Registry路径。source = "./modules/zk"
}module "kafka" {source = "./modules/kafka"// 由于依赖了zk模块是输出参数,terraform能够分析出来依赖关系,这里无需depends_on参数# depends_on = [# module.zookeeper# ]zk_port = module.zookeeper.zk_port
}
modules/zk/main.tf
terraform {required_providers {docker = {source = "kreuzwerker/docker"}}
}resource "docker_image" "zookeeper" {name = "ubuntu/zookeeper:latest"
}resource "docker_container" "zookeeper" {image = docker_image.zookeeper.namename = "zookeeper_test"ports {internal = 2181external = 12181}
}
modules/zk/outputs.tf
output "zk_port" {// 在表达式中引用资源属性的语法是<RESOURCE TYPE>.<NAME>.<ATTRIBUTE>。value = docker_container.zookeeper.ports[0].external
}
modules/kafka/main.tf
terraform {required_providers {docker = {source = "kreuzwerker/docker"}}
}resource "docker_image" "kafka" {name = "ubuntu/kafka:latest"
}resource "docker_container" "kafka" {image = docker_image.kafka.namename = "kafka_test"// zk的端口传递env = ["ZOOKEEPER_PORT=${var.zk_port}"]ports {internal = 9092external = 19092}
}
modules/kafka/inputs.tf
variable "zk_port" {default = 2181description = "zookeeper的端口"
}
最后terraform命令
terraform init
terraform plan
terraform apply
参考资料
- https://www.terraform.io/
- https://learn.hashicorp.com/tutorials/terraform/init?in=terraform/cli
- https://lonegunmanb.github.io/introduction-terraform/
- https://help.aliyun.com/document_detail/95820.html
- https://support.huaweicloud.com/intl/zh-cn/productdesc-terraform/index.html
相关文章:

Terraform基础入门 (Infrastructure as Code)
文章目录前言介绍Terraform 术语Terraform 如何工作关于provider安装开启本地缓存demo1(dockernginx)demo2(dockerzookeeperkafka)参考资料前言 像写代码一样管理基础设施。 Terraform 使用较为高级的配置文件语法来描述基础设施,这个特性让你对配置文件进行版本化…...

Redis内存回收
Redis 内存回收 Redis之所以性能很强,最主要的原因是基于内存存储,然而单节点的Redis其内存大小不宜过大,会影响持久化或主从同步性能 可以通过修改配置文件来设置Redis的最大内存 maxmemory <bytes>当内存达到上限时,就…...
ROS2 入门应用 引用自定义消息(C++)
ROS2 入门应用 引用自定义消息(C)1. 查看自定义消息2. 修改话题发布3. 修改话题订阅4. 修改依赖关系5. 修改编译信息6. 编译和运行1. 查看自定义消息 引用在《ROS2 入门应用 创建自定义接口》中自定义的消息Sphere.msg ros2 interface show tutorial_i…...

Spring中的数据校验
数据校验基础 参考: Java Bean Validation 规范 Spring对Bean Validation的支持 Spring定义了一个接口org.springframework.validation.Validator,用于应用相关的对象的校验器。 这个接口完全从基础设施或者上下文中脱离的,这意味着它没有…...
python批量翻译excel表格中的英文
python批量翻译excel表格中的英文需求背景主要设计分析具体实现表格操作请求百度翻译api多线程控制台显示进度完整源码需求背景 女朋友的论文需要爬取YouTube视频热评,但爬下来的都是外文。 主要设计 读取一个表格文件,获取需要翻译的文本 使用百度翻译…...

基于SSM框架的RBAC权限系统设计与 实现
基于SSM框架的RBAC权限系统设计与 实现 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景…...

目标检测各常见评价指标详解
注:本文仅供学习,未经同意请勿转载 说明:该博客来源于xiaobai_Ry:2020年3月笔记 对应的PDF下载链接在:待上传 目录 常见的评价指标 准确率 (Accuracy) 混淆矩阵 (Confusion Matrixÿ…...
深入讲解Kubernetes架构-控制器
在机器人技术和自动化领域,控制回路(Control Loop)是一个非终止回路,用于调节系统状态。这是一个控制环的例子:房间里的温度自动调节器。当你设置了温度,告诉了温度自动调节器你的期望状态(Desi…...
Urho3D本地化 国际化
本地化子系统提供了创建多语言应用程序的简单方法。 初始化 在使用子系统之前,需要加载本地化字符串集合。通常的做法是在应用程序启动时执行此操作。可以加载多个集合文件,每个集合文件只能定义一种或多种语言。例如: Localization* l10n…...

千锋教育嵌入式物联网教程之系统编程篇学习-04
目录 alarm函数 raise函数 abort函数 pause函数 转折点 signal函数 可重入函数 信号集 sigemptyset() sigfillset sigismember() sigaddset() sigdelset() 代码讲解 信号阻塞集 sigprocmask() alarm函数 相当于一个闹钟,默认动作是终止调用alarm函数的进…...
【运维】什么是 DevOps?
文章目录什么是 DevOps?如何实现 DevOpsDevOps工作原理: DevOps生命周期DevOps 文化DevOps 工具:构建 DevOps 工具链DevOps 和云原生开发什么是 DevSecOps?DevOps 和站点可靠性工程 (SRE)什么是 DevOps? DevOps 通过结…...

【C++入门】引用、内联函数、auto关键字、基于范围的for循环(C++11)、指针空值nullptr(C++11)
文章目录引用引用概念引用特性引用使用场景常引用内联函数宏的优缺点?C有哪些技术替代宏?auto关键字auto不能推导的场景基于范围的for循环(C11)指针空值nullptr(C11)引用 引用概念 引用不是新定义一个变量,而是给已存在变量取了一个别名&…...

《FPGA学习》->多个按键控制LED灯
🍎与其担心未来,不如现在好好努力。在这条路上,只有奋斗才能给你安全感。你若努力,全世界都会为你让路。本次项目任务,利用开发板上的4个按键KEY1,KEY2,KEY3,KEY4和2个LED灯LED1&…...
vb.net计算之.net core基础(4)-项目与程序结构(2)
目录 Namespace 语句Visual Basic 中的命名空间完全限定名命名空间可以定义什么全局关键字命名规范条件编译拆分和合并语句拆分成多行在同一行上放置多个语句为代码行添加标签注释串联成员访问运算符点运算符 `.`感叹号 `!`运算符Me 关键字MyMyBaseMyClassNamespace 语句 <…...

基于RK3588的嵌入式linux系统开发(五)——uboot优化修改(按任意按键停止autoboot)
我们通常情况下,芯片进入uboot后,会根据设置的bootdelay时间进行倒数计数。这时候在终端按任意键,即可退出autoboot,进入uboot的命令行模式。 官方提供的uboot源码中,为了防止调试串口干扰导致不能进入系统,…...
Lumerical---在FDTD和MODE工程中的PML边界条件
Lumerical---在FDTD和MODE工程中的PML边界条件 引言PML边界条件实现原理PML 类型PML 配置文件PML 配置文件选项Standard(标准)Stabilized(稳定性)Steep AngleCustom(陡角)对于不同的边界使用不同的配置FDE,varFDTD和FDTD SolverPML 参数阅读这篇前,推荐阅读边界条件综述…...

论文投稿指南——中文核心期刊推荐(社会学)
【前言】 🚀 想发论文怎么办?手把手教你论文如何投稿!那么,首先要搞懂投稿目标——论文期刊 🎄 在期刊论文的分布中,存在一种普遍现象:即对于某一特定的学科或专业来说,少数期刊所含…...
KVM-4、KVM 高级功能详解
1. 半虚拟化驱动 1.1 virtio 概述 KVM 是必须使用硬件虚拟化辅助技术(如 Intel VT-x 、AMD-V)的 Hypervisor,在CPU 运行效率方面有硬件支持,其效率是比较高的;在有 Intel EPT 特性支持的平台上,内存虚拟化的效率也较高。 QEMU/KVM 提供了全虚拟化环境,可以让客户机不经…...

【Linux】进程状态
文章目录1. 阻塞1. 举例2. 为什么要阻塞?3.操作系统层面上如何理解进程等待某种资源就绪呢?资源进程4. 总结2.挂起3.Linux进程状态1. R状态进程只要是R状态,就一定是在CPU运行吗?证明当前进程运行状态生成程序查看进程2. S休眠状态…...

2023河南省第二届职业技能大赛郑州市选拔赛“网络安全”项目比赛样题任务书
2023河南省第二届职业技能大赛郑州市选拔赛“网络安全” 项目比赛样题任务书 一、竞赛时间 共计360分钟。 竞赛任务书内容 2023河南省第二届职业技能大赛郑州市选拔赛“网络安全” 项目比赛样题任务书 A模块基础设施设置/安全加固(200分) A-1&…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...

DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
加密通信 + 行为分析:运营商行业安全防御体系重构
在数字经济蓬勃发展的时代,运营商作为信息通信网络的核心枢纽,承载着海量用户数据与关键业务传输,其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级,传统安全防护体系逐渐暴露出局限性&a…...