Назад | Перейти на главную страницу

Задача capistrano 2 update_code не использует sudo

Я использую 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 пытается выполнить извлечение, а затем установка группового разрешения на запись для этой папки.