Я использую Capistrano 2 (.15.4) для развертывания rails-приложений (я знаю, пытаюсь добраться до 3, но еще не совсем). У нас настраивается новая серверная среда, при этом ИТ-специалисты предпочитают доступ через нашего собственного пользователя и sudo'ing пользователю для развертывания как.
Я тестировал:
set :use_sudo, true
set :sudo, "sudo -u <user>"
Мне кажется, что 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"]
...
Обратите внимание, что развернуть: перезапустить функциональность определяется вручную как:
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
...
Любые указания о том, почему судо не применяется к update_code задача будет очень признательна, спасибо!
попробуйте определить удаленные команды sudo, как рекомендовано в последней версии 2.x документация или ровно 2,14,5 версия
Обратите особое внимание на часть, которая описывает синтаксис вызова 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 :: Конфигурация :: Действия :: Вызов
Действие sudo используется для выполнения команд через [http://en.wikipedia.org/wiki/Sudo sudo]. Его можно использовать двумя способами (хотя один из них устарел). Хотя вы можете использовать sudo непосредственно в вызовах run (), этот помощник позволяет 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"
Обратите внимание, что этот синтаксис не позволяет использовать сложные команды сценария оболочки или объединять команды в цепочку за один вызов. См. Первый синтаксис для этого.
Capistrano не реализован для поддержки описываемого вами варианта использования. Вы можете попробовать установить переменную git для включения sudo (set: git, 'sudo git'), однако тогда вы, скорее всего, столкнетесь с проблемой того, что ваш перенаправленный ключ аутентификации недоступен для команды sudo'ed git.
Возможно, более плодотворная стратегия включает добавление вашего пользователя в группу владельца папки, в которую cap пытается выполнить извлечение, а затем установка группового разрешения на запись для этой папки.