【问题标题】:Terraform remote-exec variable passingTerraform 远程执行变量传递
【发布时间】:2016-10-30 04:11:32
【问题描述】:

我希望将变量传递给新创建的 aws_instance 上的脚本,但我不确定如何。这是我所拥有的:

provisioner "file" {
    source      = "${path.module}/scripts/slave-provisioner.sh"
    destination = "/tmp/slave-provisioner.sh"
}

provisioner "remote-exec" {
    inline = [
        "chmod +x /tmp/slave-provisioner.sh",
        "sudo /tmp/slave-provisioner.sh ${split(",",var.zookeeper_ips_list)}"
    ]
}

我已验证 zookeeper_ips_list 具有正确的 IP 列表。

我通过 terraform apply 得到的错误是:

 /tmp/terraform_939984059.sh: 5: /tmp/terraform_939984059.sh: 10.239.12.181: not found

所以基本上我想创建这台机器,然后启动我的配置程序脚本,该脚本通过 IP 列表进行配置。

【问题讨论】:

  • 这对我来说看起来很奇怪,因为您正在使用逗号分隔的字符串并将其转换为数组,然后将其传递给您的配置程序脚本。我不是 100% 确定预期的行为实际上是什么,因为我希望它希望你将它作为字符串传递。你真的打算这样做吗?或者你最好用空格替换逗号(使用replace())?
  • 我们将这些 IP 地址传递到一个 bash 脚本中,该脚本只会更新我们集群的 zookeeper 配置。只用一些 bash 格式就解决了这个问题。

标签: terraform


【解决方案1】:

希望您使用最新版本运行 terraform。

似乎 terraform 获取了变量var.zookeeper_ips_list 的值,但是双引号中的双引号很麻烦。你可以尝试通过\来逃避它们,我没有尝试代码,请告诉我结果

"sudo /tmp/slave-provisioner.sh ${split(\",\",var.zookeeper_ips_list)}"

你可以拿出来,结果也告诉我。

zookeeper_ips_list = ${split(",",var.zookeeper_ips_list)}

provisioner "remote-exec" {
    inline = [
        "chmod +x /tmp/slave-provisioner.sh",
        "sudo /tmp/slave-provisioner.sh ${zookeeper_ips_list)}"
    ]

【讨论】:

  • 我们删除了双引号并修复了一些 bash 格式并能够解决这个问题。到目前为止,Terraform 确实缺乏良好的调试选项。将文件复制到远程主机并使用传递变量执行它们并不是 Terraform 中最简单的事情。
  • 感谢更新。 Terraform 仍处于开发模式,而不是 GA 版本。如果我的回答对你有帮助,请投票。如果解决了您的问题,请接受。
【解决方案2】:

这是通过一些不相关的 bash 清理解决的。 Terraform 的格式正确,并且按预期运行。我们没有在 bash 脚本中正确处理传入的 IP 地址,因此它失败了。

Terraform 在调试方面并不是最强大的,因此很难追踪。

【讨论】:

  • 您能否编辑您的答案以显示您如何修复它?
  • 解决方案来自于修复底层的 shell 脚本。修复bash语法错误,数组进来时处理。最终没有Terraform问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-16
  • 1970-01-01
  • 2012-02-06
  • 1970-01-01
  • 1970-01-01
  • 2019-11-11
  • 2021-05-06
相关资源
最近更新 更多