首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Terraform快速入门到入土

Terraform快速入门到入土

作者头像
UzJu@菜菜狗
发布于 2022-04-25 13:16:06
发布于 2022-04-25 13:16:06
3.1K02
代码可运行
举报
文章被收录于专栏:UzJu和菜菜狗UzJu和菜菜狗
运行总次数:2
代码可运行

Terraform快速入门到入土

本文按照官方教程来进行学,为了方便快速上手,不去看官方的机翻,所以对于文中的所有定义,都会进行解释,通俗易懂

Terraform安装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo apt-get update && sudo apt-get install -y gnupg software-properties-common curl 
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add - 
sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"  
sudo apt-get update && sudo apt-get install terraform 

快速体验Nginx配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
terraform { 
  required_providers { 
    docker = { 
      source  = "kreuzwerker/docker" 
      version = "~> 2.13.0" 
 } 
 } 
} 
provider "docker" {} 
resource "docker_image" "nginx" { 
  name         = "nginx:latest" 
  keep_locally = false 
} 
resource "docker_container" "nginx" { 
  image = docker_image.nginx.latest 
  name  = "tutorial" 
  ports { 
 internal = 80 
    external = 8000 
 } 
} 

快速使用docker创建Nginx

初始化项目,允许terraform下载与docker进行交互的插件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
terraform init 

如果出现下载失败的情况,需要访问国外网站

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
terraform apply 

此时会输出一些需要我们确认的信息,如果没有问题,输入yes即可

我们访问8000端口即可看到Nginx页面

如果想要删除这个Nginx容器,那么需要使用以下命令即可

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
terraform destroy 

确认无误后,输入yes即可

不过这里值得注意的是,可以看到使用docker ps -a 并没有找到我们停止的容器,所以这里是将这个容器删除了,因为我们正常停止一个容器的时候,使用docker stop,但是在docker ps -a中,我们可以看到已经停止的容器,可以使用docker start 重新将它启动,但是这里是直接将这个容器删除

Aws构建基础

下载Aws cli

Linux x86

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" 
unzip awscliv2.zip 
sudo ./aws/install 

Linux Arm

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl "https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip" -o "awscliv2.zip" 
unzip awscliv2.zip 
sudo ./aws/install 

MacOs

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg" 
sudo installer -pkg AWSCLIV2.pkg -target / 

Windows

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://awscli.amazonaws.com/AWSCLIV2.msi 

配置aws configure

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
aws configure 

创建EC2实例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
terraform { 
  required_providers { 
 aws = { 
      source  = "hashicorp/aws" 
      version = "~> 3.27" 
 } 
 } 
  required_version = ">= 0.14.9" 
} 
provider "aws" { 
  profile = "default" 
  region  = "us-west-2" 
} 
resource "aws_instance" "app_server" { 
  ami           = "ami-830c94e3" 
  instance_type = "t2.micro" 
  tags = { 
 Name = "ExampleAppServerInstance" 
 } 
} 

分别解释以上定义的含义

1、terraform{} 定义了,想用哪家平台的提供程序,说白了就是比如我要用docker,那在source就写docker,想用aws就写Aws,而中间的source为什么是hashicorp/aws呢,因为这里写的是提供的源,从那里提供的,它的全称是:registry.terraform.io/hashicorp/aws

2、然后在required_version中定义了,上面我使用的这个源的版本,required_version这个参数不是强制需要,如果为空,那么将默认下载最新的版本

3、provider “aws”{} 用于定义指定用哪个厂商或者平台,这里使用的aws,profile=default指向了使用AWS使用本地~/.aws/credentials中的密钥配置来操作AWS,region为在哪个地区创建EC2

4、resource中的定义,主要是用来指定我们要用什么东西,例如这里用了EC2,并指定了AMI,也就是使用的服务器镜像ID,instance_type指定了Aws EC2的实例类型,targs中定义的name,就是我们创建的EC2名称

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
terraform init 

初始化时会自动下载与AWS交互所需要的插件等(注意需要访问国外网站)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
terraform fmt 

为了保证编写的tf文件可读性强,使用该命令之后会自动更新文件中的格式和一致性

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
terrform validate 

使用该命令可以检测当前.tf配置文件中的语法是否有效

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
terraform apply 

创建EC2实例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
terraform show 

可以查看我们创建的EC2状态等信息

可以看到在俄勒冈州创建了一个EC2

