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でタスクを実行するにはどうすればよいですか?
Capistrano 3ガイドでは、パスワードなしのSudoの使用を推奨しています。これにより、PTYを介してパスワードを入力することなく、特権の低いユーザーがSudoコマンドを実行できます。
上記のKentaroが作成したタスクを使用して、次のようなものを/ etc/sudoersファイルに追加できます。
deploy ALL=NOPASSWD:/bin/cp ~/something /something
http://www.capistranorb.com/documentation/getting-started/authentication-and-authorisation/#toc_8
私は通常このように書きます:
task :hello do
on roles(:all) do |Host|
execute :Sudo, :cp, '~/something', '/something'
end
end
編集
Capistrano 3は、パスワード付きのSudoをサポートしていません。
ただし、小さな gem を作成したため、Capistrano 3タスクでパスワード付きのSudoを使用できます。
sshkit-Sudo をアプリケーションのGemfileに追加します。
# Gemfile
gem 'sshkit-Sudo'
Capfileに 'sshkit/Sudo'が必要です:
# Capfile
require 'sshkit/Sudo'
これで、次のようにSudoを使用してコマンドを実行できます。
task :hello do
on roles(:all) do
Sudo :cp, '~/something', '/something'
end
end
この問題を解決するには、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
というシェルスクリプトを実行します。
「ユーザーが終了するとき」に、
as "root" do
execute :something
end
本当にSudo
を使用する必要がある場合は、SSHKit.config.command_map[:rm] = 'Sudo rm'
のようなコマンドをいつでもマップして、execute :rm
をrm
で呼び出される適切なSudo
コマンドにできます。展開ユーザーがsudoersにいる場合、期待どおりに動作します。