检查点
Creating Resources in terraform
/ 30
Change Infrastructure
/ 20
Destructive Changes
/ 20
Create Resource Dependencies
/ 20
Create bucket dependent instance
/ 10
使用 Terraform 实现基础设施即代码
本实验由 Google 与我们的合作伙伴 Hashicorp 共同开发。如果您在账号个人资料中选择接收产品动态、通知和优惠信息,那么我们可能会与实验赞助商 Hashicorp 共享您的个人信息。
GSP750
概览
Terraform 是 HashiCorp 开发的一款基础设施即代码产品。这款工具可以采用安全、可重复的方式构建、更改和管理基础设施。借助 Terraform,运营人员和基础设施团队可以采用名为 HashiCorp Configuration Language (HCL) 的配置语言进行用户可理解的自动化部署,以此来管理环境。
基础设施即代码是指在一个或多个文件中管理基础设施的过程,而不是在界面中手动配置资源。在这种情况下,资源可以是给定环境中基础设施的任何部分,例如虚拟机、安全群组、网络接口等。概括来讲,Terraform 可让运营人员使用 HCL 针对几乎所有提供商(AWS、Google Cloud、GitHub、Docker 等)创建包含其所需资源的定义的文件,并在应用时自动创建这些资源。
简单的部署工作流基本上包含以下步骤:
- 限定范围 - 确认需要为给定项目创建的资源。
- 编写 - 根据限定范围的参数使用 HCL 创建配置文件。
-
初始化 - 在包含配置文件的项目目录中运行
terraform init
。这将为项目下载正确的提供程序 (Provider) 插件。 -
规划与应用 - 首先运行
terraform plan
来验证创建过程,然后运行terraform apply
以创建实际资源和状态文件。状态文件可用于将配置文件中今后的更改与部署环境中实际存在的内容进行比较。
目标
在本实验中,您将学习如何执行以下任务:
- 使用 Terraform 构建、更改和销毁基础设施
- 使用 Terraform 创建资源依赖项
- 使用 Terraform 预配基础设施
设置和要求
点击“开始实验”按钮前的注意事项
请阅读以下说明。实验是计时的,并且您无法暂停实验。计时器在您点击开始实验后即开始计时,显示 Google Cloud 资源可供您使用多长时间。
此实操实验可让您在真实的云环境中开展实验活动,免受模拟或演示环境的局限。我们会为您提供新的临时凭据,让您可以在实验规定的时间内用来登录和访问 Google Cloud。
为完成此实验,您需要:
- 能够使用标准的互联网浏览器(建议使用 Chrome 浏览器)。
- 完成实验的时间 - 请注意,实验开始后无法暂停。
如何开始实验并登录 Google Cloud 控制台
-
点击开始实验按钮。如果该实验需要付费,系统会打开一个弹出式窗口供您选择付款方式。左侧是实验详细信息面板,其中包含以下各项:
- 打开 Google Cloud 控制台按钮
- 剩余时间
- 进行该实验时必须使用的临时凭据
- 帮助您逐步完成本实验所需的其他信息(如果需要)
-
点击打开 Google Cloud 控制台(如果您使用的是 Chrome 浏览器,请右键点击并选择在无痕式窗口中打开链接)。
该实验会启动资源并打开另一个标签页,显示登录页面。
提示:请将这些标签页安排在不同的窗口中,并将它们并排显示。
注意:如果您看见选择账号对话框,请点击使用其他账号。 -
如有必要,请复制下方的用户名,然后将其粘贴到登录对话框中。
{{{user_0.username | "<用户名>"}}} 您也可以在实验详细信息面板中找到用户名。
-
点击下一步。
-
复制下面的密码,然后将其粘贴到欢迎对话框中。
{{{user_0.password | "<密码>"}}} 您也可以在实验详细信息面板中找到密码。
-
点击下一步。
重要提示:您必须使用实验提供的凭据。请勿使用您的 Google Cloud 账号凭据。 注意:在本次实验中使用您自己的 Google Cloud 账号可能会产生额外费用。 -
继续在后续页面中点击以完成相应操作:
- 接受条款及条件。
- 由于该账号为临时账号,请勿添加账号恢复选项或双重验证。
- 请勿注册免费试用。
片刻之后,系统会在此标签页中打开 Google Cloud 控制台。
激活 Cloud Shell
Cloud Shell 是一种装有开发者工具的虚拟机。它提供了一个永久性的 5GB 主目录,并且在 Google Cloud 上运行。Cloud Shell 提供可用于访问您的 Google Cloud 资源的命令行工具。
- 点击 Google Cloud 控制台顶部的激活 Cloud Shell 。
如果您连接成功,即表示您已通过身份验证,且当前项目会被设为您的 PROJECT_ID 环境变量所指的项目。输出内容中有一行说明了此会话的 PROJECT_ID:
gcloud
是 Google Cloud 的命令行工具。它已预先安装在 Cloud Shell 上,且支持 Tab 自动补全功能。
- (可选)您可以通过此命令列出活跃账号名称:
-
点击授权。
-
现在,输出的内容应如下所示:
输出:
- (可选)您可以通过此命令列出项目 ID:
输出:
输出示例:
gcloud
, in Google Cloud, refer to the gcloud CLI overview guide.
任务 1. 构建基础设施
Terraform 已预安装在 Cloud Shell 中。既然 Terraform 已经安装,您就可以直接开始创建一些基础设施。
首先创建一个名为 main.tf
的示例配置文件。Terraform 会将扩展名为 .tf
或 .tf.json
的文件识别为配置文件,并会在运行时加载这些文件。
- 创建
main.tf
文件:
-
在 Cloud Shell 的工具栏中点击打开编辑器按钮(如需在 Cloud Shell 与代码编辑器之间切换,您可以根据需要点击打开编辑器或打开终端图标,或点击在新窗口中打开按钮,在单独的标签页中打开编辑器)。
-
在编辑器中,将如下内容添加到
main.tf
文件中。
terraform {}
块。Terraform 块
Terraform 需要通过 terraform {}
块来确定从 Terraform Registry 中下载哪个提供程序。在前面的配置中,google
提供程序的来源定义为 hashicorp/google
,这是 registry.terraform.io/hashicorp/google
的简写形式。
您还可以为 required_providers
块中定义的每个提供程序分配一个版本。version
并非强制参数,但我们建议您使用。此参数用于将提供程序限制为某个特定的版本或特定范围的版本,以防下载可能包含破坏性更改的新提供程序。如果没有指定版本,Terraform 将会在初始化期间自动下载最新的提供程序。
如需了解详情,请参阅 HashiCorp Terraform 网站上的提供程序相关要求。
提供程序
provider
块用于配置指定的提供程序,在本示例中为 google
。提供程序负责创建和管理资源。如果使用一项 Terraform 配置来管理多个不同提供程序提供的资源,则可能会存在多个 provider 块。
初始化
对于新配置(或从版本控制系统签出某项现有配置后),需要运行的第一个命令是 terraform init
,它将对各项本地设置和数据进行初始化,以供后续的命令使用。
- 在
main.tf
文件所在的同一目录中,运行terraform init
命令以初始化新的 Terraform 配置:
创建资源
- 运行
terraform apply
命令立即应用配置:
在输出中,资源 "google_compute_network" "vpc_network"
旁有一个 +
号,表示 Terraform 将创建此资源。其下方显示的是将要设置的属性。如果显示的值为 (known after apply)
,表示在创建资源前将不知道相关值。
在成功创建计划后,Terraform 将会暂停,等到计划获得批准后才会继续运行。如果计划中有任何不正确或危险之处,可以放心地在此处取消计划,这样基础设施就不会发生任何变更。
如果 terraform apply
运行失败并显示错误,请查看错误消息并修复发生的错误。
- 如果计划看起来可以接受,请在出现确认提示时输入
yes
继续操作。
执行计划可能需要几分钟的时间,因为 Terraform 需要等待网络成功创建:
Terraform 现已完成所有操作!您可以前往 Cloud 控制台查看预配的网络。
- 在控制台的导航菜单中,点击 VPC 网络。您将看到
terraform-network
已预配完成。
- 在 Cloud Shell 中,运行
terraform show
命令来检查当前状态:
您可以引用这些值来配置其他资源或输出,本实验的后续部分将会介绍相关内容。
点击“检查我的进度”以验证是否完成了以下目标:
任务 2. 更改基础设施
在上一部分中,您已使用 Terraform 创建了一个基本的基础设施:一个 VPC 网络。在本部分中,您将修改相关配置,并了解 Terraform 处理更改的方式。
基础设施不断发展演变,而 Terraform 可以帮助您管理和实施这些变更。当您更改 Terraform 配置后,Terraform 将会构建一个执行计划,该计划仅修改达到预期状态所必要的内容。
利用 Terraform 来更改基础设施,您将可以对配置和状态进行版本控制,从而了解基础设施随时间演变的情况。
添加资源
您可以通过以下方式添加新资源:将它们添加到 Terraform 配置中,然后运行 terraform apply
命令对其进行预配。
- 在编辑器中,向
main.tf
中添加一个计算实例资源:
此资源中还包含几个参数。其中 name 和 machine_type 是简单的字符串,而 boot_disk
和 network_interface
则是更为复杂的代码块。您可以在 google_compute_instance 文档中查看所有可用的选项。
在本示例中,您的计算实例将使用 Debian 操作系统,并连接到您先前创建的 VPC 网络。请注意此配置如何使用 google_compute_network.vpc_network.name
来表示网络的名称属性,其中 google_compute_network.vpc_network
为 ID,与块中用于定义网络的值相匹配,而 name
则是该资源的属性。
只要包含 access_config
块,即便其中没有任何参数,也能确保实例可通过互联网访问。
- 现在,运行
terraform apply
命令来创建计算实例:
- 在出现确认提示时,再次输入
yes
。
这是一个相当简单的更改,您向配置中添加了一个名为“vm_instance”的“google_compute_instance”资源,Terraform 在 Google Cloud 中创建了该资源。
更改资源
除了创建资源外,Terraform 还可以对这些资源进行更改。
- 向“vm_instance”中添加一个
tags
参数,如下所示:
- 再次运行
terraform apply
命令以更新实例:
- 前缀
~
表示 Terraform 将就地更新资源。您可以输入yes
直接应用所做的更改,Terraform 即会向您的实例中添加标记。
点击“检查我的进度”以验证是否完成了以下目标:
破坏性更改
破坏性更改是指需要提供商替换现有资源而非更新资源的更改。当云服务提供商不支持以您的配置中所描述的方式更新资源时,一般就会出现这种情况。
更改实例的磁盘映像就是破坏性更改的一个示例。
- 在您的配置文件中,将
vm_instance
资源中的boot_disk
块更改为以下内容:
- 现在,再次运行
terraform apply
命令,看看 Terraform 是如何将此更改应用于现有资源的:
前缀 -/+
表示 Terraform 会先销毁现有资源,然后再重新创建资源,而不是就地进行更新。虽然可以就地更新部分特性(带有前缀 ~
),但若要更改实例的启动磁盘映像,则需要重新创建映像。Terraform 和 Google Cloud 提供程序将为您处理这些细节问题,执行计划中会明确说明 Terraform 将执行的操作。
此外,执行计划中会指明,之所以需要替换实例,是因为磁盘映像发生了变化。根据这些信息,您可以对更改进行调整,以便有可能在无法接受销毁/创建更新的情况下避免此类更新。
- 在继续执行操作之前,Terraform 会再次显示提示,要求您批准执行计划。输入
yes
以执行计划好的步骤。
正如执行计划中所指明的那样,Terraform 先销毁了现有实例,然后创建了一个新实例来取代该实例。您可以再次运行 terraform show
命令来查看与此实例相关联的新值。
销毁基础设施
现在,您已经了解如何构建和更改基础设施。在继续学习如何创建多个资源和显示资源依赖项之前,您将了解如何彻底销毁由 Terraform 托管的基础设施。
在生产环境中,销毁基础设施这种情况很少发生。但是,如果您使用 Terraform 来启动多种环境(如开发、测试和预演),则销毁基础设施通常会很有用。
您可以使用 terraform destroy
命令来销毁资源,该命令与 terraform apply
类似,只不过其行为看起来像是已经从配置中移除所有资源。
- 请试着运行
terraform destroy
命令。输入yes
以执行该计划并销毁基础设施:
前缀 -
表示相关实例和网络将被销毁。与执行 apply 命令时类似,Terraform 在进行任何更改前会显示执行计划并等待批准。
与 terraform apply
命令一样,Terraform 会确定销毁各项资源时必须遵循的顺序。如果 VPC 网络中仍然存在资源,Google Cloud 将不允许删除该网络,因此 Terraform 将等到实例销毁后才会销毁网络。在执行相关操作时,Terraform 会创建一个依赖关系图以确定正确的操作顺序。在涉及多个资源的更复杂的情况下,只要不产生隐患,Terraform 会并行执行这些操作。
点击“检查我的进度”以验证是否完成了以下目标:
任务 3. 创建资源依赖项
在本部分中,您将详细了解资源依赖项,以及如何使用资源参数与其他资源共享某一资源的信息。
实际的基础设施包含各种资源和资源类型。Terraform 配置可能会包含多项资源和多种资源类型,而这些资源类型甚至还会涵盖多个提供程序。
在本部分中,我们将通过一个基本的示例向您展示,如何配置多项资源以及如何使用资源特性来配置其他资源。
- 重新创建网络和实例。出现提示时,输入
yes
回应,系统将会创建相应资源:
分配静态 IP 地址
- 现在,在
main.tf
中添加相关内容,为虚拟机实例分配一个静态 IP 地址:
此示例与先前添加虚拟机实例资源的示例类似,只不过这次您要创建一个“google_compute_address”资源类型。此资源类型会为您的项目分配预留的 IP 地址。
- 然后,运行
terraform plan
命令:
使用 terraform plan
可以查看系统将会创建的内容:
plan
命令与 terraform apply
命令不同,前者只会显示将更改的内容,实际上并不会直接应用更改。请注意,到目前为止您所做的唯一更改是添加静态 IP。接下来,您需要将 IP 地址附加到实例。
- 请按如下方式更新实例的
network_interface
配置:
access_config
块有几个可选参数,在此示例中,您需要将 nat_ip
设置为该静态 IP 地址。当 Terraform 读取此配置时,将会执行以下操作:
- 确保先创建
vm_static_ip
,再创建vm_instance
- 将
vm_static_ip
的属性保存到状态中 - 将
nat_ip
设置为vm_static_ip.address
属性的值
- 再次运行 terraform plan 命令,但这次要保存计划:
采用这种方式保存计划可确保您将来应用完全相同的计划。如果您尝试应用计划所创建的文件,Terraform 首先会检查并确保已进行完全相同的更改,然后才会应用计划。
在此示例中,您可以看到,Terraform 将会创建一个新的 google_compute_address
,并更新现有的虚拟机以使用该地址。
- 运行
terraform apply "static_ip"
,查看 Terraform 计划如何应用这一更改:
如上所示,在修改虚拟机实例前,Terraform 先创建了静态 IP 地址。由于插值表达式会将 IP 地址传递给实例的网络接口配置,因此 Terraform 能够推断出依赖项,并知道必须先创建静态 IP 地址,然后再更新实例。
点击“检查我的进度”以验证是否完成了以下目标:
隐式和显式依赖项
通过研究插值表达式中使用的资源特性,Terraform 能够自动推断出一项资源何时会依赖另一项资源。在上例中,对 google_compute_address.vm_static_ip.address
的引用会针对名为 vm_static_ip
的 google_compute_address
创建一个“隐式依赖项”。
Terraform 根据这一依赖项信息确定创建和更新不同资源的正确顺序。在上例中,Terraform 知道必须先创建 vm_static_ip
,然后再更新 vm_instance
以使用该 IP。
让 Terraform 了解这些关系的主要途径是通过插值表达式推断隐式依赖项,应尽可能使用此方式。
Terraform 有时无法了解资源之间的依赖关系。在这种情况下,可以使用 depends_on
参数。该参数可添加至任何资源,并接受要创建显式依赖关系的资源列表作为其值。
例如,假设您将在实例中运行的某个应用预计会使用特定的 Cloud Storage 存储桶,但是该依赖关系是在应用代码内部配置的,因此 Terraform 就无法了解这一依赖关系。在这种情况下,您可以使用 depends_on
来明确声明两者的依赖关系。
- 在
main.tf
中添加如下内容,以添加 Cloud Storage 存储桶和对该存储桶有显式依赖关系的实例:
UNIQUE-BUCKET-NAME
替换为一个不重复的有效存储桶名称。使用自己的用户名和日期构成的存储桶名称通常不会重复。您可能不确定应在配置中的何处定义这些资源。在 Terraform 配置文件中定义资源的顺序不会影响到 Terraform 应用更改的方式。您可以按照最适合您和您团队的方式来整理配置文件。
- 现在,运行 terraform plan 和 terraform apply 命令,以实际应用这些更改:
点击“检查我的进度”以验证是否完成了以下目标:
- 在继续操作之前,先从您的配置中移除这些新资源,然后再次运行
terraform apply
命令将其销毁。在本实验中,您将不会再使用存储桶或第二个实例。
任务 4. 预配基础设施
您此时启动的计算实例基于给定的 Google 映像创建,但未安装其他软件,也未应用任何配置。
Google Cloud 允许客户管理自己的自定义操作系统映像。这样可以有效确保根据您的需要来预先配置使用 Terraform 预配的实例。Packer 是完成此任务的理想工具,该工具中包含适用于 Google Cloud 的构建器。
Terraform 使用预配工具上传文件、运行 Shell 脚本,或者安装和触发配置管理工具等其他软件。
定义预配工具
- 如需定义预配工具,请将配置中用于定义第一个
vm_instance
的资源块修改为以下内容:
这会在 resource
块中添加一个 provisioner
块。您可以添加多个 provisioner
块,以定义多个预配步骤。Terraform 支持多个预配工具,但在本示例中,您使用的是 local-exec
预配工具。
local-exec
预配工具会在运行 Terraform 的机器(而不是虚拟机实例本身)本地执行命令。您使用的是此预配工具,而非其他预配工具,因此我们目前不必担心如何指定连接信息。
这也显示了一个较以往更为复杂的字符串插值示例。每个虚拟机实例可以具有多个网络接口,所以可以依照大多数编程语言遵循的规则,使用 network_interface[0]
来指代第一个接口(从 0 开始计数)。每个网络接口还可以具有多个 access_config 块,同样的,您可以指定第一个 access_config 块。
- 运行
terraform apply
命令:
此时,输出内容一开始可能有点令人困惑。
Terraform 发现不需要执行任何操作,如果您检查一下,就会发现您的本地机器上没有 ip_address.txt
文件。
Terraform 对待预配工具的方式与其他参数不同。只有在创建某个资源后,预配工具才会运行,但添加预配工具并不会强制销毁和重新创建该资源。
- 使用
terraform taint
命令指示 Terraform 重新创建实例:
当您下一次执行 apply
命令时,Terraform 将会销毁有污点的资源并重新创建一个资源。
- 现在运行
terraform apply
命令:
- 查看
ip_address.txt
文件中的内容,确认一切正常。
该文件包含 IP 地址,与您的要求一致。
失败的预配工具和有污点的资源
如果成功创建了某个资源,但预配步骤失败,Terraform 将会出错并将该资源标记为“有污点”。有污点的资源会继续存在,但由于预配失败,不应将其视为可安全使用。
当您生成下一个执行计划时,Terraform 将会移除任何有污点的资源并创建新资源,而且在创建后再次尝试进行预配。
销毁预配工具
您还可以定义仅在执行销毁操作时运行的预配工具。这些预配工具将有助于您执行系统清理和数据提取等操作。
对于许多资源而言,建议您尽可能使用内置的清理机制(如初始化脚本),但必要时也可以使用预配工具。
本实验中不提供任何销毁预配工具的示例。如果您需要销毁预配工具,请参阅预配工具文档。
恭喜!
在本实验中,您学习了如何使用 Terraform 构建、更改和销毁基础设施。之后,您还使用 Terraform 配置文件创建了资源依赖项,并预配了基本的基础设施。
后续步骤/了解详情
请务必查看以下资源,以获得更多关于 Terraform 的实操练习机会:
- Google Cloud Marketplace 上的 Hashicorp。
- Hashicorp Learn
- Terraform 社区
- Terraform Google 示例
Google Cloud 培训和认证
…可帮助您充分利用 Google Cloud 技术。我们的课程会讲解各项技能与最佳实践,可帮助您迅速上手使用并继续学习更深入的知识。我们提供从基础到高级的全方位培训,并有点播、直播和虚拟三种方式选择,让您可以按照自己的日程安排学习时间。各项认证可以帮助您核实并证明您在 Google Cloud 技术方面的技能与专业知识。
上次更新手册的时间:2024 年 1 月 26 日
上次测试实验的时间:2023 年 9 月 25 日
版权所有 2024 Google LLC 保留所有权利。Google 和 Google 徽标是 Google LLC 的商标。其他所有公司名和产品名可能是其各自相关公司的商标。