2013-11-13 2 views
25

Я хочу написать рецепт с Capistrano 3, выполняющим задачу на удаленном сервере с помощью sudo.Capistrano 3 sudo task

С Capistrano 2 это может быть сделано, например:

default_run_options[:pty] = true 

task :hello do 
    run "#{sudo} cp ~/something /something" 
end 

С Capistrano 3 я нашел:

set :pty, true 

Но я не смог выполнить задание выполняется с Судом.

Как запустить задачу с помощью sudo?

+0

@Rubyman ': use_sudo' не является допустимым параметром для Capistrano 3. См. Этот [соответствующий билет] (https://github.com/capistrano/capistrano/issues/920) – milkfarm

ответ

13

Я обычно пишу так:

task :hello do 
    on roles(:all) do |host| 
    execute :sudo, :cp, '~/something', '/something' 
    end 
end 

Редактировать

Capistrano 3 не поддерживает Sudo с паролем.

Однако, я создал небольшой gem, который позволяет использовать sudo с паролем в задаче Capistrano 3.

Добавить sshkit-sudo в Gemfile вашего приложения:

# Gemfile 
gem 'sshkit-sudo' 

И требуют 'sshkit/Sudo' в вас Capfile:

# Capfile 
require 'sshkit/sudo' 

Теперь вы можете выполнить команду с Судом следующим образом:

task :hello do 
    on roles(:all) do 
    sudo :cp, '~/something', '/something' 
    end 
end 
+1

Я уже пробовал это. На консоли отображается следующее: INFO [5d8e920e] Запуск/usr/bin/env sudo cp ~/something/something на example.local DEBUG [5d8e920e] Команда:/usr/bin/env sudo cp ~/something/something DEBUG [ 5d8e920e] \t [sudo] пароль для основного: я также могу вставить мой пароль, который отображается, кстати, но задача не продолжается при возврате. – crimi

+0

Если вы действительно хотите использовать sudo с паролем, вы должны использовать capistrano 2. –

+0

Это работает. Благодарю. Если кто-то хочет сделать apt-ge с помощью sshkit-sudo, попробуйте 'sudo: 'apt-get', '-y install curl'' –

20

Руководство Capistrano 3 рекомендует использовать sudo без пароля. Это позволяет вашему менее привилегированному пользователю выполнить команду sudo без ввода пароля через PTY.

Вы можете использовать задачу, Кентаро писал выше, и добавить что-то вроде следующего в файл/и т.д./sudoers:

deploy ALL=NOPASSWD:/bin/cp ~/something /something 

http://www.capistranorb.com/documentation/getting-started/authentication-and-authorisation/#toc_8

+6

И если ваши политики определяют, что вы должны использовать пароль? – Ghoti

12

Чтобы решить эту проблему, мне нужно, чтобы добавить set :pty, true к мой файл deploy.rb.

теперь я могу запустить следующее:

# config valid only for Capistrano 3.1 
lock '3.1.0' 

set :application, 'APP_NAME' 
set :pty, true 
set :ssh_options, {:forward_agent => true} 

namespace :deploy do 

    desc 'Restart NGINX' 
    task :restart do 
    on roles(:app), in: :sequence, wait: 1 do 
     execute :sudo, "./restart.sh" 
    end 
    end 

end 

Эта задача в основном запускает скрипт под названием restart.sh, который имеет команду в пределах sudo service nginx restart.

+1

Да, только после установки 'set: pty, true' вы можете выполнять команды sudo с capistrano 3. В противном случае вы получите' sudo stderr: sudo: no tty present и no askpass program defined' errors. – bibstha

+2

Когда я это делаю, он спрашивает меня о моем пароле, но я не могу «ввести» его, он просто дает мне новые строки .. –

+0

@TimBaas вы могли решить свою проблему? Я тоже застрял с той же проблемой – aelor

2

вы хотите «как пользователь может делать конец», как

as "root" do 
    execute :something 
end 
+0

Я думаю, что это синтаксис Capistrano 2.x? –

+0

AFAIK as-user-do - это новая конструкция крышки 3. Я мог ошибаться, но с момента своего рождения я использовал кепку и не могу вспомнить, когда-либо видел эту конструкцию до более новой версии. Но ... моя память, конечно, ошибочна. –

0

Если вам действительно нужно использовать sudo вы всегда можете отобразить команду как SSHKit.config.command_map[:rm] = 'sudo rm' которая сделает execute :rm в надлежащее rm команды вызывается с sudo. Если ваш пользователь развертывания находится в sudoers, все будет работать так, как ожидалось.

Смежные вопросы