Подтвердить что ты не робот

Как выполнить развертывание на одном конкретном сервере с помощью 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, похоже, пытался выполнять задачи для других ролей на этом сервере в дополнение к задачам приложения. Может быть, мне нужно обновить мою версию кепки (я запускаю v2.2.0)?

4b9b3361

Ответ 1

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


Попробуйте переменную среды HOSTS:

cap HOSTS=app2.example.com production deploy

Обратите внимание, что это будет относиться к app2 как к каждой роли, а не только к какая бы роль (и) она не была объявлена.

Если вы хотите сделать регулярное развертывание, но только действовать на app2, и только когда app2 объявлен в вашем файле рецепта, вы можете использовать HOSTFILTER вместо этого:

cap HOSTFILTER=app2.example.com production deploy 

[...]

Рассмотрим этот конкретный пример. Предположим, script определяет три сервера, 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.

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

Если вы выполняете 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, с другой стороны, просто фильтрует существующие хосты против данного списка, выбирая только те серверы, которые уже находятся в список серверов задач.

Ответ 2

Следующее должно работать из коробки:

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

Если вы хотите развернуть нa > 1 сервер с той же ролью:

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

Ответ 3

Вы должны иметь возможность сделать что-то подобное в deploy.rb:

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

Ответ 4

У меня есть аналогичная проблема и пробовал следующее. Он работает:

cap production ROLES=web HOSTS=machine1 stats

Ответ 5

Вы также можете указать параметр hosts на уровне задач следующим образом:

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

end