Я работаю с развертыванием виртуальных машин через AWS с terraform (v1.0.9) в качестве инфраструктуры как кода. у меня есть Terraform output.tf для печати двух lan a ips и распечатки кода, список списков, например [["ip_a",],["ip_b",]], но я хочу такой список ["ip_a", "ip_b" ].
код output.tf
`output "foo" {
value = {
name = "xyz"
all_ips = tolist(aws_network_interface.vm_a_eni_lan_a.*.private_ips)
}
}`
печать -->
"name" = "xyz" "lan_a_ips" = tolist(\[ toset(\[ "10.0.27.116",\]), toset(\[ "10.0.28.201",\]), \])
но я хочу "lan_a_ips" = ["10.0.27.116", "10.0.28.201"]
Я верю, что настройка output.tf может помочь. Любая помощь приветствуется.
В вашем случае вы только что установили знаковое выражение [1] не в том месте, то есть вместо установки aws_network_interface.vm_a_eni_lan_a.private_ips[*]
вы установили его на aws_network_interface.vm_a_eni_lan_a.*.private_ips
. Поэтому вам нужно только изменить выходное значение:
output "foo" {
value = {
name = "xyz"
all_ips = aws_network_interface.vm_a_eni_lan_a.private_ips[*]
}
}
Обновлено: Вышеприведенное применимо, когда создается только один экземпляр ресурса aws_network_interface
. В ситуациях, когда существует несколько экземпляров этого ресурса, созданного с мета-аргументом count
, для получения списка IP-адресов можно использовать следующее:
output "foo" {
value = {
name = "xyz"
all_ips = flatten([for i in aws_network_interface.test[*] : i.private_ips[*]])
}
}
Здесь цикл for
[2] используется для перебора всех экземпляров ресурса, отсюда и выражение splat при ссылке на них aws_network_interface.test[*]
. Кроме того, поскольку это создаст список списков (поскольку private_ips[*]
возвращает список), встроенную функцию flatten
[3] можно использовать для создания единого списка IP-адресов.
[1] https://www.terraform.io/language/expressions/splat
[2] https://www.terraform.io/language/expressions/for
[3] https://www.terraform.io/language/functions/flatten
Спасибо Марко за ответ. Но у нас есть два интерфейса lan_a[0] и lan_a[1]. Мы используем count.index для создания двух ips. По tring, как вы упомянули, выдает эту ошибку --> «aws_network_interface.vm_a_eni_lan_a имеет набор «счетчик», его атрибуты должны быть доступны в определенных экземплярах. │ │ Например, чтобы сопоставить индексы ссылающегося ресурса, используйте: .показатель] "
Итак, есть один частный IP, но два интерфейса?
нет, у нас есть два интерфейса с именами lan_a[0] и lan_a[1] и, соответственно, два частных IP-адреса (например, каждый интерфейс имеет уникальный IP-адрес)
Я отредактировал вопрос, он также должен работать с несколькими IP-адресами, назначенными нескольким интерфейсам.
Можете ли вы добавить
aws_network_interface
к вопросу?