web-dev-qa-db-ja.com

Capistrano 3須藤タスク

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でタスクを実行するにはどうすればよいですか?

30
crimi

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

20
Ian

私は通常このように書きます:

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
15
Kentaro Imai

この問題を解決するには、set :pty, truedeploy.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というシェルスクリプトを実行します。

14
ajtrichards

「ユーザーが終了するとき」に、

as "root" do
  execute :something
end
3
Joe McDonagh

本当にSudoを使用する必要がある場合は、SSHKit.config.command_map[:rm] = 'Sudo rm'のようなコマンドをいつでもマップして、execute :rmrmで呼び出される適切なSudoコマンドにできます。展開ユーザーがsudoersにいる場合、期待どおりに動作します。

0
craigmcnamara