2009-04-15 3 views

Répondre

18

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.

+3

Cela n'a pas fonctionné pour moi, les trois tâches sont exécutées. – aceofspades

+3

Ne fonctionnait pas pour moi non plus. Toutes les tâches sont exécutées. –

+2

Ne fonctionne pas ici non plus – Fluffy

5

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.

1

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.

3

Vous pouvez également faire

task :foo do 
    run "command", :roles => :some_role 
    upload "source", "destination", :roles => :another_role 
end 
1

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".

Questions connexes