Terraform 根据条件在不同的提供商之间进行选择

Far*_*zad 5 terraform terraform-provider-azure

我正在尝试使用 Terraform 来自动部署环境,但设置有些棘手:

我需要配置 DNS CNAME 记录,但我的问题是,根据环境,我需要在Dyn DNS或 Azure DNS 中配置该记录(并且它们是互斥的)

Dyn而且,出于同样的原因,例如,当我想在 Azure 中配置时初始化 Terraform 提供程序对我来说是没有意义的。

我认为可行的是包括两个providers

provider azurerm {
  version = "=1.44.0"

  client_id       = var.dns_provider_client_id
  client_secret   = var.dns_provider_client_secret
  subscription_id = var.dns_provider_subscription_id
  tenant_id       = var.dns_provider_tenant_id
}

provider dyn {
  version = "=1.2.0"

  customer_name = var.dyn_customer_name
  password      = var.dyn_password
  username      = var.dyn_username
}
Run Code Online (Sandbox Code Playgroud)

然后,在运行时,我会将与我不使用的提供程序相关的变量设置为空字符串,然后,在配置记录时,在此处tf plan的帮助下,我认为我可以有条件地配置资源:

resource azurerm_dns_cname_record dns_name {
  count = var.dyn_dns_zone.name == "" ? 1 : 0

  name                = "..."
  record              = "..."
  resource_group_name = "..."
  ttl                 = 60
  zone_name           = "..."
}

resource dyn_record dyn {
  count = var.dyn_dns_zone.name == "" ? 0 : 1

  zone  = "..."
  name  = "..."
  value = "..."
  type  = "..."
  ttl   = 60
}
Run Code Online (Sandbox Code Playgroud)

但我的问题是,无论我创建什么记录,我都需要初始化两个提供程序,因此即使我不需要Dyn环境的提供程序,但使用现有逻辑,我仍然需要传递正确的值(而不是空字符串)到其所需的变量。

有什么办法可以解决这个问题吗?也许类似于“仅在我确实需要时才使用提供商”

mar*_*kti 0

即使您没有根据逻辑为两个提供程序提供资源,您也需要初始化这两个提供程序。

您的 dyn dns 或 Azure 资源不是幸运的资源,因为它的计数为零,因此不应出现在计划中,并且应该对它们进行评估的唯一值是您用来设置的布尔表达式中的值计数。