Хобрук: Ваш путь к мастерству в программировании

Terraform: получайте результаты с модулями и for_each

Я использую следующую версию terraform:

root@sflowc01:~/terraform_proj# terraform version
Terraform v0.14.2
+ provider registry.terraform.io/dmacvicar/libvirt v0.6.2
+ provider registry.terraform.io/hashicorp/template v2.2.0

В моем модуле (./modules/singlevm/main.tf) я определил вывод как:

output "ips" {
  value = libvirt_domain.db1.network_interface.0.addresses
}

Когда я запускаю этот модуль в автономном режиме, я получаю результат в виде списка, например: (как и ожидалось)

ips = tolist([
  "192.168.122.167",
])

Мой tfvars определяется как:

myvms = {
  vm1 = {
    hostname  = "centos01"
    osdisk_gb = 20
    CPU_Count = 4
    RAM       = 256
    Image     = "CentOS-7-x86_64-GenericCloud.qcow2"
  }
  vm2 = {
    hostname  = "ubuntu01"
    osdisk_gb = 40
    CPU_Count = 8
    RAM       = 512
    Image     = "ubuntu-16.04-server-cloudimg-amd64-disk1.img"

  }
}

В моем корневом модуле я создаю несколько виртуальных машин, используя for_each, и пытаюсь получить тот же вывод из корневого модуля (./main.tf)

module "kvm_instances" {
  source = "./modules/singlevm"
  for_each = var.myvms
  ...
}

output "all_ips" {
  value = ["${module.kvm_instances.*.ips}"]
 }

Я получаю ошибку

Error: Unsupported attribute

  on main.tf line 23, in output "all_ips":
  23:   value = ["${module.kvm_instances.*.ips}"]
  This object does not have an attribute named "ips". 

Итак, как мне правильно извлечь IP-адреса всех виртуальных машин из моего корневого модуля? Заранее спасибо!


Ответы:


1

Вероятно, самым чистым объектом для построения из выходных данных будет map(list) с виртуальными машинами в качестве ключей и их списком IP-адресов в качестве значения. Вы можете использовать выражение for, подобное приведенному ниже, для построения этой карты:

output "all_ips" {
  value = { for vm in keys(var.myvms) : vm => module.kvm_instances[vm].ips }
}

который вернет карту, где каждая виртуальная машина является ключом, а связанный с ней список выходных IP-адресов в соответствии с вашим output будет значением.

21.12.2020
  • Спасибо @Matt, я смог заставить его работать, используя ваш подход. Я имел дело с вложенной картой и обновил свой вопрос, включив в него образцы tfvars. Итак, мне пришлось изменить var.myvms на ключи (var.myvms). Обновил и ваш ответ для других. 22.12.2020
  • Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..