2009-04-15 14 views
17

पर आधारित विभिन्न कार्यों को निष्पादित करता है, मैं विभिन्न भूमिकाओं को अलग-अलग भूमिकाओं को करने के लिए एक एकल कैपिस्ट्रानो कार्य को कॉल करने का एक तरीका ढूंढ रहा हूं। क्या कैपिस्ट्रानो ऐसा करने में सक्षम है, या क्या मैंने प्रत्येक भूमिका के लिए एक विशिष्ट कार्य लिखा है?एक कैपिस्ट्रानो कार्य बनाना जो भूमिका

उत्तर

18

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 

तो हाँ, आप अलग कार्यों लिखने की जरूरत है, लेकिन आप उन्हें एक माता पिता के काम से कॉल कर सकते हैं और वे उचित रूप से फ़िल्टर करेगा।

+3

यह मेरे लिए काम नहीं करता है, सभी तीन कार्यों को निष्पादित किया जाता है। – aceofspades

+3

मेरे लिए भी काम नहीं किया। सभी कार्यों को निष्पादित किया जाता है। –

+2

यहां या तो काम नहीं करता है – Fluffy

5

वास्तव में कोई:

% 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 

: भूमिकाओं परम आदेश आदि को चलाने के लिए आगे पारित कर दिया है, लेकिन प्रभावित करने के लिए है कि क्या वास्तव में काम निकाल दिया जाता है नहीं लगता है।

क्षमा करें, टिप्पणी पर टिप्पणी करने का तरीका नहीं मिला है इसलिए मैंने इसे यहां लिखा है।

1

एक तरह का तरीका है। जांचें: http://weblog.rubyonrails.org/2006/8/30/capistrano-1-1-9-beta/ और आप देखेंगे कि आप ROLES पर्यावरण चर का उपयोग कर डिफ़ॉल्ट भूमिकाओं को ओवरराइड कर सकते हैं।

desc "A simple test to show we can ssh into all servers" 
task :echo_hello, :roles => :test do 
    run "echo 'hello, world!'" 
end 

:test भूमिका एक सर्वर के लिए असाइन किया गया है:

मैं के रूप में एक कार्य परिभाषित किया गया है।

कमांड लाइन पर, मैं चला सकते हैं:

[[email protected] bin]$ cap echo_hello ROLES=lots_of_servers 

और कार्य अब lots_of_servers भूमिका पर चलेंगे।

मैंने सत्यापित नहीं किया है कि यह ENV हैश अपडेट करके रूबी स्क्रिप्ट के अंदर काम करता है, लेकिन यह एक अच्छी शुरुआत है। 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 

इन कार्यों को केवल रिकार्ड के लिए के रूप में

backup:default 
backup:web 
backup:db 
3

तुम भी

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

उपयोग नेमस्पेसिंग कर सकते हैं 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 

Sever परिभाषा प्रदर्शन करने के लिए एक आवेदन सर्वर में "do_something" काम होगा कुछ की तरह:

server 'application.your.domain', user: 'deploy', roles: %w{app_role} 

तो फिर तुम काम कॉल कर सकते हैं (वहाँ यह करने के लिए कई तरीके हैं) और काम करेंगे "app_role" के अनुसार विशिष्ट निर्देश निष्पादित करें।

1

एक टोपी -टी में दिखाई, इस:

संबंधित मुद्दे