尝试将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 上进行管理。

bannerAds