我正在使用Capistrano 2(.15.4)部署rails应用程序(我知道,试图达到3,但尚未完成)。 我们有一个新的服务器环境正在build立,IT人员更倾向于通过我们自己的用户访问,并要求用户部署。
我一直在testing使用:
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:restartfunction被手动定义为:
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没有被实现来支持你描述的用例。 你可以尝试设置gitvariables来包含sudo(set:git,'sudo git'),然而你可能会遇到你的转发authentication密钥不能用于sudo'ed git命令的问题。
也许更有成效的策略包括将用户添加到cap试图检入的文件夹的所有者组,然后在该文件夹上设置组的可写权限。
尝试按照最新的2.x 文档或2.14.5 版本的build议定义你的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:: ::操作::调用
sudo操作用于通过[ http://en.wikipedia.org/wiki/Sudo sudo]执行命令。 它可以以两种方式中的任何一种使用(尽pipe一种方式已被弃用)。 虽然你可以直接在你的run()调用中使用sudo,但这个帮助程序可以让Capistrano在远程服务器提示时提示你inputsudo密码。
sudo(options={})
sudo的这个用法实际上并不执行任何操作。 而是返回一个包含要执行的sudo命令的string。 这使您可以将其embedded到通过运行调用的命令中,从而使您可以构build任意使用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”作为用户相同。
variables
:sudo
在服务器上指定sudo的path。 这个默认值只是“sudo”,但是如果服务器上的sudo位于非标准位置,或者被命名为“sudo”以外的其他名称,则可以相应地设置该variables。
:sudo_password
指定密码“提示”(而不是密码本身!)sudo应该使用时要求密码。 你不需要改变这个(默认是“sudo password:”),因为只有Capistrano可以识别sudo提示并将提示传递给用户。 将此variables的值设置为空string将导致Capistrano不要求任何特定的密码提示。
sudo(command, options={}, &block)
sudo的这种使用已经被弃用,并且仅仅为了向后兼容一些Capistrano食谱而被包括在内。 它和run()基本相同,只不过它会在命令前加上sudo(参见第一次使用sudo())。
sudo "apachectl restart" sudo "crontab -l", :as => "bob"
请注意,此语法不允许复杂的shell脚本命令,或者在单个调用中将命令链接在一起。 看到第一个语法。