You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 10:21:12