2011-09-26 2 views
9

다른 자격 증명을 가진 두 대의 서로 다른 서버에서 동일한 작업을 수행하도록 Capistrano를 구성하려고합니다. 나는 비슷한 것을하고 싶다 :Capistrano에서 서버 특정 옵션에 어떻게 액세스합니까?

namespace :deploy do 
    role :db, "192.168.1.1", :credentials => "db1.yml" 
    role :db, "192.168.1.1", :credentials => "db2.yml" 

    task :mytask, :roles => :db do 
    credentials = YAML.load_file(something) 
    ... 

그것은 가능하니? 현재 서버 구성에 액세스하려면 something을 어떻게 대체해야합니까?

답변

12

좋아요, 마침내이 문제를 해결할 시간이있었습니다. 바라건대 다른 누군가가이 대답을 유용하게 사용할 수 있기를 바랍니다. 여기에 내가 결국 문제 해결 방법 : 나는 혼란 방법으로 문제를 언급했다 수 있다는 것을 지금

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 

내가 볼을 - 그게 내가 이해되지 않았기 때문에, 그 작업을 동시에 실행합니다.

사실이 작업은 각 서버에 대해 한 번씩 (여기서는 puts credentials) 작업을 실행합니다.

출력 :

$ cap stackoverflow 
    * executing `stackoverflow' 
db1-credentials 
db2-credentials 

이것은 서버가 자격 증명이없는 경우 실행하지 않도록 작업에 필터를 추가하는 것이 좋습니다.

즉, 팀의 모든 사람들이 모든 서버를 최신 상태로 유지하고 (보안상의 이유로 버전이 지정되지 않은) 모든 서버에 대한 자격 증명이 너무 번거롭다는 것을 알게되었습니다 (따라서 Capistrano 사용에 대한 생각은 무의미 함). 이제는 사용자의 디스크에 외부 구성을 유지하는 대신 영향을받는 서버의 데이터를 보관할 것입니다 (대부분 내부에 숨겨진 모든 자격 증명을 가진 실행 가능한 스크립트의 형태로 진행됩니다).이처럼 : 당신이 실제로 원격 명령에서 서버의 옵션을 사용하려면

task :dump {:role => :db} do 
    run "/root/dump_db.sh | gzip > /tmp/dump.sql.gz" 
    download "/tmp/dump.sql.gz", "somewhere" 
end 
+2

몇 시간 동안 find_servers_for_task (current_task)를하는 방법을 찾고있었습니다. 감사합니다. – aceofspades

1

다중 환경 설정에서 capistrano를 사용할 수 있습니다. 당신이 일이 들어

require 'capistrano/ext/multistage' 

당신은뿐만 아니라 카피 스트라 노-EXT 보석에 필요 -

당신은 deploy.rb 파일에 카피 스트라 노 다단계 보석을 요구할 수 있습니다. 이 후에는 설정이 환경으로 수 -

set :stages, %w(staging production) 
set :default_stage, "staging" 
하여 배포/production.rb 안에 그 후

및/staging.rb 파일을 배포, 당신은 모두 서버에 대한 다른 구성을 사용할 수 있습니다. 모든 일반적인 구성은 deploy.rb 파일 안에 있습니다.

+0

그건 내가 찾고있는 것이 아닙니다. 나는 이미 카피 스트라노 다단계를 사용하고 있습니다. 단일 단계 (예 : 기본 및 보조 데이터베이스)에 대해 정의 된 두 개의 데이터베이스 서버를 갖고 싶습니다. 둘 다 준비 데이터베이스를 덤프해야합니다. – Barnaba

+0

다른 스테이지에서 한 스테이지의 태스크를 호출하는 방법을 볼 수 있습니다. 가능한 실용적인 옵션이라고 생각합니다. (다른 스테이지를 호출하는 '일반'스테이지를 만들 수 있습니다. 각 스테이지에는 각각 하나의 DB 서버와 구성이 포함되어 있습니다.) – Barnaba

3

현재이 문제를 해결하기 위해 노력하고 있습니다. '병렬'기능은 실행중인 명령 줄을 수정할 기회를주지는 않지만 서버 옵션에 따라 대체 명령 줄을 사용할 수있는 기능을 제공합니다. command.rb의 replace-placeholders 함수에서 monkey-patch를 수행하는 것에 대해 생각하고 있습니다. 옵션으로 $ CAPISTRANO : HOST $ 만 갖는 것은 매우 제한적인 것으로 보입니다. 난 그냥 다음을 수행하여 발생할 수 얼마나 많은 혼란 궁금 : 이론적으로

module Capistrano 
    module Command 
     class Tree 
      def replace_placeholders(command, channel) 
       server = channel[:server] 
       command.eval(command) 
      end 
     end 
    end 
end 

지금 당신이 할 수 있습니다 :

role :whatever, "myserver.com", :special_feature => "foo" 

run "do-something #{server.options[:special_feature]}" 

위의 코드의 힘이 몇 가지 작업이 필요합니다.

+0

이 기능에 대한 Capistrano와 관련된 상태/GitHub 문제가 있습니까? 서버 옵션 구성 (예 : "실행중인 작업자 프로세스 수")를 갖고 싶을 때 유용하지 않습니다. – ghayes

1

당신은 여전히 ​​패치없이 find_servers_for_task를 사용할 수 있습니다

server 'server-one', :db, :credentials => 'cred1.yml' 
server 'server-two', :db, :credentials => 'cred2.yml' 

namespace :stackoverflow do 
    task :default, :roles => :db do 
    find_servers_for_task(current_task).each do |server| 
     run "start_your_db -C#{server.options[:credentials]}", :hosts => server.name 
    end 
    end 
end 

그러나 run 명령에 :hosts가 필수적이다, 카피 스트라 노 명령으로 이 예제에서는 각 서버에서 두 개의 명령을 실행하지 않고도 병렬로 실행됩니다.

관련 문제