2015-08-13 53 views
1

爲了簡化,請考慮食譜(食譜 - 測試)食譜中的以下塊。在廚師資源塊中運行sudo命令

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 

運行此作爲

「廚師客戶端-o菜譜測試」

輸出:

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命令。

經過一些調試發現「bash」和「execute」資源塊都沒有tty分配來在它們內部運行命令。

請分享您的想法。

+0

檢查你的sudoers配置文件(通常是/ etc/sudoers)並檢查'Defaults'中是否有'requiretty'條目。如果是這樣,你可以刪除它,你的上面的例子可以工作。 –

+0

是的。檢查了。是的,它確實提到了條目。 但不幸的是,刪除這是不是一個選項截至目前。 – Ram

+0

尋找一種改變系統寬配置的方式。 – Ram

回答

1

事情是這樣的:

你可以在廚師用它來運行sudo與分配的終端的任何設施也可以通過任何其他使用,這意味着requiretty指令在sudoers實際上沒用。所以你不妨將它刪除並且省去解決它的麻煩。

話雖如此,這裏有一些方法來解決該問題:

  1. 您能sshlocalhost沒有密碼?你可以使用ssh -tt localhost sudo somecomand ...

  2. 您可以使用expect工具,該工具設計用於控制面向終端的程序。類似expect -c "spawn sudo somecommand; interact"

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