如何在 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 始终询问。这是为了一致的行为。
如果是 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.
我的问题和这个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 始终询问。这是为了一致的行为。
如果是 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.