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?
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
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
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
.
vous voulez "comme utilisateur fin", comme
as "root" do
execute :something
end
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.