Использование вывода модуля Terraform в качестве входных данных для инициатора local-exe c - PullRequest
0 голосов
/ 20 марта 2020

Я пытаюсь определить структуру тестирования модуля для terraform, и мой подход состоит в том, чтобы использовать Pester, вызванный из провайдера local-exe c для проверки правильности сборки.

Для этого Я надеялся, что смогу использовать выходные данные модуля, например:

output "windows_ip_address" {
  value = module.windowsservers.network_interface_private_ip
}

... в качестве входных данных для локального exe c поставщика. Например:

module "windowsservers" {
  source              = "../../"
  vm_hostname         = "host${random_id.ip_dns.hex}-windows" // line can be removed if only one VM module per resource group
  resource_group_name = azurerm_resource_group.test.name
  is_windows_image    = true
  admin_username      = var.admin_username
  admin_password      = var.admin_password
  vm_os_simple        = "WindowsServer"
  vnet_subnet_id      = azurerm_subnet.subnet1.id
}

resource "null_resource" "run-pestertest" {
  provisioner "local-exec" {
    #command     = "..\\test_azurerm_compute.ps1 -vmhostname test -vmip ${module.windowsservers.network_interface_private_ip}"
    command = "echo ${module.windowsservers.network_interface_private_ip}"
    interpreter  = ["pwsh", "-Command"]
  }
  depends_on = [module.windowsservers]
  triggers = {
    always_run = "${timestamp()}"
  }
}

... но я получаю:

Error: Invalid template interpolation value: Cannot include the given value in a string template: string required.

Я подумал, что с помощью depen_on я смогу заставить terraform отобразить его таким образом что модуль "windowsserver" будет деактивирован до null_resource - но я думаю, что, возможно, что-то в корне неверно в том, что я делаю!

Спасибо, Дэн

1 Ответ

1 голос
/ 22 марта 2020

Я прошу прощения, если это глупый вопрос, но вы проверили, что вывод модуля, который вы хотите использовать (module.windowsservers.network_interface_private_ip), фактически напечатан как строка? Возможно, это список или что-то еще. Вы можете попробовать «заставить» его быть строкой в ​​блоке locals и посмотреть, исправляет ли это ошибку или изменяет ее, чтобы указать, что тип вывода на самом деле не является строкой.

locals = {
module_private_ip = "${tostring(module.windowsservers.network_interface_private_ip)}"
}

Я упоминаю только блок localals, потому что он выглядит так, как будто вы используете его в нескольких местах, а использование localals означает, что он используется только в одном месте, и в одном месте, где может появиться ошибка о недопустимом типе .

Я также использовал блок locals в качестве трюка, чтобы справиться с зависимостями между модулями, поскольку TF не всегда справляется с этим хорошо.

, и я извиняюсь за публикацию как "ответ", но у меня пока нет кармы, чтобы оставлять комментарии:)

...