Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Terraform快速入门到入土

Terraform快速入门到入土

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

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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Hadoop基础教程-第12章 Hive:进阶(12.1 内置函数)(草稿)
该文是关于Hive表类型和存储格式的介绍。主要说明了Hive表类型包括内表、外表、分区表、索引表、Text表、SequenceFile表、ORC表、Parquet表等,以及不同表类型之间的区别。同时,还介绍了Hive的存储格式,包括Text格式、SequenceFile格式、ORC格式、Avro格式、JSON格式、MessagePack格式、Thrift格式和ProtoBuf格式等。此外,还提供了相关命令和示例,以帮助用户更好地理解和掌握Hive表类型和存储格式。
程裕强
2018/01/02
9700
Hadoop基础教程-第10章 HBase:Hadoop数据库(10.7 HBase 批量导入)
第10章 HBase:Hadoop数据库 10.7 HBase 批量导入 10.7.1 批量导入数据的方法 向HBase表中导入一条数据可以使用HBase Shell的put命令或HBase API的
程裕强
2018/01/02
2.5K0
Hadoop基础教程-第11章 Hive:SQL on Hadoop(11.6 HQL:DML数据操纵)(草稿)
该文介绍了如何利用Hadoop和Hive进行大数据分析。首先介绍了Hadoop和Hive的基本概念,然后详细讲解了如何使用Hadoop和Hive进行数据清洗、数据转换、数据加载和查询。最后,通过一个具体的实例演示了如何使用Hadoop和Hive进行数据分析。
程裕强
2018/01/02
5700
Hadoop基础教程-第11章 Hive:SQL on Hadoop(11.3 Hive 快速入门)
该文介绍了如何利用Rust开发WebAssembly项目,并介绍了WebAssembly的基本概念、基于Rust的WebAssembly项目如何构建以及如何使用Rust编写WebAssembly代码。此外,文章还介绍了如何使用WebAssembly构建Web应用程序,并提供了示例代码。
程裕强
2018/01/02
9430
Hadoop基础教程-第11章 Hive:SQL on Hadoop(11.8 HQL:排序)(草稿)
该文介绍了如何使用Hive进行数据倾斜处理。首先介绍了Hive数据倾斜产生的原因,然后给出了数据倾斜处理的方法,包括使用MapReduce、Spark、DistCp等。同时,还介绍了Hive数据倾斜处理的注意事项,如合理设置并行度、小文件处理等。通过这些方法,可以有效地解决Hive中的数据倾斜问题,提高数据处理的效率。
程裕强
2018/01/02
9540
Hadoop基础教程-第11章 Hive:SQL on Hadoop(11.7 HQL:数据查询)(草稿)
该文介绍了如何使用Hive进行左连接和内连接,包括创建表、插入数据、建立连接、执行查询和分析结果。
程裕强
2018/01/02
9780
hadoop2-hive的安装和测试
========================================================
Hongten
2018/12/05
4490
hadoop2-hive的安装和测试
Hive-1.2.1_02_简单操作与访问方式
1、Hive创建表格报【Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask.
踏歌行
2020/10/15
5080
Hive-1.2.1_02_简单操作与访问方式
hadoop生态之hive
大数据的生态包含各种各样的组件,hive是其中之一,hive主要是作为数据仓库的工具,简化相关人员的代码工作,只要编写简单的SQL就可以实现mapreduce效果。
SRE运维实践
2021/03/04
6370
hadoop生态之hive
Sqoop导入Oracle数据表到Hive
因为指定了-m 4,也就是4个map处理,-m > 1 必须有主键。因为这个表没有主键,所以需要需要设置-m 1
程裕强
2022/05/06
2.8K0
第十二章 结合flume+mapreduce+hive+sqoop+mysql的综合实战练习
项目大致过程是:flume监控日志文件,定时把文件清洗后上传到hdfs上,上传清晰后的数据是格式化的,可被hive识别,然后hive创建表,写脚本,执行hql语句,把执行结果写到hdfs上,最后为了方便查看,把放在hdfs上的结果通过sqoop放在mysql中。
全栈程序员站长
2022/08/09
7890
第十二章 结合flume+mapreduce+hive+sqoop+mysql的综合实战练习
Hive 本地执行模式
假设你正在运行一些复杂的 Hive 查询,我们都知道这会在后台触发 MapReduce 作业并为你提供输出。如果 Hive 中的数据比较大,这种方法比较有效,但如果 Hive 表中的数据比较少,这样会有一些问题。出现此问题的主要原因是 MapReduce 作业被触发,它是在服务器/集群上触发,因此每次运行查询时,它都会上传到服务器并在那里启动 MapReduce,然后输出。因此,为查询触发执行任务的时间消耗可能会比实际作业的执行时间要多的多。
smartsi
2019/08/07
3.1K0
第五章 更换cdh版本,hive的安装使用,原理讲解
这里由于小编的这里在安装hive时,由于出现了启动hive时出现了和hadoop的版本不一致的原因,并且始终没有解决,所以就改变策略使用cdh版本的hadoop和hive.因为cdh版本的比较系统,兼容性好。因此要重新安装了。
全栈程序员站长
2022/08/05
1.5K0
第五章 更换cdh版本,hive的安装使用,原理讲解
通过多种方式将数据导入hive表
hive官方手册 http://slaytanic.blog.51cto.com/2057708/939950 通过多种方式将数据导入hive表 1.通过外部表导入 用户在hive上建external表,建表的同时指定hdfs路径,在数据拷贝到指定hdfs路径的同时,也同时完成数据插入external表。 例如: 编辑文件test.txt $ cat test.txt  1       hello 2       world 3       test 4       case 字段之间以'\t'分割
闵开慧
2018/04/02
1.1K0
Hive - Hadoop与SQL
Hive是什么 简单来说,通过 Hive 可以使用 SQL 来查询分析 Hadoop 中的大规模数据 Hive 的思路就是将结构化的数据文件映射为数据库表,然后把SQL语句转换为MapReduce任务来执行 下面看一个简单的示例,了解下 Hive 是怎么用的 hive> select count(*) from invites; 结果信息 ...... Total jobs = 1 Launching Job 1 out of 1 ...... Hadoop job information for Stag
dys
2018/04/04
1K0
关于Hive命令的7个小技巧,你都清楚吗?
最近在看冰河大佬写的《海量数据处理与大数据技术实战》,该书涵盖以Hadoop为主的多款大数据技术框架实战的内容,兼顾理论与实操,是市面上难得的技术好书。本篇文章,我就分享一下从中学习到的关于Hive命令的7个小技巧,受益的朋友记得来发三连⭐支持一下哟~
大数据梦想家
2021/01/27
1.6K0
关于Hive命令的7个小技巧,你都清楚吗?
Hive 用户自定义函数 UDF,UDAF
Hive有UDF:(普通)UDF,用户自定义聚合函数(UDAF)以及用户自定义生表函数(UDTF)。它们所接受的输入和生产的输出的数据行的数量的不同的。 UDF UDF操作作用于单个数据行,且产生一个数据行作为输出。 例:strip 我们这里创造一个strip UDF package Hive_UDF; import org.apache.commons.lang.StringUtils; import org.apache.hadoop.hive.ql.exec.UDF; import o
小爷毛毛_卓寿杰
2019/02/13
1.3K0
Hive 用户自定义函数 UDF,UDAF
一脸懵逼学习Hive的使用以及常用语法(Hive语法即Hql语法)
该文介绍了关于数据库连接池的知识点,包括概念、特点、配置方式、调优参数和常见问题。同时,文章还提供了如何正确配置和优化数据库连接池的相关建议,以帮助开发人员更好地掌握和应用该技术。
别先生
2018/01/02
3.7K0
一脸懵逼学习Hive的使用以及常用语法(Hive语法即Hql语法)
HIVE表中分区的删除
不过HIVE本身还提供一种机制,可以删除其中的分区。只要某一条记录在某个分区中,就可以实现用个“转弯”的方式来实现,即先删除分区,再手动去掉这条记录,再导入到分区中。
sparkexpert
2022/05/07
3.5K0
hive sql(十)—— 编写sql语句实现每班前三名,分数一样并列, 同时求出前三名按名次排序的分差
需求 编写sql语句实现每班前三名,分数一样并列, 同时求出前三名按名次排序的分差 建表语句 create table student( sid string,--学号 cid string,--班级号 score string -- 分数 ) row format delimited fields terminated by '\t' ; 数据 #说明: 数据1具有偶然性,适合不重复的情况,实现可以用扩展部分写法1实现 数据2具有通用性,适合重复数据的情况 #数据1 inser
大数据最后一公里
2021/08/05
8470
推荐阅读
相关推荐
Hadoop基础教程-第12章 Hive:进阶(12.1 内置函数)(草稿)
更多 >
交个朋友
加入HAI高性能应用服务器交流群
探索HAI应用新境界 共享实践心得
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验