Je cherche un moyen d'appeler une tâche Capistrano unique pour effectuer différents types de tâches. Est-ce que Capistrano est capable de faire cela, ou est-ce que j'ai écrit une tâche spécifique pour chaque rôle?Création d'une tâche Capistrano exécutant différentes tâches en fonction du rôle
Répondre
La méthode standard pour faire en Capistrano:
task :whatever, :roles => [:x, :y, :z] do
x_tasks
y_tasks
z_tasks
end
task :x_tasks, :roles => :x do
#...
end
task :y_tasks, :roles => :y do
#...
end
task :z_tasks, :roles => :z do
#...
end
Alors oui, vous avez besoin d'écrire des tâches distinctes, mais vous pouvez les appeler à partir d'une tâche parent et ils filtrera de manière appropriée.
En fait non:
% cat capfile
server 'localhost', :role2
task :task1, :roles=>:role1 do
puts 'task1'
end
task :task2 do
task1
end
% cap task2
* executing `task2'
* executing `task1'
task1
Le: rôles PARAM est passé plus à exécuter la commande, etc, mais ne semble pas affecter si la tâche est en fait tiré.
Désolé, nous n'avons pas trouvé le moyen de mettre un commentaire sur le commentaire, donc je l'ai écrit ici.
Il y a un moyen, un peu de. Vérifiez: http://weblog.rubyonrails.org/2006/8/30/capistrano-1-1-9-beta/ et vous verrez que vous pouvez remplacer les rôles par défaut à l'aide de la variable d'environnement ROLES.
J'ai une tâche définie comme:
desc "A simple test to show we can ssh into all servers"
task :echo_hello, :roles => :test do
run "echo 'hello, world!'"
end
Le rôle :test
est affecté à un serveur.
Sur la ligne de commande, je peux courir:
[[email protected] bin]$ cap echo_hello ROLES=lots_of_servers
et la tâche maintenant exécuter sur le rôle de lots_of_servers.
Je n'ai pas vérifié que cela fonctionne dans un script ruby en mettant à jour le hachage ENV
, mais c'est un bon début.
Vous pouvez également faire
task :foo do
run "command", :roles => :some_role
upload "source", "destination", :roles => :another_role
end
Utilisez l'espace de nommage: https://github.com/leehambley/capistrano-handbook/blob/master/index.markdown#namespacing-tasks
namespace :backup do
task :default do
web
db
end
task :web, :roles => :web do
puts "Backing Up Web Server"
end
task :db, :roles => :db do
puts "Backing Up DB Server"
end
end
ces tâches apparaissent dans un bouchon -T comme
backup:default
backup:web
backup:db
Seulement pour l'enregistrement, cette pourrait être une solution utilisant Capistrano 3:
desc "Do something specific for 3 different servers with 3 different roles"
task :do_something do
on roles(:api_role), in: :sequence do
# do something in api server
end
on roles(:app_role), in: :sequence do
# do something in application server
end
on roles(:another_role), in: :sequence do
# do something in another server
end
end
La définition sever pour effectuer des tâches « de do_something » dans un serveur d'application serait quelque chose comme:
server 'application.your.domain', user: 'deploy', roles: %w{app_role}
Ensuite, vous pouvez appeler la tâche (il y a plusieurs façons de le faire) et la tâche exécuter des instructions spécifiques en fonction de "app_role".
Cela n'a pas fonctionné pour moi, les trois tâches sont exécutées. – aceofspades
Ne fonctionnait pas pour moi non plus. Toutes les tâches sont exécutées. –
Ne fonctionne pas ici non plus – Fluffy