Terraform远程执行变量传递

Terraform远程执行变量传递,terraform,Terraform,我希望在新创建的aws_实例上向脚本传递变量,但我不确定如何传递。以下是我所拥有的: provisioner "file" { source = "${path.module}/scripts/slave-provisioner.sh" destination = "/tmp/slave-provisioner.sh" } provisioner "remote-exec" { inline = [ "chmod +x /tmp/slave-p

我希望在新创建的aws_实例上向脚本传递变量,但我不确定如何传递。以下是我所拥有的:

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_列表中的IP列表是否正确

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

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

所以基本上我想创建这台机器,然后启动我的provisioner脚本,它通过一个IP列表,这样它就可以进行配置了

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

terraform似乎获得了变量
var.zookeeper\u ips\u 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)}"
    ]

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

terraform似乎获得了变量
var.zookeeper\u ips\u 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清理解决的。地形的格式是正确的,并按预期运行。我们在bash脚本中没有正确处理传入的IP地址,所以它失败了


Terraform在调试方面并不是最健壮的,所以跟踪起来有点棘手

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


Terraform在调试方面并不是最健壮的,所以跟踪起来有点棘手

我们删除了双引号并修复了一些bash格式,并且能够解决这个问题。到目前为止,Terraform确实缺乏良好的调试选项。在Terraform中,将文件复制到远程主机并使用pass变量执行它们并不是最简单的事情。感谢您的更新。Terraform仍处于开发模式,而不是GA版本。如果我的回答对你有帮助,请投票表决。如果解决了您的问题,请接受。我们删除了双引号并修复了一些bash格式,并且能够解决此问题。到目前为止,Terraform确实缺乏良好的调试选项。在Terraform中,将文件复制到远程主机并使用pass变量执行它们并不是最简单的事情。感谢您的更新。Terraform仍处于开发模式,而不是GA版本。如果我的回答对你有帮助,请投票表决。如果你的问题解决了,请接受它。这对我来说很奇怪,因为你要把一个逗号分隔的字符串转换成一个数组,然后传递给你的provisioner脚本。我不是100%确定预期的行为实际上是什么,因为我希望它希望您将其作为字符串传递。你真的想那样做吗?或者您最好用空格替换逗号(使用
replace()
)?我们正在将这些IP地址传递到一个bash脚本中,该脚本只更新集群的zookeeper配置。这个问题用一些bash格式就解决了。这在我看来很奇怪,因为你要把一个逗号分隔的字符串转换成一个数组,然后传递给你的provisioner脚本。我不是100%确定预期的行为实际上是什么,因为我希望它希望您将其作为字符串传递。你真的想那样做吗?或者您最好用空格替换逗号(使用
replace()
)?我们正在将这些IP地址传递到一个bash脚本中,该脚本只更新集群的zookeeper配置。仅通过一些bash格式就解决了该问题。您可以编辑您的答案以显示您是如何修复它的吗?解决方案来自修复底层shell脚本。修复bash语法错误并在数组出现时处理它。最终没有Terraform问题。您可以编辑您的答案以显示您是如何修复它的吗?解决方案来自修复底层shell脚本。修复bash语法错误并在数组出现时处理它。最终没有地形问题。