2

我的 variables.tfvars 中有以下代码:

variable "is_premium_service_bus_required" {
  description = "When set to 1, premium service bus will be created"
  type        = "string"
  default     = "0"
}

variable "service_bus_type_cloud" {
  description = "Type of service bus to be created, value can only be standard or premium"
  type        = "string"
}

以下代码用于创建 azure 资源:

resource "azurerm_servicebus_namespace" "premium-ffdac-cloud-servicebus" {
  count               = "${var.is_premium_service_bus_required}"
  name                = "${terraform.workspace}-ffdac-cloud-sbus"
  location            = "west europe"
  resource_group_name = "fusson"
  sku                 = "Premium"
  capacity            = "1"   
}

resource "azurerm_servicebus_namespace" "ffdac-cloud-servicebus" {
  name                = "${terraform.workspace}-ffdac-cloud-servicebus"
  location            = "west europe"
  resource_group_name = "fusson"
  sku                 = "Standard"
}

可以看出,我们通过设置变量值来操纵 Azure 上资源的创建: is_premium_service_bus_required 为 0(未创建)或 1(已创建)

我有以下局部变量:

locals {
  standard_service_bus_cloud_connection_string = "${azurerm_servicebus_namespace.ffdac-cloud-servicebus.default_primary_connection_string};TransportType=Amqp"
}


locals {
  premium_service_bus_cloud_connection_string = "${azurerm_servicebus_namespace.premium-ffdac-cloud-servicebus.default_primary_connection_string};TransportType=Amqp"
}

它只负责操作默认连接字符串并在末尾添加协议。

我们有以下代码,它根据“service_bus_type_cloud”的值确定,应该为“service_bus_cloud_connection_string”变量分配什么值,该变量稍后将在不同的 terraform 文件中使用。

locals {
  service_bus_type_cloud_names = {
    "premium"  = "${local.premium_service_bus_cloud_connection_string}"
    "standard" = "${local.standard_service_bus_cloud_connection_string}"
  }

  cloud_connection_string_default = "${local.standard_service_bus_cloud_connection_string}"

  service_bus_cloud_connection_string = "${lookup(local.service_bus_type_cloud_names, var.service_bus_type_cloud, local.cloud_connection_string_default)}"
}

现在的问题是,当 "is_premium_service_bus_required" 的值设置为 "0" 时,高级服务总线 azure 服务没有创建并且本地变量 "premium_service_bus_cloud_connection_string" 值为空,我们最终得到以下错误:

Error: Error running plan: 1 errors occurred:
    * local.premium_service_bus_cloud_connection_string: local.premium_service_bus_cloud_connection_string: Resource 'azurerm_servicebus_namespace.premium-ffdac-cloud-servicebus' not found for variable 'azurerm_servicebus_namespace.premium-ffdac-cloud-servicebus.default_primary_connection_string'

有没有办法绕过这个错误或重写逻辑的更好方法?我们正在运行 Terraform 版本 0.11,因此这里提到的条件运算符不能用作使用以下代码:

locals {
  service_bus_cloud_connection_string = "${var.service_bus_type_cloud == "premium" ? "${azurerm_servicebus_namespace.premium-ffdac-cloud-servicebus.default_primary_connection_string};TransportType=Amqp" : "${azurerm_servicebus_namespace.ffdac-cloud-servicebus.default_primary_connection_string};TransportType=Amqp"}"
}

将评估两个值表达式,即使只返回一个,它似乎是一个在 0.12 中修复的错误,如此处所示

4

3 回答 3

2

如我所见,您想根据条件创建具有不同类型的服务总线。然后获取服务总线的连接字符串。我不知道是标准类型是必要的。我认为没有必要。然后你可以改成这样:

variable "is_premium_service_bus_required" {
  description = "When set to 1, premium service bus will be created"
  type        = "bool"
  default     = true
}

resource "azurerm_servicebus_namespace" "ffdac-cloud-servicebus" {
  count               = "${var.is_premium_service_bus_required}" ? 1 : 0
  name                = "${terraform.workspace}-ffdac-cloud-servicebus"
  location            = "west europe"
  resource_group_name = "fusson"
  sku                 = "${var.is_premium_service_bus_required}" ? "Premium" : "Standard"
}

在这种情况下,您可以直接获取连接字符串,"${azurerm_servicebus_namespace.ffdac-cloud-servicebus.default_primary_connection_string};TransportType=Amqp"就像您在代码中显示的那样。

但如果标准类型是必要的,它会稍微复杂一点:

variable "is_premium_service_bus_required" {
  description = "When set to 1, premium service bus will be created"
  type        = "bool"
  default     = true
}

variable "service_bus_type_cloud" {
  description = "Type of service bus to be created, value can only be standard or premium"
  type        = "string"
}

resource "azurerm_servicebus_namespace" "premium-ffdac-cloud-servicebus" {
  count               = "${var.is_premium_service_bus_required}" ? 1 : 0
  name                = "${terraform.workspace}-ffdac-cloud-sbus"
  location            = "west europe"
  resource_group_name = "fusson"
  sku                 = "Premium"
  capacity            = "1"   
}

resource "azurerm_servicebus_namespace" "ffdac-cloud-servicebus" {
  name                = "${terraform.workspace}-ffdac-cloud-servicebus"
  location            = "west europe"
  resource_group_name = "fusson"
  sku                 = "Standard"
}

locals {
  service_bus_cloud_connection_string = "${var.is_premium_service_bus_required}" && "${var.service_bus_type_cloud}" == "premium" ? "${azurerm_servicebus_namespace.premium-ffdac-cloud-servicebus[0].default_primary_connection_string};TransportType=Amqp" : "${azurerm_servicebus_namespace.ffdac-cloud-servicebus.default_primary_connection_string};TransportType=Amqp"
}

在这种情况下,只有当变量is_premium_service_bus_required为真且变量service_bus_type_cloud为“premium”时,才会得到高级服务总线连接字符串,否则会得到标准。

于 2020-07-03T02:49:57.837 回答
2

您仍然可以使用条件句 (Terraform v0.11.14)。这是代码。

variable "is_premium_service_bus_required" {
  description = "When set to 1, premium service bus will be created"
  type = "string"
  default     = "0"
}

locals {
  standard_service_bus_cloud_connection_string = "${var.is_premium_service_bus_required == "0" ? "non_premium_connection_string" : "premium_connection_string"}"
}

output "is_required" {
  value = "${local.standard_service_bus_cloud_connection_string}"
}

这是输出。

[PS][7.0.2] tst > terraform11.exe apply -var "is_premium_service_bus_required=0"

Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

Outputs:

is_required = non_premium_connection_string


[PS][7.0.2] tst > terraform11.exe apply -var "is_premium_service_bus_required=1"

Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

Outputs:

is_required = premium_connection_string
于 2020-07-02T21:10:48.893 回答
0

should be much easier to create only one object and to adjust the parameters based on the input variable. To have a map with the params for standard and the params for premium.

于 2020-07-10T03:38:03.877 回答