OK, cuối cùng tôi đã có thời gian để giải quyết vấn đề này. Hy vọng rằng ai đó sẽ tìm thấy câu trả lời này hữu ích. Đây là cách tôi cuối cùng đã giải quyết được vấn đề:
role :db, "db1" ,{ :credentials => 'db1-credentials'}
role :db, "db2" ,{ :credentials => 'db2-credentials'}
role :db, "db3"
namespace :stackoverflow do
# Don't run this task on host that don't have credentials defined
task :default, {:role => :db, :except => {:credentials => nil } } do
servers = find_servers_for_task(current_task)
servers.each do |server|
credentials = server.options[:credentials]
puts credentials # actual task
end
end
end
Tôi thấy rằng tôi có thể đã nêu câu hỏi theo cách khó hiểu - đó là vì tôi chưa hiểu, nhiệm vụ đó được chạy đồng thời.
Điều này thực tế sẽ thực hiện tác vụ (ở đây puts credentials
) một lần cho mỗi máy chủ, đó là những gì tôi đã cố gắng thực hiện.
Output:
$ cap stackoverflow
* executing `stackoverflow'
db1-credentials
db2-credentials
Đó là một ý tưởng tốt để thêm một bộ lọc để một công việc vì vậy nó sẽ không chạy nếu máy chủ không có thông tin. Điều đó đang được nói, khiến mọi người trong nhóm duy trì thông tin đăng nhập hiện tại (và vì lý do bảo mật không được phiên bản) cho tất cả các máy chủ hóa ra là quá phức tạp (do đó đánh bại ý tưởng sử dụng Capistrano). Bây giờ thay vì giữ cấu hình bên ngoài trên các đĩa của người dùng, tôi sẽ giữ dữ liệu trên các máy chủ bị ảnh hưởng (chủ yếu ở dạng các kịch bản chạy được với tất cả các thông tin ẩn bên trong).Như thế này:
task :dump {:role => :db} do
run "/root/dump_db.sh | gzip > /tmp/dump.sql.gz"
download "/tmp/dump.sql.gz", "somewhere"
end
Tôi đã tìm kiếm cách thực hiện 'find_servers_for_task (current_task)' trong nhiều giờ. Cảm ơn nhiều. – aceofspades