注意:
- 此教程需要访问 Oracle Cloud。要注册免费账户,请参阅开始使用 Oracle Cloud Infrastructure Free Tier 。
- 它使用 Oracle Cloud Infrastructure 身份证明、租户和区间示例值。完成实验室时,请将这些值替换为特定于您的云环境的值。
使用 Terraform 测试框架和 Oracle Cloud Infrastructure DevOps 构建 Terraform 验证管道
简介
组织经常使用 Terraform 模块来管理复杂的资源预配,并为开发人员提供简单易用的界面来输入必要的参数来部署所需的基础设施。模块可促进代码重用,并为组织提供一种标准化通用负载部署的方法,例如三层 Web 应用、云网络环境或数据分析管道。开发 Terraform 模块时,作者通常从手动测试开始。这需要使用 terraform validate 等命令进行语法验证,使用 terraform plan 预览执行计划,使用 terraform apply 等命令,然后在 Oracle Cloud Infrastructure (OCI) 控制台中手动检查资源配置。然而,手动测试容易出现人为错误,不可扩展,并可能导致意外问题。由于模块由组织内的多个团队使用,因此在发布之前彻底测试任何更改至关重要。
Terraform 测试是一个新的测试框架,专为模块作者设计,用于对 Terraform 模块执行单元和集成测试。它允许创建模块中定义的基础结构,对基础结构执行验证检查,并销毁测试资源,而不管测试通过还是失败。此外,如果无法销毁任何资源,Terraform 测试也会发出警告。使用与 Terraform 模块相同的 HashiCorp 配置语言 (Configuration Language,HCL) 语法,可以最大限度地减少作者学习其他工具或编程语言的需求。
每个 Terraform 测试都位于一个测试文件中。Terraform 根据其文件扩展名 .tftest.hcl
或 .tftest.json
搜索测试文件。每个测试文件都由根级别属性和块组成,如下所示:
- 一个或多个
run
块。 - 一个或零个
variables
块。 - 零到多个
provider
块。
Terraform 按顺序执行 run
块,模拟在配置目录中运行的一系列 Terraform 命令。variables
和 provider
块的排列顺序无关紧要,因为 Terraform 在测试过程开始时会评估这些块中的所有值。为了清楚起见,建议将 variables
和 provider
块放在测试文件的开头。
目标
- 演示如何使用连续集成/连续部署 (Continuous Integration/Continuous Deployment,CI/CD) 管道验证 Terraform 模块并自动执行流程。
先决条件
- 安装和设置 Terraform v1.6.0 及更高版本。有关详细信息,请参阅安装 Terraform 。
任务 1:编写 Terraform 测试以验证资源创建
-
我们已经介绍了 Terraform 测试文件的基本结构,让我们编写一些基本测试来验证以下 Terraform 配置的功能。以下 Terraform 配置将创建标准层的 OCI 对象存储存储桶。
#main.tf resource "oci_objectstorage_bucket" "test_bucket" { compartment_id = var.compartment_id name = var.bucket_name namespace = var.bucket_namespace storage_tier = var.bucket_storage_tier versioning = var.bucket_versioning }
-
使用必需的变量创建
var.tf
文件。variable compartment_id { default = "<compartment-ocid>" } variable region { default = "<region>" } variable bucket_name { default = "<bucket-name>"} variable bucket_namespace { default = "<object-storage-namespace>"} variable bucket_access_type { default = "ObjectRead"} variable bucket_storage_tier { default = "Standard"} variable bucket_versioning {default = "Enabled"}
-
为 OCI Terraform 提供程序配置资源主体授权,允许提供商进行 API 调用,而无需在提供程序定义中提供身份证明。要为 OCI 提供程序设置资源主体授权,请参阅资源主体授权。
-
在
tests
目录中创建 Terraform 测试文件。下面是目录结构的示例:├── main.tf └── tests └── test.tftest.hcl
-
更新
test.tftest.hcl
文件,该文件检查创建的存储桶层是否为标准。# test.tftest.hcl run "valid_bucket_tier" { command = plan assert { condition = oci_objectstorage_bucket.test_bucket.storage_tier == "Standard" error_message = "bucket tier is not standard" } }
注:如果存储桶的存储层不是标准存储层,则测试将失败。
-
将上述 terraform 文件推送到 OCI 代码资料档案库。我们将在 CI/CD 管道中使用此代码资料档案库。
任务 2:构建用于验证 Terraform 配置的 OCI DevOps 构建管道
在 build_spec.yaml
文件中,terraform init
和 terraform validate
命令用于初始化 Terraform 并验证配置是否有效。然后,terraform test 命令运行配置的测试。如果任何地形测试失败,管道也会失败。
version: 0.1
component: build
timeoutInSeconds: 10000
shell: bash
failImmediatelyOnError: true
steps:
- type: Command
name: "Initialize Terraform"
command: |
terraform init
terraform validate
- type: Command
name: "Test Terraform"
command: |
terraform test
后续步骤
我们已在 Terraform 配置中执行了简单的断言测试。您可以执行不同类型的测试,例如集成测试、单元测试、端到端测试等。有关详细信息,请参阅 Terraform 测试。
此 Terraform 验证管道可以与应用 CI/CD 管道集成。Terraform 验证管道将从之前的阶段提取构件,并在实施更改之前测试配置。
相关链接
确认
- 作者 - Nikhil Khandelwal(企业云架构师)
更多学习资源
浏览 docs.oracle.com/learn 上的其他实验室,或者通过 Oracle Learning YouTube 频道访问更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 以成为 Oracle Learning Explorer。
有关产品文档,请访问 Oracle 帮助中心。
Build a Terraform Validation Pipeline using Terraform Test Framework and Oracle Cloud Infrastructure DevOps
F99878-01
June 2024