Интерполяция списка форматов Terraform со встроенными функциями и порядок их выполнения - PullRequest
0 голосов
/ 17 января 2019

У меня есть это:

formatlist( "cidrhost( cidrsubnet(%s, 1, 0), -3)", list("10.70.32.0/21"))

выход:

[
  "cidrhost( cidrsubnet(10.70.32.0/21, 1, 0), -3)",
]

но я бы хотел, чтобы это было выполнено и результат был сохранен в списке возврата formatlist. Могу ли я заставить Terraform отложить выполнение функций cidr до тех пор, пока список форматов %s не будет заменен элементом списка?

В настоящий момент, если я удалю кавычки и попробую, то просто не получится, например,

formatlist( cidrhost( cidrsubnet("%s", 1, 0), -3), list("10.70.32.0/21"))

  cidrsubnet: invalid CIDR expression: invalid CIDR address: %s in:

${formatlist( cidrhost( cidrsubnet("%s", 1, 0), -3), list("10.70.32.0/21"))}

Что заставляет меня верить, что cidrsubnet работает до того, как formatlist сможет что-то сделать.

Обновление с примером:

Например, у меня есть длинный список подсетей класса c, которые мы подразделяем пополам, и из 1-й подсети мы используем 2-й последний используемый (не широковещательный) адрес для сервера mgmt каждой подсети.

например, список (на самом деле намного длиннее)

10.70.30.0/24
10.70.31.0/24
10.70.32.0/24

cidrsubnet("10.70.30.0/24", 1, 0) разделится на две части и вернет 1-ю подсеть, т.е. 10.70.30.0/25. Тогда cidrhost(10.70.30.0/25, -3) даст мне 3-й от последнего адреса, т.е. 10.70.30.124.

Итак, вывод из приведенного выше списка, который я хочу:

10.70.30.124/25
10.70.31.124/25
10.70.32.124/25

Учитывая отсутствие итераций в Terraform, я хотел включить вышеуказанную логику с formatlist, чтобы перебрать список источников, выполнить cidr/subnet magic и вывести желаемый список.

Большое спасибо.

1 Ответ

0 голосов
/ 20 января 2019
variable "ipcidr" {
  default = "10.70.32.0/24"
}

output "new_ipcidr" {
  value = "${join("/", list(cidrhost(cidrsubnet(var.ipcidr, 1, 0), -4), element(split("/", cidrsubnet(var.ipcidr, 1, 0)), 1)))}"
}
$ terraform init && terraform apply
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

Outputs:

new_ipcidr = 10.70.32.124/25

Чтобы сделать эту работу для списка, выходное значение должно быть передано в ресурс с использованием подхода count и count.index к циклу. Например.

resource "aws_subnet" "main" {
  count      = "${length(var.ipcidrs)}"
  vpc_id     = "${aws_vpc.main.id}"
  cidr_block = "${join("/", list(cidrhost(cidrsubnet(var.ipcidrs[count.index], 1, 0), -4), element(split("/", cidrsubnet(var.ipcidrs[count.index], 1, 0)), 1)))}"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...