Capistrano 2 update_code 任務不使用 sudo
我正在使用 Capistrano 2(.15.4) 部署 rails 應用程序(我知道,試圖達到 3 但還沒有完全達到)。我們正在設置一個新的伺服器環境,IT 更喜歡通過我們自己的使用者進行訪問,並將 sudo’ing 到使用者部署為。
我一直在測試使用:
set :use_sudo, true set :sudo, "sudo -u <user>"
在我看來 sudo 正在處理使用sudo命令的手動定義任務:
cap deploy:restart ... triggering load callbacks * 2014-09-01 11:34:28 executing `deploy:restart' * executing "sudo -u <user> touch /path/to/deploy/current/tmp/restart.txt" servers: ["hostname.com"] ...
請注意,deploy:restart功能手動定義為:
cmd = "touch #{current_path}/tmp/restart.txt" sudo cmd
但它看起來不像sudo在部署時啟動自動update_code任務:
cap deploy ... triggering load callbacks * 2014-09-01 10:14:32 executing `deploy' * 2014-09-01 10:14:32 executing `deploy:update' ** transaction: start * 2014-09-01 10:14:32 executing `deploy:update_code' updating the cached checkout on all servers ... copying the cached version to /path/to/deploy/20140901171450 * executing "cp -RPp /path/to/deploy/shared/cached-copy /path/to/deploy/releases/20140901171450 && (echo 690 > /path/to/deploy/releases/20140901171450/REVISION)" servers: ["hostname.com"] [hostname.com] executing command ** [out :: hostname] cp: cannot create directory `/path/to/deploy/releases/20140901171450': Permission denied command finished in 918ms *** [deploy:update_code] rolling back * executing "rm -rf /path/to/deploy/releases/20140901171450; true" servers: ["hostname.com"] [hostname.com] executing command command finished in 922ms ...
任何關於為什麼sudo不適用於update_code任務的指導將不勝感激,謝謝!
Capistrano 未實施以支持您描述的案例。您可以嘗試將 git 變數設置為包含 sudo(set :git, ‘sudo git’),但是您可能會遇到轉發的身份驗證密鑰對 sudo 的 git 命令不可用的問題。
也許更有效的策略是將您的使用者添加到 cap 試圖簽出的文件夾所有者的組中,然後設置該文件夾的組可寫權限。
嘗試按照最新的 2.x文件或 2.14.5版本中的建議定義您的 sudo 遠端命令
特別注意描述作為另一個使用者呼叫 sudo 的語法的部分:
#{sudo :as => 'bob'}
+ 呼叫run
而不是cmd
深入探勘 ruby 原始碼以了解如何呼叫 sudo: https ://github.com/capistrano/capistrano/blob/legacy-v2/lib/capistrano/shell.rb
文件中的鈍複製粘貼如下:
定義
sudo(options={}) sudo(command, options={}, &block)
模組
Capistrano::Configuration::Actions::Invocation
sudo 操作用於通過 [ http://en.wikipedia.org/wiki/Sudo sudo] 執行命令。它可以以兩種方式中的任何一種使用(儘管一種已被棄用)。儘管您可以在 run() 呼叫中直接使用 sudo,但此幫助程序可以讓 Capistrano 在遠端伺服器提示您輸入 sudo 密碼時提示您輸入密碼。
sudo(options={})
sudo 的這種使用實際上並沒有執行任何操作。相反,它返回一個包含要執行的 sudo 命令的字元串。這使您可以將其嵌入到通過 run 呼叫的命令中,從而使您可以建構使用 sudo 的任意複雜命令。
run "#{sudo} apachectl restart" run "#{sudo :as => 'bob'} crontab -l" run "cd /u/apps/social && #{sudo} script/restart" run "if [ ! -d /u/apps ]; then #{sudo} mkdir -p /u/apps; fi"
論據選項
:as
指定要 sudo 的使用者。這預設為 nil,這通常與將“root”指定為使用者相同。
變數
:sudo
指定伺服器上 sudo 的路徑。這預設為“sudo”,但如果伺服器上的 sudo 位於非標準位置或命名為“sudo”以外的其他名稱,則可以相應地設置此變數。
:sudo_password
指定 sudo 在詢問密碼時應使用的密碼“提示”(而不是密碼本身!)。您永遠不需要更改它(預設為“sudo 密碼:”),因為這只是為了讓 Capistrano 可以辨識 sudo 提示並將提示傳遞給使用者。將此變數的值設置為空字元串將導致 Capistrano 不請求任何特定的密碼提示。
sudo(command, options={}, &block)
sudo 的這種使用已被棄用,並且僅包含在與某些 Capistrano 配方的向後兼容性中。它本質上與 run() 相同,只是它會在命令前加上 sudo(參見第一次使用 sudo())。
sudo "apachectl restart" sudo "crontab -l", :as => "bob"
請注意,此語法不允許複雜的 shell 腳本命令,或在單個呼叫中將命令連結在一起。請參閱第一個語法。