Capistrano를 사용하여 단일 특정 서버에 배포하는 방법
-
07-07-2019 - |
문제
여러 역할의 여러 서버가 있는 프로덕션 시스템이 있습니다.프로덕션의 모든 서버에 다시 배포할 필요 없이 해당 특정 서버에 배포하여 새 앱 서버를 테스트하고 싶습니다.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