如何在terraform中运行sudo命令?

时间:2016-06-15 23:06:04

标签: sudo provisioning terraform

我的问题类似于这个git hub帖子,但不幸的是它尚未解决:

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

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

我来自一个ansible背景,它具有sudo: yes选项,允许任何命令ansible运行在我的ansible-playbook运行命令中使用--ask-sudo-pass可选项时运行具有sudo权限的命令。我想在我的terraform脚本的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用户,所以即使这是一个简单的解决方案,也不是我可以使用的。

3 个答案:

答案 0 :(得分:13)

答案是在我的第一个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"
    ]
  }

答案 1 :(得分:0)

那又怎么样:

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

-k意味着忽略缓存的凭据以强制sudo始终询问。这是为了保持一致的行为。

https://superuser.com/q/67765

答案 2 :(得分:0)

在EC2实例的情况下,使用密码很难处理。我只是尝试下面的解决方案,它奏效了。

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

第2步:使用脚本参数代替 inline 参数,只需在资源块中包含以下代码行即可。

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权限的文件。以下是参考链接。

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