#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».