在Terraform Cloud中使用多个Azure服务主体

pb3s4cty  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(115)

我刚刚学习Terraform,并希望使用Terraform云在Azure中的两个订阅上实现基础设施。我已经找到了如何使用多个azurerm提供程序块并将其别名化来实现这一点,如下所示:

provider "azurerm" {
  alias = "dev"

  subscription_id = var.DEV_SUB_ID
  tenant_id       = var.DEV_TENANT_ID
  client_id       = var.DEV_CLIENT_ID
  client_secret   = var.DEV_CLIENT_SECRET

  features {}
}

provider "azurerm" {
  alias = "prod"

  subscription_id = var.PROD_SUB_ID
  tenant_id       = var.PROD_TENANT_ID
  client_id       = var.PROD_CLIENT_ID
  client_secret   = var.PROD_CLIENT_SECRET

  features {}
}

字符串
我的repo设置使用GitHub操作,但使用此设置,由于以下错误,计划阶段失败:

terraform error: building azurerm client: please ensure you have installed azure cli version 2.0.79 or newer. error parsing json result from the azure cli: launching azure cli: exec: "az": executable file not found in $path.


显然,这个错误是由于我没有在云中设置ARM_SUBSCRIPTION_IDARM_CLIENT_IDARM_CLIENT_SECRETARM_TENANT_ID变量。但是,如果我使用多个订阅,因此使用多个服务主体,为什么我必须使用这些默认变量?当然,如果我这样做,所有操作都将在服务主体的订阅上执行?

mepcadol

mepcadol1#

您的情况涉及使用Terraform管理多个Azure订阅中的基础设施,并在GitHub Actions计划阶段遇到错误。您面临的错误与在GitHub Actions环境中找不到或正确配置Azure CLI有关。让我们逐步解决您的问题和疑虑。

理解错误

1.Azure CLI Requirement:错误消息表明Terraform希望Azure CLI在您的CI/CD环境中安装并可用(本例中为GitHub Actions)。这通常是身份验证所需的。
1.环境变量:Terraform使用标准环境变量(ARM_SUBSCRIPTION_IDARM_CLIENT_IDARM_CLIENT_SECRETARM_TENANT_ID)对Azure进行身份验证。这些变量通常用于默认或主Azure环境。

多订阅管理

要在Terraform中管理多个Azure订阅,您可以使用多个提供程序块,每个提供程序块都有自己的别名。这允许您在同一Terraform配置中的不同订阅中定义资源。下面是如何设置Terraform代码以管理两个不同Azure订阅的示例,一个用于开发(dev),一个用于生产(prod)。

多个Azure订阅的Terraform配置

首先,使用别名定义您的提供程序块:

# Provider for Development Subscription
provider "azurerm" {
  alias = "dev"

  subscription_id = var.dev_subscription_id
  tenant_id       = var.dev_tenant_id
  client_id       = var.dev_client_id
  client_secret   = var.dev_client_secret

  features {}
}

# Provider for Production Subscription
provider "azurerm" {
  alias = "prod"

  subscription_id = var.prod_subscription_id
  tenant_id       = var.prod_tenant_id
  client_id       = var.prod_client_id
  client_secret   = var.prod_client_secret

  features {}
}

字符串
在此设置中,您需要在variables.tf文件中定义这些变量(dev_subscription_iddev_tenant_iddev_client_iddev_client_secretprod_subscription_idprod_tenant_idprod_client_idprod_client_secret)或将它们作为环境变量传递。
接下来,在定义资源时,通过使用provider参数指定每个资源使用哪个提供程序。下面是一个示例:

# Resource in the Development Subscription
resource "azurerm_resource_group" "dev_resource_group" {
  provider = azurerm.dev

  name     = "devResourceGroup"
  location = "West Europe"
}

# Resource in the Production Subscription
resource "azurerm_resource_group" "prod_resource_group" {
  provider = azurerm.prod

  name     = "prodResourceGroup"
  location = "East US"
}


在这个例子中,创建了两个资源组:一个在开发订阅中,一个在生产订阅中。通过指定provider参数(provider = azurerm.devprovider = azurerm.prod),Terraform知道每个资源使用哪个订阅。

注意事项

  • 请确保您使用的服务主体在两个订阅中都具有必要的权限。
  • 确保状态文件的安全,特别是因为它们包含有关多个环境的敏感信息。
  • 定期审查和更新您的IAM政策,以遵循最小特权原则。

这种方法允许您在单个Terraform配置中跨多个Azure订阅管理资源,利用Terraform的强大功能和灵活性进行复杂的基础设施管理。

解决错误和工作流程

1.GitHub Actions中的Azure CLI:确保您的GitHub Actions工作流包含安装和配置Azure CLI的步骤。这可能是导致错误的缺失部分。您可以在GitHub Actions工作流中添加一个步骤来安装Azure CLI。
1.默认订阅的环境变量:标准环境变量仍然是必需的,因为Terraform经常使用它们进行初始设置和身份验证检查。为您打算使用的主订阅('dev'或'prod')设置这些变量。在GitHub Actions中,您可以将这些变量设置为secret,然后将其传递到您的工作流。
1.使用多个订阅:即使您为一个订阅设置了默认环境变量,您的Terraform配置中的别名提供程序也会正确使用每个提供程序块中指定的订阅详细信息。Terraform足够智能,可以根据别名区分订阅并使用适当的凭据。

建议GitHub操作工作流

1.安装Azure CLI:在GitHub Actions工作流中添加安装Azure CLI的步骤。
1.设置默认环境变量:为主订阅配置ARM_*环境变量,敏感数据使用GitHub Secrets存储。
1.运行Terraform命令:继续执行Terraform计划并应用命令。Terraform将为每个订阅特定的资源使用别名提供程序配置。

工作流监听示例

- name: Install Azure CLI
  run: |
    curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash

- name: Set up Terraform
  uses: hashicorp/setup-terraform@v1
  with:
    terraform_version: 'latest'

- name: Terraform Plan
  run: terraform plan
  env:
    ARM_SUBSCRIPTION_ID: ${{ secrets.ARM_SUBSCRIPTION_ID }}
    ARM_CLIENT_ID: ${{ secrets.ARM_CLIENT_ID }}
    ARM_CLIENT_SECRET: ${{ secrets.ARM_CLIENT_SECRET }}
    ARM_TENANT_ID: ${{ secrets.ARM_TENANT_ID }}

结论

您使用多个提供程序块的方法是正确的。问题在于GitHub Actions环境设置,特别是Azure CLI和环境变量。调整您的工作流以包含这些元素应该可以解决问题,并允许Terraform正确管理多个Azure订阅的资源。

相关问题