[

](ssbostan.medium.com/?source=pos…)
6月30日
-
8分钟阅读
[
拯救
Terraform教程 - 第一部分 - 介绍和基本概念

对于Terraform爱好者来说,我有一个好消息!我打算写一个完整的Terraform教程,就像Jenkins教程一样。我打算写一本完整的Terraform教程,就像Jenkins教程一样。在几十篇文章中,你将学到关于Terraform的一切,从零到英雄。让我们开始吧。
从过去到现在!什么被改变了?
在过去,通常任何事情都是由人工或脚本管理的。基础设施被部署在裸机上,而且大多数基础设施平台不提供基于API的服务。在那些日子里,应用程序的发布速度和新版本的部署并不高,应用程序的生命周期(从开发到部署)进展缓慢,开发团队与操作团队(系统管理员)分离,但现在,一切都改变了,一切都增加了速度。应用程序是以敏捷的方式开发的。基础设施平台提供基于API的服务,企业每天发布数百个应用程序版本(新版本)。公司有新的需求!他们需要更快的方法来部署他们的基础结构和应用程序。他们需要新的方法来使他们的基础设施可重复。他们需要新的东西!你知道什么是DevOps,正因为如此,你在这里。作为一个DevOps工程师,你工作的一个典型部分是使基础设施更加可管理和可重复,但你如何才能做到这一点?你的答案是通过代码来实现基础设施!与以前完全不同的方式。
什么是基础设施即代码?
基础设施即代码,或简称IaC,是一种实施基础设施的新方法。在这种基础设施实施模式中,不是手动实施基础设施,而是将所需的基础设施写在代码中,由IaC工具负责在真实的基础设施上实施它。例如,你需要在你的VMware基础设施上有一个虚拟机。在手动方式下,你必须打开VMware控制台,登录到它,到你的数据中心,创建一个新的虚拟机,把它分配到适当的池、数据存储和网络,并指定它的资源,如CPU、内存、硬盘大小等,但通过IaC,你可以写一些代码,IaC工具在你的VMware基础设施上创建该虚拟机,而不需要任何直接的人际互动或手动操作需要。下面的IaC代码是用Terraform DSL语言HCL编写的,它在VMware基础设施上创建一个新的虚拟机。这只是一个介绍基础设施即代码的例子。我将很快解释一切。
provider "vsphere" { user = "ssbostan" password = "justfortest" vsphere_server = "myvcenter.test.local" allow_unverified_ssl = true}
上述代码登录到VMware基础设施,并创建了一个新的虚拟机,具有指定数量的内存、CPU、硬盘等。
为什么我们需要基础设施即代码。
基础设施即代码,IaC,减少了人为的错误,允许我们写一次,部署多次,使生命周期可重复,防止任何手动部署模式的错误配置,允许我们以更好的方式管理我们的基础设施,提供更好的方法来管理基础设施的规模,以及许多其他好处。在阅读这篇文章之前,你检查并知道它的许多好处。
基础设施即代码的编程语言。
从技术上讲,你可以用你选择的任何编程语言编写IaC代码,例如Python、Typescript、Golang等,但在现实世界中,这取决于IaC工具及其支持的语言。例如,使用Terraform CDKTF(Terraform的云开发工具包),你可以用Python、Typescript、Java、C#和Go编写IaC代码。除了知名的编程语言,IaC工具还可以提供其DSL语言。就Terraform而言,你也可以用HCL(HashiCorp Configuration Language)编写IaC代码。其他一些IaC工具,如Pulumi,除了常见的编程语言外,还可以用YAML编写IaC。我将很快发布完整的Pulumi教程。
什么是Terraform?
Terraform是DevOps领域著名的IaC工具,但我想把它称为 "生命周期即代码 "工具,因为除了基础设施外,你还可以管理众多应用程序的生命周期,如Grafana、Elasticsearch、Gitlab、Jenkins等。在Terraform及其供应商的帮助下,你可以专注于编写代码,把部署和管理阶段留给Terraform。如今,Terraform已经成为DevOps生命周期中最重要的部分之一。
Terraform架构。
Terraform是一个基于插件的工具。因此,它有一个核心应用程序,即Terraform,以及数百个插件。核心应用程序提供一个统一的层来管理IaC代码,它负责安装所需的插件,调用它们,管理状态等。另一方面,插件在这里与真正的基础设施平台和应用程序进行通信,如AWS、GCP、Azure、Grafana、Jenkins、Gitlab等。这些插件有些是由HashiCorp团队正式维护的,有些是由第三方维护的。每个人都可以编写和发布自己的插件。你可以在Terraform Registry网站上找到数以百计的插件。

Terraform插件分为两种类型。提供者和供应者。提供者是一个插件,负责通过API连接到真实的基础设施或应用程序,并创建、修改和删除对象和资源,而供应者是一个插件,负责连接到已供应的基础设施并对其进行一些修改。例如,你可以使用AWS PROVIDER来配置一个EC2实例,并在配置后使用remote-exec PROVISIONER来对其执行一些命令。你应该注意,使用PROVISIONER根本不是最好的做法,它们是作为最后的解决方案提供的。
现在就开始吧,用Terraform做。
在这一系列的教程和文章中,我打算用HCL语言解释Terraform。我将为CDKTF发布另一个使用普通编程语言的课程。因此,让我们开始吧。看看下面的代码。
所有的terraform代码都应该写在以**.tf** 为扩展名的文件中,对于小型和非模块化的代码,通常是main.tf。每个terraform文件可能由各种代码块组成,如资源、数据、变量、输出等。例如,在上面的代码中,我们有一个资源块。所有的terraform块都使用以下编码惯例。
<BLOCK TYPE> [<BLOCK PARAMETER1> <BLOCK PARAMETER2> ...] { <ARGUMENT NAME1> = <ARGUMENT VALUE1> <ARGUMENT NAME2> = <ARGUMENT VALUE2> .... <INNER BLOCK> { <ARGUMENT NAME1> = <ARGUMENT VALUE1> <ARGUMENT NAME2> = <ARGUMENT VALUE2> }}
每个代码块都由其类型来标识,并且可以有零个或多个参数。例如,畸形块没有参数,变量块有一个参数,而资源块有两个参数。每个块可以有零个或多个参数和内部块。例如,在上面的代码intro1.tf中,我们有一个资源块有两个参数和两个论据。下面的代码是一个例子,让你的眼睛熟悉各种块。
要安装Terraform,请使用官方的安装方法。
将上述代码保存到main.tf文件中,并运行以下命令。
terraform init

运行init命令后,你可以在main.tf文件旁边看到*.terraform目录和.terraform.lock.hcl*。

初始化后,运行plan命令。
terraform plan

然后运行apply命令。
terraform apply

运行apply命令后,你可以看到myfile.txt以及之前文件旁边的terraform.tfstate文件。

让我们来描述一下这个过程、文件、目录等。
通过运行terraform init 命令,terraform通过创建初始文件、加载远程状态、下载插件、模块等来初始化当前工作目录。当前项目中所有使用的插件将被下载到*.terraform目录中,.terraform.lock.hcl*指向使用的插件的版本以及它们的签名。
如果你使用一个远程后台来存储你的Terraform状态文件,terraform.tfstate,init命令将在初始化过程中加载它。我将在后面完全解释。
通过运行terraform plan 命令,你可以检查terraform打算做什么,创建/销毁等。通过这个命令,你可以看到接下来会发生什么。Plan命令并不改变实际基础设施中的任何东西。你可以在不运行计划步骤的情况下应用你的改变。它只是为了在做出行动之前进行检查。
最后,通过运行terraform apply 命令,Terraform将进行真正的操作,资源将在远程的真实基础设施上被创建/销毁。通过运行这个命令,你会看到什么会被改变,就像plan命令一样,接受之后,部署过程就开始了,之后,Terraform会制作terraform.tfstate文件,这是Terraform生态系统的重要文件。我将在接下来的文章中对其进行深入解释。
所解释的IaC代码将创建一个名为myfile.txt的文件,其中有指定的内容。内容从定义的变量中读取,在创建文件后,该文件的ID将被显示为输出。
terraform output

如果我们想销毁基础设施或任何先前部署的资源,我们可以使用destroy命令。使用destroy命令,所有Terraform部署的资源将被销毁。请注意,如果你摧毁了什么东西,你就不能用Terraform恢复它。如果某个东西被摧毁了,它就完全消失了。
terraform destroy

最后的话和结论。
Terraform是DevOps领域的一个很酷的工具。它使DevOps工程师的生活更加甜蜜和轻松。在Terraform的帮助下,你可以用代码管理很多东西。它使你的基础设施和应用程序的生命周期可重复,更易于管理。我有很多关于Terraform的东西要教你。为了支持这个教程,只需拍拍手,并在下面的GitHub存储库中STAR STAR。
[
ssbostan/terraform-tutorial
你现在还不能执行这个动作。你用另一个标签或窗口登录。你在另一个标签页或窗口中签出了...
github.com