Deployment

Capistrano 2 update_code 任務不使用 sudo

  • October 29, 2014

我正在使用 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 腳本命令,或在單個呼叫中將命令連結在一起。請參閱第一個語法。

引用自:https://serverfault.com/questions/625553