web-dev-qa-db-fra.com

Tâche Capistrano 3 Sudo

Je veux écrire une recette avec Capistrano 3 en exécutant une tâche sur le serveur distant avec Sudo.

Avec Capistrano 2, cela pourrait être fait par exemple:

default_run_options[:pty] = true

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

Avec Capistrano 3 j'ai trouvé:

set :pty, true

Mais je n'ai pas pu exécuter une tâche exécutée avec Sudo.

Comment puis-je exécuter une tâche avec sudo?

29
crimi

Le guide Capistrano 3 recommande l’utilisation de Sudo sans mot de passe. Cela permet à votre utilisateur moins privilégié d'exécuter la commande Sudo sans avoir à saisir un mot de passe via le PTY.

Vous pouvez utiliser la tâche décrite ci-dessus par Kentaro et ajouter à votre fichier/etc/sudoers un des éléments suivants:

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

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

20
Ian

J'écris d'habitude comme ça:

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

Modifier

Capistrano 3 ne prend pas en charge Sudo avec mot de passe.

Cependant, j'ai créé un petit -gem , qui vous permet d'utiliser Sudo avec un mot de passe dans la tâche Capistrano 3.

Ajoutez sshkit-Sudo au fichier Gemfile de votre application:

# Gemfile
gem 'sshkit-Sudo'

Et exigez 'sshkit/Sudo' dans votre Capfile:

# Capfile
require 'sshkit/Sudo'

Maintenant, vous pouvez exécuter une commande avec Sudo comme suit:

task :hello do
  on roles(:all) do
    Sudo :cp, '~/something', '/something'
  end
end
15
Kentaro Imai

Pour résoudre ce problème, je devais ajouter set :pty, true à mon fichier deploy.rb.

Je peux maintenant exécuter ce qui suit:

# 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

Cette tâche exécute essentiellement un script Shell appelé restart.sh qui contient une commande dans Sudo service nginx restart.

13
ajtrichards

vous voulez "comme utilisateur fin", comme

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

Si vous avez vraiment besoin d'utiliser Sudo, vous pouvez toujours mapper la commande telle que SSHKit.config.command_map[:rm] = 'Sudo rm' qui transformera execute :rm en commande rm appropriée appelée avec Sudo. Si votre utilisateur de déploiement est dans le sudoers, les choses fonctionneront comme prévu.

0
craigmcnamara