深入探索 Terraform:工作区管理与 Terraform Cloud 应用
1. 在 CI/CD 中使用工作区
在 Terraform 中,工作区允许我们为同一 Terraform 配置创建多个状态文件,从而管理多个环境。这里我们将在 CI/CD 管道中自动化工作区的创建。
1.1 准备工作
- 了解 Terraform 工作区的命令行选项,文档见:https://www.terraform.io/docs/commands/workspace/index.html。
- 使用 Azure Pipelines 实现 CI/CD 管道。
- 我们将使用以下资源:
- Terraform 配置:https://github.com/PacktPublishing/Terraform-Cookbook/tree/master/CHAP07/workspace-pipeline
- YAML 管道文件:https://github.com/PacktPublishing/Terraform-Cookbook/blob/master/CHAP07/pipeline/azure-pipelines.yml
- 假设创建的工作区名称为要部署的 Git 分支名称。
1.2 操作步骤
-
在包含 Terraform 配置的文件夹中,添加
ManageWorkspaces.ps1
文件,内容如下:
$envName=$args[0]
$countws = terraform workspace list -no-color | Select-String $envName -AllMatches
if ($countws.Matches.Count -eq 0) {
Write-Host "Create new Workspace $envName"
terraform workspace new $envName
} else {
Write-Host "The Workspace $envName already exist and is selected"
terraform workspace select $envName
}
-
在
azure-pipelines.yaml
文件中,在 Terraform init 步骤之后添加以下代码:
- task: PowerShell@2
inputs:
filePath: 'CHAP07/workspace-pipeline/ManageWorkspaces.ps1'
arguments: '$(Build.SourceBranchName)'
workingDirectory: "CHAP07/workspace-pipeline/"
- 将新创建的 PowerShell 脚本和 YAML 管道文件的更改提交并推送到 Git 仓库。
- 在 Azure Pipelines 中运行管道,在配置步骤中,从“Branch/tag”下拉菜单中选择要部署的正确分支,最后点击“Run”按钮运行管道。
1.3 工作原理
-
步骤 1
:PowerShell 脚本以要创建的环境名称(即要部署的分支名称)作为输入参数。执行
terraform workspace list
命令列出工作区,并搜索与输入名称匹配的工作区。若未找到,则执行terraform workspace new
命令创建;若存在,则执行terraform workspace select
命令选择该工作区。 - 步骤 2 :在之前创建的 YAML 管道中,在 init 和 plan 之间插入 PowerShell 脚本的执行,并传递所选分支的名称作为参数。
- 步骤 3 :将代码更改(PowerShell 脚本和管道 YAML 文件)提交到 Git 仓库。
- 步骤 4 :在 Azure Pipelines 中执行管道,选择要部署的分支,其名称将用作工作区名称。
1.4 其他说明
- 可以使用其他脚本语言(如 Bash 或 Python)编写工作区管理脚本。
- 使用多工作区前,需根据 https://www.terraform.io/docs/state/workspaces.html 检查其与后端的兼容性。
- Terraform 工作区 CLI 命令文档见:https://www.terraform.io/docs/commands/workspace/index.html。
2. 使用 Terraform Cloud 提升协作效率
在企业环境中,处理大型基础设施项目时,需要一个真正的平台来共享模块和进行集中部署。Terraform Cloud 就是这样一个 SaaS 平台,它提供了远程后端、私有模块注册表、用户管理等功能。
2.1 技术要求
- 在 Terraform Cloud 平台创建账户,可免费注册:https://app.terraform.io/signup/account。
- 通过 Web 浏览器连接到 Terraform Cloud。
- 创建组织,详细步骤见:https://learn.hashicorp.com/terraform/cloud-getting-started/signup,组织相关文档见:https://www.terraform.io/docs/cloud/users-teams-organizations/organizations.html#creating-organizations。
- 熟悉 Terraform Cloud 工作区的概念,文档见:https://www.terraform.io/docs/cloud/workspaces/index.html。
- 使用 GitHub 创建连接,可免费注册:https://github.com/。
2.2 使用 Terraform Cloud 远程后端
在 Terraform 中,后端对于存储和共享状态文件非常重要。下面介绍如何在 Terraform Cloud 中使用远程后端。
2.2.1 准备工作
- 拥有 Terraform Cloud 账户并登录。
-
手动从 Terraform Cloud UI 创建名为
demo-app
的新工作区,配置时不选择 VCS 仓库,文档见:https://www.terraform.io/docs/cloud/workspaces/creating.html。 - 目标是为简单的 Terraform 配置配置和使用远程后端,并在本地模式下执行。
2.2.2 操作步骤
此过程分为三个部分:
1.
配置本地模式执行
- 在新的 Terraform Cloud 工作区(
demo-app
)中,转到“Settings | General”选项卡,将“Execution Mode”选项更改为“Local”。
- 点击“Save settings”按钮应用更改。
2.
生成新的 API 令牌
- 在
demoBook
组织的“Settings”选项卡中,转到“API Tokens”选项卡。
- 滚动到页面底部,点击“Create an authentication token”按钮生成新的 API 令牌。
- 妥善保存生成的令牌。
3.
配置和使用远程后端
- 在 Terraform 配置的
main.tf
文件中,添加以下后端配置:
terraform {
backend "remote" {
hostname = "app.terraform.io"
organization = "demoBook"
workspaces {
name = "demo-app"
}
}
}
- 在 Terraform CLI 配置文件夹(即主目录,文档见:https://www.terraform.io/docs/commands/cli-config.html)中,创建新文件 `terraform.rc`(Windows)或 `.terraform.rc`(Linux),并添加以下内容:
credentials "app.terraform.io" {
token = "<your api token generated>"
}
- 从本地工作站执行基本的 Terraform 工作流命令:`init`、`plan` 和 `apply`。
2.2.3 工作原理
- 第一部分 :配置工作区的 Terraform 执行模式为本地模式,意味着 Terraform 将在私有机器(本地开发站或 CI/CD 管道代理)上安装配置,创建的工作区仅用于存储 Terraform 状态。
- 第二部分 :创建令牌,使 Terraform 二进制文件能够与 Terraform Cloud 工作区进行身份验证。
-
第三部分
:编写 Terraform 配置描述远程后端的设置,包括
hostname
、organization
和workspaces
等参数。创建 Terraform CLI 配置文件并添加生成的身份验证令牌,最后执行 Terraform 命令工作流。
2.2.4 其他说明
- 可以手动创建工作区并配置本地执行模式,若要使用远程模式,可在后端配置中指定工作区名称,若不存在则自动创建。
-
可以使用
terraform login
命令创建令牌和credential.tfrc.json
配置文件,但该命令不适合自动化使用,因为需要浏览器和手动干预。 - 令牌可在组织级别创建以保护特定组织的执行,也可在用户设置的“Tokens”选项卡中为整个账户创建以获得更广泛的权限。
- API 令牌使用文档见:https://www.terraform.io/docs/cloud/users-teams-organizations/api-tokens.html。
- 数据和 Terraform 状态文件安全文档见:https://www.terraform.io/docs/cloud/architectural-details/data-security.html。
- 迁移 Terraform 配置和状态文件到 Terraform Cloud 的文档见:https://www.terraform.io/docs/cloud/migrate/index.html。
2.3 使用 Terraform Cloud 作为私有模块注册表
之前我们学习了如何将 Terraform Cloud 用作远程后端,现在将学习如何在 Terraform Cloud 的私有注册表中发布和使用 Terraform 模块。
2.3.1 准备工作
- 将模块代码存储在 Terraform Cloud 支持的 VCS 文件中,支持的文件类型列表见:https://www.terraform.io/docs/cloud/vcs/index.html。
- 在 Terraform Cloud 组织的“Settings”部分,创建与包含 Terraform 配置的 VCS 提供商的连接,文档见:https://www.terraform.io/docs/cloud/vcs/index.html。
-
在本场景中,使用 GitHub VCS,其中包含
terraform-azurerm-webapp
仓库,可通过分叉 https://github.com/mikaelkrief/terraform-azurerm-webapp 获得。 -
在该仓库中创建包含模块版本号的 Git 标签,本示例创建
v1.0.0
标签。 - 执行 Terraform Cloud 与 GitHub 的集成过程,文档见:https://www.terraform.io/docs/cloud/vcs/github-app.html。
通过以上步骤,我们可以在 CI/CD 中高效管理工作区,并利用 Terraform Cloud 提升协作和模块管理效率。
下面是工作区管理的流程图:
graph LR
A[开始] --> B[添加 ManageWorkspaces.ps1 文件]
B --> C[修改 azure-pipelines.yaml 文件]
C --> D[提交并推送代码更改]
D --> E[在 Azure Pipelines 运行管道]
E --> F[选择分支并运行]
F --> G[结束]
下面是使用 Terraform Cloud 远程后端的步骤表格:
| 步骤 | 操作 | 详细说明 |
| ---- | ---- | ---- |
| 1 | 配置本地模式执行 | 在工作区设置中更改执行模式为本地并保存 |
| 2 | 生成新的 API 令牌 | 在组织设置中生成并保存令牌 |
| 3 | 配置和使用远程后端 | 修改
main.tf
文件,创建
terraform.rc
文件并执行 Terraform 命令 |
深入探索 Terraform:工作区管理与 Terraform Cloud 应用
3. 在 Terraform Cloud 中远程执行 Terraform 配置
在前面我们已经了解了 Terraform Cloud 的远程后端和私有模块注册表的使用,接下来将探讨如何在 Terraform Cloud 中远程执行 Terraform 配置。
3.1 准备工作
- 拥有 Terraform Cloud 账户并登录。
- 确保工作区已正确配置,并且与 VCS 仓库建立了连接(如果需要)。
- 有可用于执行的 Terraform 配置文件。
3.2 操作步骤
-
在 Terraform Cloud 中创建工作区
- 登录到 Terraform Cloud 控制台。
- 点击“New workspace”按钮。
- 选择与 VCS 仓库集成(如果需要),或者手动上传 Terraform 配置文件。
- 完成工作区的创建和配置。
-
配置工作区设置
- 进入工作区的设置页面。
- 配置环境变量、变量集等必要的设置。
-
触发远程执行
- 当 VCS 仓库有代码更新时,Terraform Cloud 会自动触发执行。
- 也可以手动在 Terraform Cloud 控制台中点击“Queue plan”按钮来触发执行。
3.3 工作原理
- 当触发执行时,Terraform Cloud 会从 VCS 仓库获取最新的 Terraform 配置文件。
-
它会在自己的环境中执行
terraform init
、terraform plan
和terraform apply
等命令。 - 执行结果会在 Terraform Cloud 控制台中显示,包括计划的变更和应用的结果。
3.4 其他说明
- 可以设置通知,当执行完成或出现错误时,通过邮件或其他方式接收通知。
- 可以查看执行的日志,以便进行故障排除和审计。
4. 使用 API 自动化 Terraform Cloud
在企业环境中,可能需要自动化 Terraform Cloud 的操作,这可以通过使用其 API 来实现。
4.1 准备工作
- 拥有 Terraform Cloud 账户并生成 API 令牌。
- 了解 API 的基本使用方法和相关文档。
4.2 操作步骤
-
获取 API 令牌
- 在 Terraform Cloud 组织的设置中,生成 API 令牌。
- 妥善保存该令牌,后续调用 API 时需要使用。
-
调用 API 进行操作
-
可以使用工具(如
curl
或编程语言的 HTTP 库)来调用 API。 -
以下是一个使用
curl
调用 API 获取工作区列表的示例:
-
可以使用工具(如
curl --header "Authorization: Bearer <your_api_token>" \
https://app.terraform.io/api/v2/organizations/<your_organization>/workspaces
-
自动化流程
- 根据需求编写脚本或程序,使用 API 完成自动化操作,如创建工作区、触发执行等。
4.3 工作原理
- API 提供了与 Terraform Cloud 进行交互的接口,通过发送 HTTP 请求并携带必要的参数和令牌,可以实现各种操作。
- 可以根据 API 的响应结果进行后续处理,如根据执行结果进行通知或进一步的操作。
4.4 其他说明
- API 文档可以在 Terraform Cloud 的官方网站上找到,详细了解各个 API 端点的使用方法。
- 在使用 API 时,需要注意权限和安全问题,确保令牌的安全存储和使用。
5. 使用 Sentinel 测试 Terraform 配置的合规性
Sentinel 是一个合规框架,可以用于测试 Terraform 配置是否符合特定的规则。
5.1 准备工作
- 拥有 Terraform Cloud 账户并登录。
- 了解 Sentinel 的基本概念和规则编写方法。
5.2 操作步骤
-
创建 Sentinel 策略
- 编写 Sentinel 策略文件,定义合规规则。例如,以下是一个简单的策略文件示例:
main = rule {
all resources as type, rs {
all rs as r {
r.type != "aws_instance" or r.values.instance_type != "t2.micro"
}
}
}
- 该策略规则表示不允许使用 `t2.micro` 类型的 AWS 实例。
-
将策略关联到工作区
- 在 Terraform Cloud 控制台中,进入工作区的设置页面。
- 找到“Sentinel Policies”部分,关联创建的 Sentinel 策略。
-
执行合规性测试
- 当 Terraform 配置执行时,Sentinel 会自动执行策略测试。
- 如果配置不符合规则,会在控制台中显示错误信息。
5.3 工作原理
- Sentinel 会在 Terraform 执行的不同阶段(如计划阶段)对配置进行评估。
- 根据策略文件中定义的规则,判断配置是否合规。
- 如果不符合规则,会阻止配置的应用,并给出相应的错误提示。
5.4 其他说明
- 可以编写多个 Sentinel 策略,并根据不同的需求进行组合和应用。
- 策略文件可以存储在 VCS 仓库中,方便管理和版本控制。
6. 使用成本估算进行云成本资源治理
在使用 Terraform 管理云资源时,成本控制是一个重要的方面。Terraform Cloud 提供了成本估算功能,可以帮助进行云成本资源治理。
6.1 准备工作
- 拥有 Terraform Cloud 账户并登录。
- 配置了与云服务提供商的集成(如 AWS、Azure 等)。
6.2 操作步骤
-
启用成本估算功能
- 在 Terraform Cloud 控制台中,进入工作区的设置页面。
- 找到“Cost Estimation”部分,启用该功能。
-
查看成本估算结果
- 当执行 Terraform 配置时,会自动生成成本估算报告。
- 在控制台中可以查看详细的成本估算信息,包括资源类型、预计成本等。
6.3 工作原理
- Terraform Cloud 会根据配置中定义的资源类型和数量,结合云服务提供商的定价信息,进行成本估算。
- 估算结果会在每次执行时更新,帮助用户及时了解资源使用成本。
6.4 其他说明
- 成本估算只是一个大致的参考,实际成本可能会因多种因素而有所不同。
- 可以根据成本估算结果进行资源调整和优化,以控制成本。
下面是使用 API 自动化 Terraform Cloud 的流程图:
graph LR
A[开始] --> B[获取 API 令牌]
B --> C[调用 API 进行操作]
C --> D[自动化流程]
D --> E[结束]
下面是使用 Sentinel 测试合规性的步骤表格:
| 步骤 | 操作 | 详细说明 |
| ---- | ---- | ---- |
| 1 | 创建 Sentinel 策略 | 编写策略文件定义合规规则 |
| 2 | 将策略关联到工作区 | 在工作区设置中关联策略 |
| 3 | 执行合规性测试 | 在 Terraform 执行时自动测试 |
通过以上对 Terraform Cloud 各个功能的深入了解和实践,我们可以更好地利用 Terraform 进行基础设施的管理和协作,提高工作效率和资源的合规性及成本控制能力。