2009-04-15 35 views

Trả lời

18

Cách thông thường để làm điều này trong 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 

Vì vậy, có, bạn không cần phải viết nhiệm vụ riêng biệt, nhưng bạn có thể gọi cho họ từ một nhiệm vụ phụ huynh và họ sẽ lọc một cách thích hợp.

+3

Điều này không hiệu quả đối với tôi, cả ba nhiệm vụ đều được thực thi. – aceofspades

+3

Không làm việc cho tôi. Tất cả các nhiệm vụ được thực hiện. –

+2

Không hoạt động ở đây – Fluffy

5

Trên thực tế không có:

% 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 

Các: vai trò param được truyền hơn nữa để chạy lệnh vv nhưng dường như không ảnh hưởng đến việc nhiệm vụ đang thực sự bị sa thải.

Xin lỗi, không tìm cách đưa nhận xét về nhận xét vì vậy tôi đã viết nó ở đây.

1

Có một cách, loại. Kiểm tra: http://weblog.rubyonrails.org/2006/8/30/capistrano-1-1-9-beta/ và bạn sẽ thấy rằng bạn có thể ghi đè các vai trò mặc định bằng biến môi trường ROLES.

Tôi có một công việc định nghĩa là:

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

Vai trò :test được gán cho một máy chủ.

Trên dòng lệnh, tôi có thể chạy:

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

Và nhiệm vụ bây giờ sẽ chạy về vai trò lots_of_servers.

Tôi chưa xác minh rằng thao tác này hoạt động bên trong tập lệnh ruby ​​bằng cách cập nhật mã băm ENV, nhưng đây là một khởi đầu tốt.

3

Bạn cũng có thể làm

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

Chỉ dành cho các kỷ lục, điều này có thể là một giải pháp sử dụng 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 

Định nghĩa sever để thực hiện "do_something" nhiệm vụ trong một máy chủ ứng dụng sẽ là một cái gì đó như:

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

Sau đó, bạn có thể gọi cho công việc (có một số cách để làm điều đó) và nhiệm vụ sẽ thực hiện các hướng dẫn cụ thể theo "app_role".

Các vấn đề liên quan