【问题标题】:How to run sudo commands in terraform?如何在 terraform 中运行 sudo 命令?
【发布时间】:2016-10-17 06:25:00
【问题描述】:

我的问题与这篇 git hub 帖子类似,但不幸的是没有解决:

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

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

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

【问题讨论】:

    标签: sudo provisioning terraform


    【解决方案1】:

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

    【讨论】:

    • 这不会将密码打印到日志中吗?此外,您期望第二个 sudo 不要求输入密码似乎是有风险的,因为第一次运行会缓存它。
    • 可能。老实说,我已经很多年没有接触过 terraform 了。如果您有更好的解决方案,请发布!
    【解决方案2】:

    怎么样:

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

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

    https://superuser.com/q/67765

    【讨论】:

    • 我真的很想对 Alex Cohen 的回答发表评论,但由于我是新成员并且没有 50 名声望,所以不能发表评论,所以单独发布。
    • 不。添加答案是合适的方法,因为您有不同的解决方案。
    【解决方案3】:

    如果是 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 将复制包含所有需要在服务器 /tmp 位置执行的 shell 命令的 script.sh,并以 sudo 权限执行该文件。以下是参考链接。

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

    【讨论】:

      猜你喜欢
      • 2011-01-29
      • 1970-01-01
      • 1970-01-01
      • 2012-03-28
      • 2019-06-03
      • 2019-08-20
      • 1970-01-01
      • 1970-01-01
      • 2014-08-15
      相关资源
      最近更新 更多