我正在尝试使用remote-exec配置器来检查新AWS ec2实例上的用户数据是否已完成,但是我一直收到权限拒绝错误。
错误是
bash: /tmp/terraform_409380328.sh: Permission denied
我们正在使用Terraform版本10.8
有人可以帮忙吗?
provisioner "remote-exec" {
inline = [
"set -x",
"chmod +x /tmp/*sh",
"/bin/bash -c \"timeout 300 sed '/finished-user-data/q' <(tail /var/lib/cloud/data/result.json)\"",
]
connection {
type = "ssh"
user = "${var.user}"
private_key = "${file("${var.private_key}")}"
agent = false
}
}
答案 0 :(得分:0)
Terraform的remote-exec
预配器要求以允许可执行权限的方式安装/tmp
。如果您将其安装为noexec
,则remote-exec
预配器将无法工作。
对于EC2实例,一个更可靠的选择是使用user_data
机制将数据从Terraform传递到EC2实例。如果您的AMI包含cloud-init
,则可以将user_data
设置为Shell脚本,然后cloud-init
将在启动时自动运行该脚本,而无需Terraform SSH进入系统并运行任何其他命令。其他主要的云计算系统也具有类似的功能。
Terraform仅在其他选项不可用时(例如,将Terraform与无法与EC2的user_data
相比使用的传统计算系统一起使用时),才作为最后的选择提供预配置程序。
答案 1 :(得分:0)
我发现问题是我们的基础映像(ami)变硬了,并且阻止了脚本从/ tmp运行,这是terraform试图做的。
通过使用script_path选项,我可以指示terraform在其他目录中创建和运行脚本。
然后我可以使用cloud-init status --wait命令等待用户数据完成。
provisioner "remote-exec" {
inline = [
"sudo cloud-init status --wait",
]
connection {
type = "ssh"
user = "${var.user}"
private_key = "${file("${var.private_key}")}"
agent = false
script_path = "/home/${var.user}/user-data-check.sh"
}
}