Задача Capistrano 3 sudo
Я хочу написать рецепт с Capistrano 3, выполняющим задачу на удаленном сервере с помощью sudo.
С Capistrano 2 это можно сделать, например:
default_run_options[:pty] = true
task :hello do
run "#{sudo} cp ~/something /something"
end
С Capistrano 3 я нашел:
set :pty, true
Но я не смог выполнить задачу, выполняемую с помощью sudo.
Как запустить задачу с помощью sudo?
Ответы
Ответ 1
В руководстве Capistrano 3 рекомендуется использовать sudo без пароля. Это позволяет вашему менее привилегированному пользователю выполнять команду sudo без необходимости вводить пароль через PTY.
Вы можете использовать задачу, которую написал Kentaro выше, и добавить в файл /etc/sudoers что-то вроде следующего:
deploy ALL=NOPASSWD:/bin/cp ~/something /something
http://www.capistranorb.com/documentation/getting-started/authentication-and-authorisation/#toc_8
Ответ 2
Я обычно пишу так:
task :hello do
on roles(:all) do |host|
execute :sudo, :cp, '~/something', '/something'
end
end
Edit
Capistrano 3 не поддерживает sudo с паролем.
Однако я создал небольшой gem, который позволяет использовать sudo с паролем в задаче Capistrano 3.
Добавьте sshkit-sudo к вашему приложению Gemfile:
# Gemfile
gem 'sshkit-sudo'
И потребуем 'sshkit/sudo' в вас Capfile:
# Capfile
require 'sshkit/sudo'
Теперь вы можете выполнить команду с sudo следующим образом:
task :hello do
on roles(:all) do
sudo :cp, '~/something', '/something'
end
end
Ответ 3
Чтобы решить эту проблему, мне нужно добавить 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
Эта задача в основном запускает оболочку script, называемую restart.sh
, которая имеет команду в sudo service nginx restart
.
Ответ 4
вы хотите, чтобы "как пользователь закончил", например
as "root" do
execute :something
end
Ответ 5
Если вам действительно нужно использовать sudo
, вы всегда можете сопоставить команду как SSHKit.config.command_map[:rm] = 'sudo rm'
, которая сделает execute :rm
в правильную команду rm
, вызванную с помощью sudo
. Если ваш пользователь развертывания находится в состоянии sudoers, все будет работать так, как ожидалось.