【问题标题】:Using Terraform module output as input to local-exec provisioner使用 Terraform 模块输出作为 local-exec 供应商的输入
【发布时间】:2020-07-01 19:40:58
【问题描述】:

我正在尝试为 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 之前失效 - 但我认为我的内容可能存在根本不正确的地方我在做!

谢谢 丹

【问题讨论】:

  • 这个output是来自同一个模块还是另一个模块?
  • 嗨,Matt - 这是上面配置中调用的模块 - 它位于上面两层的文件夹结构中。
  • 这个错误听起来像是来自其他地方。如果您删除 null_resource 并运行它会发生什么?如果您将null_resource 替换为值为module.windowsservers.network_interface_private_ip 的输出,会发生什么情况?
  • 我有 module.windowsservers.network_interface_private_ip 作为输出值 - 如果我注释掉 null_resource 它可以工作。

标签: terraform


【解决方案1】:

如果这是一个愚蠢的问题,我深表歉意,但是您是否验证了要使用的模块输出 (module.windowsservers.network_interface_private_ip) 实际上是作为字符串输入的?也许它是一个列表,或者其他什么..您可以尝试“强制”它成为本地块中的字符串,看看是否可以修复错误或更改它以指示输出类型可能实际上不是字符串..

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

我只提到 locals 块,因为它看起来像你在多个地方使用它,而使用 locals 意味着它只在一个地方被使用,并且一旦一个地方可能会吐出有关无效类型的错误。

我还使用 locals 块作为处理模块之间依赖关系的技巧,因为 TF 似乎并不总是能很好地处理那个......

我很抱歉作为“答案”发布,但我还没有发布 cmets 的业力:)

【讨论】:

  • 谢谢 - 这根本不是一个愚蠢的问题 - 我的模块输出和随后的预期输入之间确实存在数据不匹配。我通过使用 [0] 引用对象中的第一个(也是唯一的)元素在短期内修复了它 - 但会做一些阅读!
猜你喜欢
  • 1970-01-01
  • 2021-07-08
  • 2017-11-14
  • 1970-01-01
  • 2021-01-11
  • 2020-10-24
  • 2023-03-06
  • 2019-05-25
  • 2016-11-28
相关资源
最近更新 更多