Как terraform оценивает константы

#terraform #azure-rm

#terraform #azure-rm

Вопрос:

Как terraform оценивает константы?

Моя команда имеет приведенный ниже код terraform.

 # main.tf file
locals {
  resource_prefix      = var.resource_context.constants.resource_prefix
  virtual_network_name = "${local.resource_prefix}MainVNet"
  subnets = {
    (var.subnet_keys.test1)      = "${local.resource_prefix}SubnetTest1",
    (var.subnet_keys.test2)      = "${local.resource_prefix}SubnetTest2",
    (var.subnet_keys.test3)      = "${local.resource_prefix}SubnetTest3",
    (var.subnet_keys.test4)      = "${local.resource_prefix}SubnetTest4",
    (var.subnet_keys.test5)      = "${local.resource_prefix}SubnetTest5"
    (var.subnet_keys.test6)      = "${local.resource_prefix}SubnetTest6"
  }
}

data "azurerm_virtual_network" "vnet" {
  name                = local.virtual_network_name
  resource_group_name = var.resource_context.resource_group.name
}

data "azurerm_subnet" "subnets" {
  for_each             = local.subnets
  name                 = each.value
  resource_group_name  = var.resource_context.resource_group.name
  virtual_network_name = data.azurerm_virtual_network.vnet.name
}

 
 # variables.tf file

variable "resource_context" {}
variable "subnet_keys" {
  type = object({
    test1      = string
    test2      = string
    test3      = string
    test4      = string
    test5      = string
    test6      = string
  })
}


 

Я просто хочу знать, как terraform оценивает локальную переменную resource_prefix в main.tf , я имею в виду, суффиксную часть локальной переменной «constants.resource_prefix». Есть ли какое-либо особое значение в этой переменной?

Его конечным значением для одной из переменных «$ {local.resource_prefix}SubnetTest1» будет DevLabCu0SubnetTest1

Комментарии:

1. Не совсем понял проблему или вопрос. Не могли бы вы добавить ясности?

2. Строка будет интерполирована, как и ожидалось.

3. У вас есть какие-либо проблемы с текущим кодом?

Ответ №1:

Я думаю, вы спрашиваете о следующем выражении из вашего фрагмента:

 var.resource_context.constants.resource_prefix
 

Terraform внутренне понимает это выражение как две разные части:

  • var.resource_context ссылается на переменную, объявленную в variable "resource_context" . Это часть, которую Terraform использует для понимания отношений зависимости, подразумеваемых этим выражением.
  • .constants.resource_prefix это операция, которую вы применяете к этому объекту, которая не имеет особого значения для Terraform.

В constants частности, во второй части это просто произвольное имя атрибута, выбранное автором этого модуля, и оно вообще не является чем-то присущим Terraform. Возможно, было бы понятнее увидеть это, добавив явное ограничение типа variable "resource_context" , в то время как автор этого модуля ранее оставил переменную неограниченной и, следовательно, не указал, какой тип ожидается:

 variable "resource_context" {
  type = object({
    constants = object({
      resource_prefix = string
    })
  })
}
 

В приведенном выше ограничении типа указано, что значением для var.resource_context должен быть объект с именем атрибута constants , который сам по себе является объектом с именем атрибута resource_prefix . Обратите внимание, что оба этих имени абсолютно произвольны в отношении Terraform, поэтому вы можете переименовать constants в thingies , а затем записать var.resource_context.thingies.resource_prefix , и Terraform сочтет это столь же допустимым.

Язык Terraform не имеет никакого первоклассного смысла «именованных констант», с которыми вы могли бы быть знакомы на другом языке. Литеральные значения, такие как "foo" и 2 , являются неназванными константами, но поскольку язык Terraform является декларативным и, следовательно, не позволяет переназначать значения символам во время выполнения, нет никакого сильного различия между «константами» и «переменными», как вы могли бы ожидать от императивного языка программирования.

Комментарии:

1. Да, я специально спрашивал об этом «var.resource_context.constants.resource_prefix».