2010-08-10 27 views
10

Tôi đang sử dụng Capistrano để xử lý triển khai của mình và tôi có hai vai trò khác nhau trong thiết lập của mình -: web và: đang xử lý. Cả hai đều có nhiệm vụ triển khai thông thường, nhưng nhiệm vụ khởi động lại cần phải khác nhau đối với hai loại máy chủ.Làm thế nào để bạn xác định các nhiệm vụ giống nhau cho các vai trò khác nhau trong Capistrano?

Vì vậy, nỗ lực đầu tiên của tôi là một cái gì đó như thế này:

task :restart, :roles => :web do 
    run "... web related restart stuff ..." 
end 

task :restart, :roles => :processing do 
    run "... processing related restart stuff ..." 
end 

nào không làm việc, bởi vì thứ hai: khởi động lại (đối với: vai trò chế biến) thay người đầu tiên: khởi động lại (đối với: vai trò web), và: web: khởi động lại không bao giờ xảy ra.

Tôi đã xem nhanh để xem liệu tôi có thể viết mã có điều kiện hay không tùy thuộc vào vai trò (hoặc vai trò) mà máy chủ có thể thực hiện khi nhiệm vụ được chạy nhưng không có tài liệu nào ngoài đó. Bất kỳ ý tưởng?

Trả lời

7

Bạn nên sử dụng không gian tên:

namespace :web do 
    desc "Restart web servers" 
    task :restart, :roles => :web do 
    # Restart Magic Here 
    end 
end 

namespace :process do 
    desc "Restart process servers" 
    task :restart, :roles => :process do 
    # Restart magic here 
    end 
end 

# Optionally: 
task :restart do 
    web.restart 
    process.restart 
end 

Đó là những gì bạn đang tìm kiếm tôi nghĩ!

Ngoài ra, để sử dụng các trên dòng lệnh, bạn sẽ sử dụng

$ cap <stage>   # (if using multistage) 
$ cap web:restart  # Restarts web servers 
$ cap process:restart # Restarts process servers 
$ cap restart   # Restarts both process and web servers 

(Nguồn: Tôi là duy trì Capistrano.)

1

Bạn nên sử dụng 'song song' thay vì 'chạy' trong trường hợp này:

task :restart do 
    parallel do |session| 
    session.when "in?(:web)", "...substitute run command contents here...." 
    session.when "in?(:process)", "...substitute run command contents here...." 
    end 
end 

Nếu bạn định sử dụng thứ gì đó ngoại trừ 'chạy' trong các tác vụ khác nhau, bạn nên gắn bó với một trong các câu trả lời khác.

Thông tin thêm về lệnh 'song song' có thể được tìm thấy ở đây: https://github.com/capistrano/capistrano/wiki/2.x-DSL-Action-Invokation-Parallel

0

Nếu bạn cần phải gọi nhiệm vụ mặc định deploy, và làm một số việc khởi động lại tùy chỉnh, vv Tôi đã đưa ra giải pháp này:

# Servers 
server "importerhost.com", :app, :web, :db, :importer, :primary => true 
server "backuphost.com", :app, :web, :db, :backup, :primary => true 
set :deploy_to, "/apps/appname" 

# Ensure deploy before restart 
before 'importer:deploy', 'deploy' 
before 'backup:deploy', 'deploy' 

# Importer 
namespace :importer do 
    desc "Restart importer service" 
    task :deploy, :roles => :importer do 
    sudo "cp #{current_release}/config/importer.conf /etc/init/importer.conf" 
    sudo "service importer restart N=1" 
    sudo "service importer restart N=2" 
    end 
end 

# Backup 
namespace :backup do 
    desc "Restart backup service" 
    task :deploy, :roles => :backup do 
    sudo "cp #{current_release}/config/backup.conf /etc/init/backup.conf" 
    sudo "service backup restart" 
    end 
end 

Và sau đó chỉ cần triển khai với cap ROLES=importer importer:deploy hoặc . Điều này đã cho tôi sự tự do để triển khai cùng một mã nguồn cho các máy chủ khác nhau và thực hiện các tác vụ hoàn toàn khác nhau sau khi triển khai thực tế.

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