Вывести вывод terraform из списка списка в список строк

Я работаю с развертыванием виртуальных машин через 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 может помочь. Любая помощь приветствуется.

Можете ли вы добавить aws_network_interface к вопросу?

Marko E 05.04.2022 10:24
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
29
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В вашем случае вы только что установили знаковое выражение [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 имеет набор «счетчик», его атрибуты должны быть доступны в определенных экземплярах. │ │ Например, чтобы сопоставить индексы ссылающегося ресурса, используйте: .показатель] "

Vinay Gowda 05.04.2022 11:43

Итак, есть один частный IP, но два интерфейса?

Marko E 05.04.2022 11:57

нет, у нас есть два интерфейса с именами lan_a[0] и lan_a[1] и, соответственно, два частных IP-адреса (например, каждый интерфейс имеет уникальный IP-адрес)

Vinay Gowda 05.04.2022 12:30

Я отредактировал вопрос, он также должен работать с несколькими IP-адресами, назначенными нескольким интерфейсам.

Marko E 05.04.2022 12:36

Другие вопросы по теме