尝试将Terraform CLI的环境迁移到Terraform Cloud
首先
我尝试将Terraform CLI的环境迁移到Terraform Cloud。
在此过程中,我将详细记录与本地环境不同的部分以及遇到的困难。
我的本地操作系统是Windows 11,而云资源则是使用Azure构建的。
准备Terraform云的步骤。
首先注册一个账户并创建一个Workspace。
这次我们选择了以CLI驱动的工作流程。

这是关于workspace的设置。
Execution Mode将设置为远程模式。
这是将terraform的执行环境委托给terraform Cloud的一种类型。

随便做吧。
使用Terraform命令行界面进行模块配置
在Terraform CLI中,我们将通用部分用作模块进行利用。
我们准备好创建每个资源的定义,并通过传入变量以实现多个资源的创建。
home
│ recovery_services_vault.tf
│ resource_group.tf
│ storage_account.tf
│ variables.tf
│ virtual_network.tf
├─env
│ ├─dev
│ │ main.tf
│ │ variables.tf
│ └─prd
│
└─modules
├─lb
│ lb.tf
│ outputs.tf
│ variables.tf
├─nsg
│ nsg.tf
│ variables.tf
└─vm
manageddisk.tf
outputs.tf
variables.tf
vm.tf
调用指定类似于以下这样。
是相对于执行目录的路径。
module "main" {
source = "../../"
resource_group = local.resource_group
virtual_network = local.virtual_network
subnet = local.subnet
}
module "vm01" {
source = "../../modules/vm/"
vm = local.vm01_vm
data_disk = local.vm01_data_disk
virtual_network = local.virtual_network.vnet1
subnet = local.subnet.sub1
}
在Terraform Cloud上的模块配置
由于我们正在使用Terraform Cloud,虽然Module本身可以在GitHub、S3等各种服务中使用,但这次我们把它注册到Terraform Registry。
创建一个GitHub仓库用于模块。
需要输入GitHub的仓库来进行模块注册。
因此需要事先创建好GitHub仓库。
仓库名称应该为terraform–,例如对于Azure,应该命名为terraform-azurerm-devmodule。
同时,还需要发布,不要忘记发布。
另外,该存储库可以设为私有。
home
│ availability.tf
│ recovery_services_vault.tf
│ resource_group.tf
│ storage_account.tf
│ variables.tf
│ virtual_network.tf
└─modules
├─lb
│ lb.tf
│ outputs.tf
│ variables.tf
├─nsg
│ nsg.tf
│ variables.tf
└─vm
manageddisk.tf
outputs.tf
variables.tf
vm.tf
将模块注册到Terraform Registry。
将上述的存储库注册




您可以在Terraform注册表中查看每个版本的配置。

如果按照上述的文件夹结构,modules文件夹下的子文件夹将被注册为子模块。

调用Module
调用Module的描述为app.terraform.io//module/azurerm.
也要指定Module的版本。
如果要指定子模块,则将其作为基本路径的最后添加两个/,然后是其下面的文件夹名称。
module "main" {
source = "app.terraform.io/<organization>/module/azurerm"
version = "1.0.4"
resource_group = local.resource_group
virtual_network = local.virtual_network
subnet = local.subnet
}
module "vm01" {
source = "app.terraform.io/<organization>/module/azurerm//modules/vm/"
version = "1.0.4"
vm = local.vm01_vm
data_disk = local.vm01_data_disk
virtual_network = local.virtual_network.vnet1
subnet = local.subnet.sub1
}
我们将定义执行 Terraform Cloud 的方式。
我们将指定 Terraform Cloud 的组织和工作区名称。
虽然租户ID和订阅ID可以在 Terraform Cloud 的变量中注册,但我们将在本地环境中定义,以便可以轻松更改。
terraform {
cloud {
organization = "<organization name>"
workspaces {
name = "workspace name"
}
}
required_providers {
azurerm = {
source = "hashicorp/azurerm"
}
}
}
provider "azurerm" {
features {}
subscription_id = "<subscription_id>"
tenant_id = "<tenant_id>"
}
对于Azure的认证
在Azure中,使用服务主体进行身份验证。
在Azure门户中创建服务主体。
不要忘记授予角色。
将秘密密钥和客户端ID注册为变量。
-
- ARM_CLIENT_ID
- ARM_CLIENT_SECRET

将认证迁移到Terraform Cloud。
在使用Terraform Cloud时,需要使用Token进行认证。
虽然在Windows系统中,文档中指出只需将Token存储在%APPDATA%\terraform.rc文件中即可解决问题,但实际上并没有成功。
因此我在通过terraform login登录后的页面上生成了Token。

在%AppData%中创建了一个名为terraform.d的文件夹,并在其中的文件中进行了描述。
Token記述的格式如下所示。
credentials "app.terraform.io" {
token = "xxxxxx.atlasv1.zzzzzzzzzzzzz"
}
执行
在准备完成后,通过类似于CLI的方式进行执行,即可创建资源。
terraform init
terraform plan
terraform apply
你可以在Terraform Cloud上查看执行结果和状态。

最后
如果要由多人执行的话,最好在 Terraform Cloud 上进行管理。