更新EC2实例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
terraform { 
  required_providers { 
 aws = { 
      source  = "hashicorp/aws" 
      version = "~> 3.27" 
 } 
 } 
  required_version = ">= 0.14.9" 
} 
provider "aws" { 
  profile = "default" 
  region  = "us-west-2"  
} 
resource "aws_instance" "app_server" { 
 - ami = "ami-830c94e3" # 更改为 ami = "ami-08d70e59c07c61a3a" 
 + ami = "ami-08d70e59c07c61a3a" 
  instance_type = "t2.micro" 
  tags = { 
 Name = "ExampleAppServerInstance" 
 } 
} 

在创建好EC2之后,是无法更改镜像的,现在更换镜像,就相当于重装了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
terraform apply 

删除基础设施

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
terraform destroy 

可以看到全部都变成了null,输入yes即可

回到AWS控制台可以看到,EC2已经被停止

变量的调用

官方的机翻有一些生硬,不过理解下来就是,能在不同的文件中进行调用

比如在此之前,我们所有的操作都是通过一个main.tf进行启动的,那么中间有一些比如说名称,可以引用别的文件,也就相当于变量的引用

如下图

这里定义了实例名称,简介,类型,还有名称

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
variable "instance_name" { 
  description = "Value of the Name tag for the EC2 instance" 
  type        = string 
 default = "ExampleAppServerInstance" 
} 

然后放在跟main.tf同一个目录中,然后再main.tf就可以调用这个变量,原理是,terraform会自动在同一个目录中找后缀为.tf的文件

在tags中可以把name改成var.instance_name,也就是我们在variable.tf中定义的变量名称

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
terraform { 
  required_providers { 
 aws = { 
      source  = "hashicorp/aws" 
      version = "~> 3.27" 
 } 
 } 
  required_version = ">= 0.14.9" 
} 
provider "aws" { 
  profile = "default" 
  region  = "us-west-2"  
} 
resource "aws_instance" "app_server" { 
  ami = "ami-08d70e59c07c61a3a" 
  instance_type = "t2.micro" 
  tags = { 
 Name = var.instance_name 
 } 
} 

然后输入terraform apply即可

输入yes后等待即可

那么下次还想更改这个名称,可以通过命令行加上-var即可指定

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
terrform apply -var "instance_name=YetAnotherName" 

可以看到更改的过程,输入yes即可

输出EC2中配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
output "instance_id" { 
  description = "ID of the EC2 instance" 
  value       = aws_instance.app_server.id 
} 
output "instance_public_ip" { 
  description = "Public IP address of the EC2 instance" 
  value       = aws_instance.app_server.public_ip 
} 

可以通过定义output,来输出当前实例的ID和IP地址

输入yes等待即可

随后使用以下命令即可查看实例的ID和IP

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
terraform output 

个人理解

对于这款工具的实现原理,个人理解是,通过调用不同的云厂商提供的SDK,来进行调用,这就跟自己用aws boto3这个库来进行调用aws服务一样。

在Github中搜索terraform可以看到一个官方提供的aws插件

