如何在Terraform remote-exec中处理sudo密码提示?
解决Terraform remote-exec执行sudo时的密码提示问题
在通过Terraform部署Ubuntu虚拟机,使用remote-exec provisioner结合SSH连接执行sudo命令时,会出现密码提示导致流程卡住。以下是几种可行的解决方法:
方法1:配置sudo免密执行指定命令
通过给目标用户添加sudoers规则,允许其无需密码执行特定命令(比如sed),避免手动输入密码。
修改后的Terraform代码:
resource "null_resource" "remoteprovision" { depends_on = [null_resource.waiting_for_vm_bootup] provisioner "remote-exec" { connection { host = var.overlay_config ? data.nutanix_floating_ip.test[0].status[0].resources[0].floating_ip : nutanix_virtual_machine.gigatg.nic_list_status[0].ip_endpoint_list[0].ip type = "ssh" user = "test" timeout = "180s" password = "test" } inline = [ "wget -nH --cut-dirs=2 --no-parent -R 'index.html*' http://10.115.32.216/nutanix/cloud.conf -P /home/test/", # 添加sudo免密规则,允许test用户无密码执行sed命令 "echo 'test ALL=(ALL) NOPASSWD: /usr/bin/sed' | sudo tee -a /etc/sudoers.d/test-sed", # 执行sudo sed修改配置文件,无需输入密码 "sudo sed -r 's/(\\b[0-9]{1,3}\\.){3}[0-9]{1,3}\\b/${var.cntrl_ip}/' /home/test/cloud.conf" ] } }
这种方式仅授权特定命令免密,安全性更高,适合生产环境。若需要允许用户执行所有sudo命令免密,可将规则改为:
"echo 'test ALL=(ALL) NOPASSWD: ALL' | sudo tee -a /etc/sudoers.d/test-nopasswd"
方法2:直接在sudo命令中传递密码
使用sudo -S参数从标准输入读取密码,结合echo将密码管道传递给sudo,跳过交互提示。
修改后的Terraform代码:
resource "null_resource" "remoteprovision" { depends_on = [null_resource.waiting_for_vm_bootup] provisioner "remote-exec" { connection { host = var.overlay_config ? data.nutanix_floating_ip.test[0].status[0].resources[0].floating_ip : nutanix_virtual_machine.gigatg.nic_list_status[0].ip_endpoint_list[0].ip type = "ssh" user = "test" timeout = "180s" password = "test" } inline = [ "wget -nH --cut-dirs=2 --no-parent -R 'index.html*' http://10.115.32.216/nutanix/cloud.conf -P /home/test/", # 通过echo传递密码给sudo -S,避免交互 "echo 'test' | sudo -S sed -r 's/(\\b[0-9]{1,3}\\.){3}[0-9]{1,3}\\b/${var.cntrl_ip}/' /home/test/cloud.conf" ] } }
注意:这种方式密码会明文出现在命令历史和Terraform日志中,存在安全风险,仅建议在测试环境使用。
额外注意事项
原命令中sed操作的cloud.conf未指定完整路径,可能导致找不到文件,建议统一使用/home/test/cloud.conf完整路径。
内容的提问来源于stack exchange,提问作者Abdul Kareem
相关产品推荐
相关产品推荐

