Pergunta

Eu tenho um sistema de produção que tem vários servidores em vários papéis. Eu gostaria de testar um novo servidor de aplicativo por meio da implantação para esse servidor específico, sem ter que redistribuir a cada servidor em produção. Existe uma maneira de pedir Capistrano para implantar em um servidor específico? Idealmente, eu gostaria de ser capaz de executar algo parecido

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

Se eu só queria implantar a app2.example.com.

Obrigado!

[update] Eu tentei a solução sugerida pela Wulong executando:

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

mas Capistrano parecia estar tentando executar tarefas para outras funções no servidor, além de tarefas de aplicativos. Talvez eu preciso atualizar minha versão da tampa (eu estou correndo v2.2.0)?

Foi útil?

Solução

Eu acabei de postar uma pergunta na lista de usuários Capistrano aqui , e obteve a seguinte resposta do Jamis (editado um pouco por mim aqui para maior clareza):


Tente a variável de ambiente HOSTS:

cap HOSTS=app2.example.com production deploy

Note que fazendo isso irá tratar app2 como sendo em cada papel, e não apenas qualquer que seja o papel (s) ele passa a ser declarado em.

Se o que você quer é fazer um deploy regular, mas apenas agir em app2, e apenas como app2 é declarado em seu arquivo de receita, você pode usar o HOSTFILTER variável em vez disso:

cap HOSTFILTER=app2.example.com production deploy 

[...]

Veja este exemplo concreto. Suponha que o seu roteiro define três servidores, A, B, e C. E define uma tarefa, "foo", que (por padrão) quer correr em A e B, mas não C. Como esta:

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

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

Agora, se você fizer cap foo, ele será executado o comando echo em ambos A e B.

Se você fizer cap HOSTS=C foo, ele será executado o comando echo em C, independentemente das:. papéis de parâmetro para a tarefa

Se você fizer cap HOSTFILTER=C foo, não vai executar o comando echo no tudo, porque o cruzamento de (A B) e (C) é um conjunto vazio. (Lá há anfitriões na lista de host do foo que correspondem C).

Se você fizer cap HOSTFILTER=A foo, ele será executado o comando echo apenas em Um, porque (A B) cruzado com (A) é (A).

Por fim, se você fizer cap HOSTFILTER=A,B,C foo, ele será executado o eco comando em A e B (mas não C), porque (A B) cruzado com (A B C) é (A B).

Para resumir: HOSTS substitui completamente a hosts ou papéis declaração da tarefa, e as forças de tudo para correr contra o host especificado (s). O HOSTFILTER, por outro lado, simplesmente filtra os anfitriões existentes contra a lista dada, escolhendo apenas os servidores que já estão a lista de servidores tarefas.

Outras dicas

O seguinte deve trabalhar fora da caixa:

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

Se você deseja implantar a> 1 servidor com o mesmo papel:

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

Eu tenho problema semelhante e tentou o seguinte. Ele funciona:

cap production ROLES=web HOSTS=machine1 stats

Você deve ser capaz de fazer algo assim em deploy.rb:

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

Você também pode especificar os hosts de nível de tarefa parâmetro da seguinte maneira:

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

end 
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top