如何在 terraform 中 运行 sudo 命令?

How to run sudo commands in terraform?

我的问题和这个githubpost类似,可惜没有解决:

https://github.com/hashicorp/terraform/issues/550

我想要一种简单的方法来为我的 terraform 脚本的 provisioner "remote-exec" { } 块中的命令 运行 授予 sudo 权限。

我来自一个具有 sudo: yes 选项的 ansible 背景,当使用 --ask-sudo-pass在我的 ansible-playbook 运行 命令中是可选的。我想在我的地形脚本的 provisioner "remote-exec" 块中做类似的事情。

这是我想要的 provisioner "remote-exec" 区块 运行:

  provisioner "remote-exec" {
    inline = [
      "sudo apt-get update",
      "sudo apt-get install -y curl"
    ]
  }

当我 运行 在我的 terraform apply 中执行此操作时,我看到以下行出现在此命令的输出中:

openstack_compute_instance_v2.test.0 (remote-exec): [sudo] password for myUserName:
openstack_compute_instance_v2.test.1 (remote-exec): [sudo] password for myUserName:
openstack_compute_instance_v2.test.2 (remote-exec): [sudo] password for myUserName:

然后它给了我无数个这样的东西:

openstack_compute_instance_v2.test.0: Still creating... 
openstack_compute_instance_v2.test.1: Still creating... 
openstack_compute_instance_v2.test.2: Still creating... 

那么我该如何解决这个问题并让 terraform 运行 sudo 命令?

注意: 我的 provisioner "remote-exec" 块的连接不能是 root,所以尽管这是一个简单的解决方案,但我无法使用。

答案是在我的第一个 sudo 命令中使用以下语法:

"echo yourPW | sudo -S someCommand" 

这会绕过 sudo 密码提示,直接在命令中输入密码。我已经将我的 sudo 密码作为变量 "${var.pw}" 所以 运行 我的 sudo 命令很简单,只需将我的第一个命令更改为:

  provisioner "remote-exec" {
    inline = [
      "echo ${var.pw} | sudo -S apt-get update",
      "sudo apt-get install -y curl"
    ]
  }

怎么样:

echo ${var.pw} | sudo -S -k apt-get update

-k 表示忽略缓存的凭据以强制 sudo 始终询问。这是为了一致的行为。

https://superuser.com/q/67765

如果是 EC2 实例,很难用密码处理。我只是尝试了以下解决方案并且它有效。

第 1 步:将所有命令放入当前 workspace/working 目录的 script.sh 文件中

第 2 步:使用脚本参数代替 内联 参数,并在资源块中简单地包含以下代码行。

provisioner "file" {
    source      = "script.sh"
    destination = "/tmp/script.sh"
  }

  provisioner "remote-exec" {
    inline = [
      "chmod +x /tmp/script.sh",
      "sudo /tmp/script.sh args",
    ]
  }

使用此解决方案,terraform 将复制 script.sh,其中包含需要在服务器的 /tmp 位置执行的所有 shell 命令,并将使用 sudo permissions.Below 执行文件是引用 link.

https://www.terraform.io/docs/provisioners/remote-exec.html