문제

여러 역할의 여러 서버가 있는 프로덕션 시스템이 있습니다.프로덕션의 모든 서버에 다시 배포할 필요 없이 해당 특정 서버에 배포하여 새 앱 서버를 테스트하고 싶습니다.Capistrano에게 특정 서버에 배포하도록 요청하는 방법이 있나요?이상적으로는 다음과 같은 것을 실행할 수 있기를 바랍니다.

cap SERVER=app2.example.com ROLE=app production deploy

app2.example.com에 배포하고 싶은 경우.

감사해요!

업데이트] Wulong이 제안한 솔루션을 실행하여 사용했습니다.

cap HOSTS=app2.server.hostname ROLE=app qa deploy 

하지만 capistrano는 앱 작업 ​​외에도 해당 서버에서 다른 역할에 대한 작업을 실행하려고 하는 것 같았습니다.내 cap 버전을 업데이트해야 할 수도 있습니다(v2.2.0을 실행 중입니다).

도움이 되었습니까?

해결책

결국 capistrano 사용자 목록에 질문을 게시하게 되었습니다. 여기, Jamis로부터 다음과 같은 응답을 받았습니다(명확성을 위해 여기에서 제가 약간 편집했습니다).


HOSTS 환경 변수를 사용해 보세요.

cap HOSTS=app2.example.com production deploy

이렇게 하면 app2가 모든 역할뿐만 아니라 모든 역할에 있는 것으로 처리됩니다. 어떤 역할에서 선언되든 상관 없습니다.

원하는 것이 정기적 인 배포를 수행하는 것이지만 app2에서만 작동하는 경우 app2가 레시피 파일에 선언된 경우에만 HOSTFILTER를 사용할 수 있습니다 변수를 대신 사용하십시오.

cap HOSTFILTER=app2.example.com production deploy 

[...]

이 구체적인 예를 고려하십시오.를 가정해 보겠습니다. 스크립트는 A, B 및 C의 세 서버를 정의합니다.그리고 그것은 "foo"라는 작업을 정의합니다. (기본적으로) A와 B에서 실행하려지만 C에서는 실행하지 않습니다.이와 같이:

role :app, "A", "B"
role :web, "C"

task :foo, :roles => :app do
  run "echo hello"
end

이제 그렇게 하면 cap foo, A와 B 모두에서 echo 명령을 실행합니다.

만약 당신이 cap HOSTS=C foo, C에서 echo 명령을 실행합니다. 작업에 대한 :roles 매개 변수에 관계없이.

만약 당신이 cap HOSTFILTER=C foo, 에서 echo 명령을 실행하지 않습니다. (A, B)와 (C)의 교집합이 빈 집합이기 때문입니다.(거기 foo의 호스트 목록에 C와 일치하는 호스트가 없습니다.)

만약 당신이 cap HOSTFILTER=A foo, echo 명령만 실행합니다. A, (A)와 교차하는 (A, B)는 (A)이기 때문입니다.

마지막으로 그렇게 하면 cap HOSTFILTER=A,B,C foo, 에코를 실행합니다. (A B)가 (A B C)와 교차했기 때문에 A와 B(C는 아님)에 대한 명령 (A, B)입니다.

요약:HOSTS는 hosts 또는 roles 선언을 완전히 재정의합니다. 모든 것이 지정된 호스트에 대해 실행되도록 강제합니다.반면 HOSTFILTER는 단순히 기존 호스트를 필터링합니다 주어진 목록에 대해 이미 있는 서버만 선택합니다. 작업 서버 목록.

다른 팁

다음은 기본적으로 작동합니다.

cap HOSTS=app2.example.com ROLE=app deploy

동일한 역할을 가진 1개 이상의 서버에 배포하려는 경우:

cap HOSTS=app2.example.com,app3.example.com,app4.example.com ROLE=app deploy

비슷한 문제가 있으며 다음을 시도했습니다.효과가있다:

cap production ROLES=web HOSTS=machine1 stats

배포.rb에서 다음과 같은 작업을 수행할 수 있어야 합니다.

task :production do
  if ENV['SERVER'] && ENV['ROLE']
    role ENV['ROLE'], ENV['SERVER']
  else
    # your full config
  end
end

다음과 같이 작업 수준 호스트 매개변수를 지정할 수도 있습니다.

task :ship_artifacts, :hosts => ENV['DEST_HOST']  do

end 
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top