Объявить переменную, используя `execute` интерполяцию в Terraform
Я хочу объявить подстроку переменной к другой переменной. Я тестировал взятие подстроки с помощью консоли terraform.
> echo 'element(split (".", "10.250.3.0/24"), 2)' | terraform console
> 3
моя подсеть 10.250.3.0/24, и я хочу, чтобы моя виртуальная машина получала частный IP-адрес в этой маске подсети 10.250.3.6. Я хочу, чтобы это автоматически назначалось при просмотре адреса подсети. Что я пробовал;
test.tf
variable subnet {
type = "string"
default = "10.250.3.0/24"
description = "subnet mask myTestVM will live"
}
variable myTestVM_subnet {
type = "string"
default = "10.250." ${element(split(".", var.trusted_zone_onpremises_subnet), 2)} ".6"
}
А потом я проверяю это
terraform console
>Failed to load root config module: Error parsing /home/anum/test/test.tf: At 9:25: illegal char
Я думаю, это просто вопрос синтаксиса. но не мог понять что!
2 ответа
Как вы видели, вы не можете интерполировать значения переменных в Terraform.
Однако вы можете вместо этого интерполировать местных жителей и использовать их, если хотите избежать повторения где-либо.
Так что вы можете сделать что-то вроде этого:
variable "subnet" {
type = "string"
default = "10.250.3.0/24"
description = "subnet mask myTestVM will live"
}
locals {
myTestVM_subnet = "10.250.${element(split(".", var.trusted_zone_onpremises_subnet), 2)}.6"
}
resource "aws_instance" "instance" {
...
private_ip = "${local.myTestVM_subnet}"
}
Где aws_instance
это просто для демонстрации и может быть любой ресурс, который требует / принимает IP-адрес.
Как лучший вариант в этом конкретном случае использования, хотя вы могли бы использовать cidrhost
функция для генерации адреса хоста в данной подсети.
Так что в вашем случае у вас вместо этого будет что-то вроде этого:
resource "aws_instance" "instance" {
...
private_ip = "${cidrhost(var.subnet, 6)}"
}
Который будет создавать экземпляр AWS с частным IP-адресом 10.250.3.6
, Это может значительно упростить создание целой серии машин, которые увеличивают IP-адрес, используемый с помощью count
метапараметр.
Terraform не допускает интерполяции объявления переменных в default
, Итак, я понимаю;
Error: variable "myTestVM_subnet": default may not contain interpolations
и синтаксическая ошибка действительно была исправлена после того, как я ударился головой, так вот что любит Terraform;
private_ip_address = "10.250.${element(split(".", "${var.subnet}"), 2)}.5"