Подтвердить что ты не робот

Задача 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?

4b9b3361

Ответ 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, все будет работать так, как ожидалось.