使用Terraform模块输出作为本地执行配置器的输入

时间:2020-03-20 16:29:51

标签: terraform

我正在尝试为terraform定义一个模块测试框架,而我的方法是使用Pester(由本地执行配置程序调用)以验证构建是否正确。

为此,我希望能够使用模块的输出,例如:

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

...作为本地执行配置器的输入。例如:

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.

我认为,通过使用depends_on,我将能够以某种方式强制terraform将其绘制出来,从而使“ windowsserver”模块在null_resource之前不起作用-但我认为也许我根本不正确。我在干嘛!

谢谢 丹

1 个答案:

答案 0 :(得分:1)

很抱歉这是一个愚蠢的问题,但是您是否已验证要使用的模块输出(module.windowsservers.network_interface_private_ip)实际上是字符串输入?可能是列表,或者其他..您可以尝试将其“强制”为locals块中的字符串,看看是否可以解决错误或将其更改以表明输出类型实际上不是字符串。

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

我只提到locals块是因为它看起来像您在多个地方使用它,而使用locals意味着仅使用了一个地方,而一次使用该地方可能会吐出有关无效类型的错误。

我还使用了locals块作为处理模块之间依赖关系的技巧,因为TF似乎并不总是能很好地解决这一问题。

我很抱歉将其发布为“答案”,但我尚不具备发表评论的能力:)