在names.go中可以看到这里import了很多aws的sdk,那么就跟之前想的差不多了,相当于在实现原理上调用了SDK

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
聊聊如何自定义parallelStream的线程池
org/springframework/scheduling/concurrent/ForkJoinPoolFactoryBean.java
code4it
2023/07/08
1.3K0
聊聊如何自定义parallelStream的线程池
org/springframework/scheduling/concurrent/ForkJoinPoolFactoryBean.java
code4it
2023/08/31
6560
聊聊如何自定义parallelStream的线程池
设置并行流最大线程数
还可以使用ForkJoinPool.getCommonPoolParallelism()直接获取ForkJoinPool中允许设置的最大线程数
阿超
2022/08/21
1.3K0
设置并行流最大线程数
Java函数式编程之Stream流编程
如何区分中间操作和终止操作呢?可以根据操作的返回值类型判断,如果返回值是Stream,则该操作为中间操作。如果返回值不是Stream或者为空,则该操作是终止操作。
端碗吹水
2020/09/23
6310
Java函数式编程之Stream流编程
血的教训,如何正确使用线程池 submit 和 execute 方法
血的教训之背景:使用线程池对存量数据进行迁移,但是总有一批数据迁移失败,无异常日志打印
好好学java
2019/07/10
3.6K0
parallelStream的坑,不踩不知道,一踩吓一跳
很多同学喜欢使用lambda表达式,它允许你定义短小精悍的函数,体现你高超的编码水平。当然,这个功能在某些以代码行数来衡量工作量的公司来说,就比较吃亏一些。
xjjdog
2020/09/23
1.1K0
Java并行流Parallel Stream与Fork-Join线程池的关系,莫要乱用、滥用并行流
在说stream之前,给大家分享一个数组匹配性能优化技巧,其实平时注意一些编码的优化,对整个系统的性能优化是有很大帮助的,积少成多。往往一个项目都是毁在一行行粗心代码上的,比如这里多占点内存,那里多占点内存,慢慢内存就不够用了,结果就想着升级机器配置。
Bug开发工程师
2019/11/27
11.6K1
深入浅出parallelStream
今天小强带来java8的Stream,Stream是java8中新增加的一个特性,被java猿统称为流。
程序员小强
2019/06/03
1.3K0
【JDK8 新特性 7】并行的Stream流&parallelStream背后的技术
上一篇文章:(1条消息) 【JDK8 新特性 6】收集Stream流中的结果_一切总会归于平淡的博客-CSDN博客
叫我阿杰好了
2022/11/07
1.1K0
【JDK8 新特性 7】并行的Stream流&parallelStream背后的技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
Java Stream 并不支持指定线程池,实际编码中,有些开发者可能会使用一些“技巧”来指定线程池。实际上,所谓的技巧不仅降低了可读性,而且很容易出现bug。本文将分析并行流式编程的设计思想、”技巧“会带来的问题,并提出相关的解决方案。
程序猿川子
2024/11/13
2270
Java并行流陷阱:为什么指定线程池可能是个坏主意
04-CompletableFuture异步线程 性能
小白和他的朋友门,连续输了10几把游戏, 决定去餐厅吃饭了,3个人,直接点了10盘菜,决定化悲愤为食量
彼岸舞
2022/05/10
3650
Java并行流指北
参考 concurrency - Custom thread pool in Java 8 parallel stream - Stack Overflow
javalover123
2023/07/06
5160
Java并行流指北
java线程池,工作窃取算法
前言 在上一篇《java线程池,阿里为什么不允许使用Executors?》中我们谈及了线程池,同时又发现一个现象,当最大线程数还没有满的时候耗时的任务全部堆积给了单个线程, 代码如下: ThreadP
落跑架构师M
2019/12/30
8620
java线程池,工作窃取算法
java线程池,工作窃取算法
前言 在上一篇《java线程池,阿里为什么不允许使用Executors?》中我们谈及了线程池,同时又发现一个现象,当最大线程数还没有满的时候耗时的任务全部堆积给了单个线程, 代码如下: ThreadP
落跑架构师M
2020/02/11
9470
java线程池,工作窃取算法
啥?用了并行流还更慢了
Java 8给大家带来了一个非常便捷的多线程工具:并行流,一改往日Java多线程繁琐的编程规范,只需要一行代码,就可以让一个多线程跑起来,似乎让很多人忘记了被多线程支配的恐惧,这篇文章给大家分享一个真实的生产故障,由于在消费消息的处理器中使用了Java 8的并行流,导致集群消费消息的能力急速下降,造成线上消息堆积,引发故障。可能有朋友会好奇,到底是什么场景让并行流起了反作用?
苦味代码
2021/03/11
6010
啥?用了并行流还更慢了
【小家java】Java线程池之---ForkJoinPool线程池的使用以及原理
Java 7 引入了一种新的并发框架—— Fork/Join Framework。同时引入了一种新的线程池:ForkJoinPool(ForkJoinPool.coomonPool)
YourBatman
2019/09/03
2.1K0
【小家java】Java线程池之---ForkJoinPool线程池的使用以及原理
关于禁止使用Executors创建线程池的分析
线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。 注意,这里的重点是 不允许。而不是不建议。可见该规范 背后都是血淋淋的生产事故。
冬天里的懒猫
2020/08/04
1.6K0
关于禁止使用Executors创建线程池的分析
异步任务编排神器CompletableFuture
但是当异步任务繁多并且复杂,任务间可能存在依赖关系时,Future接口变得不太好用
菜菜的后端私房菜
2024/08/15
4070
java8 parallelStream性能测试
默认是Runtime.getRuntime().availableProcessors() - 1,这里为7
code4it
2018/09/17
1.3K0
CompletableFuture源码分析以及例子实证
默认情况下 CompletableFuture 会使用公共的 ForkJoinPool 线程池,这个线程池默认创建的线程数是 CPU 的核数 (也可以通过 JVM option:-Djava.util.concurrent.ForkJoinPool.common.parallelism 来设置 ForkJoinPool 线程池的线程数)。
伍六七AI编程
2021/01/13
1.1K0
推荐阅读
相关推荐
聊聊如何自定义parallelStream的线程池
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档