Terraform远程执行失败,权限被拒绝

时间:2019-08-29 09:31:18

标签: amazon-web-services amazon-ec2 terraform

我正在尝试使用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
    }
  }

2 个答案:

答案 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"
  }
}