运行 Chef 资源块中的 sudo 命令

Run sudo commands in Chef resource block

为简化起见,请考虑食谱(食谱测试)食谱中的以下块。

 79: bash 'Running sudo test sleep command' do
 80:   user 'root'
 81:   cwd '/tmp'
 82:   code <<-EOH
 83:   sudo sleep 1000
 84:   EOH
 85: end

运行 这就是

"chef-client -o cookbook-test"

输出:

Mixlib::ShellOut::ShellCommandFailed
------------------------------------
Expected process to exit with [0], but received '1'
---- Begin output of "bash"  "/tmp/chef-script20150813-3835-3kj758" ----
STDOUT:
STDERR: sudo: sorry, you must have a tty to run sudo
---- End output of "bash"  "/tmp/chef-script20150813-3835-3kj758" ----
Ran "bash"  "/tmp/chef-script20150813-3835-3kj758" returned 1

我添加 "sudo sleep" 只是为了举例说明用例。在实际情况下,我们在上面的资源块中 运行 个脚本,这些脚本具有 sudo 命令。

调试后发现"bash"和"execute"资源块都没有分配给运行命令的tty。

请分享您的想法。

事情是这样的:

您可以在 Chef 中使用的任何工具 运行 sudo 以及分配的 tty 也可以被任何人使用 else,这意味着 [= sudoers 中的 11=] 指令实际上是无用的。因此,您不妨删除它,省去解决它的麻烦。

话虽如此,这里有一些解决问题的方法:

  1. 你能不用密码就sshlocalhost吗?你可以只使用 ssh -tt localhost sudo somecomand ....

  2. 您可以使用expect工具,该工具专为控制面向终端的程序而设计。类似于 expect -c "spawn sudo somecommand; interact".

  3. 您可以使用 screen,类似 screen sudo somecommand