Как выполнить развертывание на одном конкретном сервере с помощью Capistrano

StackOverflow https://stackoverflow.com/questions/429816

Вопрос

У меня есть производственная система, в которой есть несколько серверов, выполняющих несколько ролей.Я хотел бы протестировать новый сервер приложений, развернув его на этом конкретном сервере, без необходимости повторного развертывания на каждом рабочем сервере.Есть ли способ попросить Capistrano выполнить развертывание на конкретном сервере?В идеале я хотел бы иметь возможность запустить что-то вроде

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

если бы я просто хотел выполнить развертывание на app2.example.com.

Спасибо!

[обновить] Я попробовал решение, предложенное wulong, выполнив:

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

но капистрано, похоже, пытался выполнять задачи для других ролей на этом сервере в дополнение к задачам приложения.Может надо обновить версию шапки (у меня v2.2.0)?

Это было полезно?

Решение

В итоге я разместил вопрос в списке пользователей capistrano. здесь, и получил следующий ответ от Джеймиса (немного отредактированный мной для ясности):


Попробуйте переменную среды 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.Так:

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

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

Теперь, если вы это сделаете cap foo, он запустит команду echo как для A, так и для B.

Если ты это сделаешь cap HOSTS=C foo, он выполнит команду echo на C, независимо от параметра:roles к задаче.

Если ты это сделаешь cap HOSTFILTER=C foo, он не будет запускать команду echo все, потому что пересечение (A B) и (C) является пустым множеством.(Там нет хостов в списке хостов foo, соответствующих C.)

Если ты это сделаешь cap HOSTFILTER=A foo, он будет запускать команду echo только на A, потому что (A B) пересекается с (A) является (A).

Наконец, если вы это сделаете cap HOSTFILTER=A,B,C foo, он запустит эхо команда на A и B (но не C), потому что (A B) пересекается с (A B C) является (A B).

Обобщить: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 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top