Объявить переменную, используя `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"
Другие вопросы по тегам