program tip

Capistrano를 사용하여 단일 특정 서버에 배포하는 방법

radiobox 2020. 12. 29. 06:57
반응형

Capistrano를 사용하여 단일 특정 서버에 배포하는 방법


여러 역할의 여러 서버가있는 프로덕션 시스템이 있습니다. 프로덕션의 모든 서버에 다시 배포 할 필요없이 특정 서버에 배포하여 새 앱 서버를 테스트하고 싶습니다. 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라는 세 개의 서버를 정의한다고 가정합니다. 그리고 기본적으로 A와 B에서 실행되지만 C가 아닌 작업 "foo"를 정의합니다. 다음과 같이 :

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에 대한 : roles 매개 변수에 관계없이 C에서 echo 명령을 실행합니다.

을 수행하면 cap HOSTFILTER=C foo(AB)와 (C)의 교차점이 빈 집합이기 때문에 echo 명령을 전혀 실행하지 않습니다. (foo의 호스트 목록에 C와 일치하는 호스트가 없습니다.)

를 수행하면 cap HOSTFILTER=A foo(A)와 교차하는 (AB)가 (A)이기 때문에 A에서만 echo 명령을 실행합니다.

마지막으로 cap HOSTFILTER=A,B,C foo를 실행하면 (ABC)와 교차하는 (AB)가 (AB)이기 때문에 A와 B (C는 아님)에 echo 명령을 실행합니다.

요약하면 : HOSTS는 작업의 호스트 또는 역할 선언을 완전히 무시하고 모든 항목이 지정된 호스트에 대해 실행되도록합니다. 반면 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

deploy.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 

참조 URL : https://stackoverflow.com/questions/429816/how-to-deploy-to-a-single-specific-server-using-capistrano

반응형