多年来,云开发已经发生了重大的范式转变。更新且更复杂的应用程序被迅速部署到云端,以最小化停机时间。在这一切过程中,基础架构即代码的概念和各种工具已经出现,以简化应用程序开发的过程。
也许你会想:什么是基础架构即代码?它如何改善开发过程和体验,Terraform又如何融入其中?好的,我们将在本指南中探讨所有这些问题。但在开始之前,这里有一些先决条件:
-
对云和云术语的基本了解
-
访问PC以实施代码示例
-
一个GCP帐户
有了这些,让我们开始吧。
以下是我们将涵盖的内容:
基础设施即代码(IaC)概述
基础设施即代码指的是使用基于代码的配置文档生成云基础设施工具和应用程序。在运行时,此过程自动化创建数据库、虚拟机和服务器的顺序和流程。这通过减少手动部署云服务的频率,尤其是对于多个相同服务,提升了用户体验。
基础设施即代码有两种不同的方法:命令式方法和声明式方法。
当您使用声明式方法进行基础设施生成时,您只需详细说明您期望/想要的基础设施输出,然后您使用的基础设施即代码(IaC)工具会计算出如何生成该输出。
另一方面,命令式方法涉及指定实现所需基础设施状态的确切步骤。虽然命令式方法似乎更适合复杂的基础设施设置,但声明式方法同样有效。
一些工具能够同时支持这两种方法,而其他工具则只适合其中一种或另一种。全球使用的一些流行IaC工具的例子包括Terraform IaC、AWS Cloud Formation、Ansible和Pulumi、Chef等。
顾名思义——基础设施即代码——创建基础设施的代码是用IaC领域内的各种模板语言编写的。流行的模板语言包括JSON、YAML、ARM模板、HCL、Heat脚本等。
您还可以使用脚本工具来执行云基础设施。一些流行的工具包括Bash和PowerShell。这些工具有时会预装在大多数个人电脑上。
在所有这些工具中,Terraform因为各种原因而独特 – 这也是我们将在本文中研究的工具。
什么是Terraform?
Terraform是由HashiCorp于2014年开发的开源工具。它经过多年的发展,现在作为一个云无关的基础设施工具,允许您在多个云服务提供商之间创建基础设施。
Terraform还提供了Terraform Cloud,这是一个基于云的软件即服务工具。它允许基于云的部署云工具,而不是使用我们在已废弃的Terraform CLI工具中使用的旧的基于本地的方法。
此外,与其他利用模板语言的IaC工具一样,Terraform用于创建基础设施的模板框架是HashiCorp模板语言(HCL)。
Terraform的优点
现在我将重点介绍作为云工程师使用Terraform的一些好处,以及该工具在云生态系统中的关键作用。
1. 声明式方法
这种对云基础设施自动化的方法确保要部署的所有必需基础设施(数据库、服务器等)都被明确说明并相应执行。这有助于避免冲突。
2. 冲突处理
除了其高效的云工具自动化能力外,Terraform还具有一些强大的冲突检测和处理属性。它处理冲突的一种方式是通过Terraform plan
功能。这个功能突出显示基础架构编排的任何被感知或潜在的冲突,这使得在部署之前可以轻松进行更正。我将在后续章节中进一步讨论这一点。
3. 云无关
Terraform是一个多用途、多云自动化服务提供商,具有跨主要云服务提供商(AWS、GCP和Azure)的高效基础设施自动化能力。它还允许混合和跨提供商的自动化。
4. 用户友好
Terraform是最大的云自动化工具之一,拥有庞大的用户社区。它有广泛的适合初学者的教程,帮助您快速掌握这个工具。这是其文档的链接,让您可以深入了解。
5. 文件管理能力
Terraform会在本地计算机上自动创建自动化状态的本地备份,以确保在出现问题时能够立即召回和处理文件。它还提供远程备份选项,以便在必要时备份到远程云服务提供商。
6. 版本控制
就像Git版本控制系统一样,Terraform有一个内置的版本控制系统,让您跟踪Terraform文件的更改。如果当前版本中存在错误,它还可以让您返回到先前的代码版本。
7. 代码重用性
Terraform在其开发者文档页面上提供了各种代码模板,便于轻松重用。
既然我们已经强调了Terraform的好处,让我们学习一些Terraform中常用的术语及其含义。
Terraform中常用术语
在开始使用Terraform之前,您应该熟悉一些经常出现的关键术语。以下是您需要了解的内容:
-
提供者:在Terraform中,提供者是一个编程接口,让Terraform与各种API和云服务进行交互。例如,您可以使用提供者与诸如GCP或Azure之类的云服务提供商进行接口交互。
-
模块:模块是专门在Terraform框架内创建的可重用组件,可让您轻松编排云服务。您还可以在模块中存储有关云服务的关键信息,然后使用模块变量对其进行修改以确保唯一性。
-
资源: Terraform 中的资源指的是要创建的云基础设施组件。示例包括云网络、虚拟机、可用区等基础设施。
-
状态: Terraform 中状态的概念构成其效率的基础。状态跟踪您的基础设施资源当前的配置,并包含 Terraform 创建、修改或删除的每个资源的详细信息。Terraform 的版本控制系统使用它来跟踪您对代码文件所做的任何更改,并使用该信息根据需要销毁和提供基础设施。
-
工作空间: 工作空间的功能类似于版本控制系统,因为它在工作文件周围创建了一种约束。工作空间让您以干净且隔离的方式在同一后端内管理单个基础架构配置的多个实例。您可以使用工作空间来区分开发、暂存和生产等环境,同时使用相同的Terraform配置。
演示项目: 如何编写Terraform配置
在本节中,我们将深入探讨如何编写我们的第一个Terraform文件,以仅使用几行代码编排Google Cloud程序虚拟机。但在开始之前,我们将讨论您在实施演示项目之前应了解的各种命令。
常见的Terraform命令
-
Terraform init
: 此命令初始化Terraform工具并下载必要的特定于云提供商的文件。它还在Terraform和所涉及的云提供商之间建立连接。在我们的情况下,是GCP和Terraform提供商之间的连接。 -
Terraform fmt
:该命令会自动确保最佳的代码格式和缩进。它确保代码的有序执行并最小化任何错误。 -
Terraform plan
:该命令概述了Terraform代码执行的步骤,并检测在执行过程中可能发生的任何错误。它还会突出显示可能阻碍执行的Terraform代码中的任何错误。最后,它与Terraform状态管理一起工作,以检测状态的任何变化,并在必要时取消提供或生成任何额外的云服务。 -
Terraform apply
:此命令执行由Terraform plan
命令实施的计划的Terraform状态。 -
Terraform destroy
:这个命令是Terraform方案中的最终命令,用于停用或销毁使用Terraform apply命令创建的所有云服务。重要的是,您应按顺序执行上面列出的命令,以确保正确创建基础架构。
创建IaC-Powered GCP虚拟机
现在您已经学会了这些重要命令,让我们通过创建我们的第一台IaC-powered GCP虚拟机来测试它们。
在您的代码编辑器中,键入以下代码:
provider "google" {
project = "your-gcp-project-id" # Replace with your GCP Project ID
region = "us-central1"
zone = "us-central1-a"
}
这段代码突出显示了我们用于生成所需云资源的云提供商。在我们的情况下,是Google云计划。分配给它的名称只是“google”。其他云提供商如AWS和Azure分别是“aws”和“azure”。
第二行标识了GCP订阅标识符,该标识符对于每个GCP帐户都是唯一的(并有助于促进准确的集成)。您应该在提供的空间中使用自己的标识符。
您还需要包括一个合适的资源区域和资源可用区。这将作为我们将创建的虚拟机的物理基础,以便我们可以运行它。在这种情况下,我分别选择了美国中部区域和1-a可用区。您可以在这里阅读有关云区域和可用区的更多信息。
resource "google_compute_instance" "vm_instance" {
name = "example-vm"
machine_type = "e2-medium"
boot_disk {
initialize_params {
image = "debian-cloud/debian-11"
}
}
上面的代码片段指定了将被编排的确切计算资源,我们的情况是一个被编码为“vm_instance”的虚拟机实例。’example-vm’是我们希望为此项目创建的虚拟机分配的名称。重要的是注意虚拟机名称也必须是唯一的。我们选择的虚拟机类型是E2(通用型)-中型VM。您可以在这里获取有关虚拟机类型的更多信息。
此外,我们还指定了预期引导操作系统(“boot_disk”),在我的情况下,它是Debian Linux操作系统第11版的映像。
network_interface {
network = "default" # Attach to the default VPC network
access_config {
}
}
output "instance_ip" {
value = google_compute_instance.vm_instance.network_interface[0].access_config[0].nat_ip
}
为了完成虚拟机的创建,我们需要设置一个虚拟网络,以便远程访问虚拟机。网络接口块将虚拟机连接到由GCP提供的默认VPC(虚拟专用云)网络。如果没有VPC网络,我们将无法与虚拟机进行交互。输出块还会在终端显示默认访问IP地址,我们可以使用该地址连接到虚拟机。
以下是最终预期的代码:
provider "google" {
project = "your-gcp-project-id" # Replace with your GCP Project ID
region = "us-central1"
zone = "us-central1-a"
}
resource "google_compute_instance" "vm_instance" {
name = "example-vm"
machine_type = "e2-medium"
boot_disk {
initialize_params {
image = "debian-cloud/debian-11"
}
}
network_interface {
network = "default" # Attach to the default VPC network
access_config {
}
}
output "instance_ip" {
value = google_compute_instance.vm_instance.network_interface[0].access_config[0].nat_ip
}
接着,我们将使用下面图片中突出显示的命令来执行这段代码:
命令terraform -v
确认Terraform已成功安装在终端上。预期输出将是安装的Terraform工具版本。
接下来执行的命令是terraform init
函数,它将初始化与云服务提供商的通信,即在我们的情况下是GCP。还会安装所有必要的依赖项。
还会运行terraform fmt
命令以确保充分的代码格式和缩进。然后顺序执行terraform plan
命令。
从上面的图片中,您可以看到Terraform打算使用哪些步骤生成预期的虚拟机。
成功执行Terraform plan后,我们将执行terraform apply
函数来执行Terraform plan概述的步骤。
这将生成一个提示,要求确认Terraform执行,如上所示。输入“Yes”将允许操作顺利进行。
执行成功后,将显示如上所示的成功消息。至此,我们仅通过代码创建了我们的云基础设施。然后可以调用terraform destroy
命令来删除创建的虚拟机。
结论
在本文中,您了解了基础设施即代码的基本知识。我们讨论了Terraform、它的好处,以及一些关键特性和命令。我们还通过演示项目说明了它的使用。
为了进一步提升您的知识,您可以查阅Terraform的文档以获取更多代码示例。我也建议您利用新获得的知识来自动化一个具有实际用途的项目。
如有任何评论或问题,请随时给我留言。您还可以在这里查看我的其他文章。下次见,继续编码!
Source:
https://www.freecodecamp.org/news/a-beginners-guide-to-terraform-infrastructure-as-code-in-practice/