我的问题类似于这个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用户,所以即使这是一个简单的解决方案,也不是我可以使用的。
答案 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始终询问。这是为了保持一致的行为。
答案 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权限的文件。以下是参考链接。