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


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

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

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

спасибо!

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

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

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

5 55

5 ответов:

Я закончил тем, что разместил вопрос в списке пользователей 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, он будет запускать команду echo как на A, так и на B.

если у вас cap HOSTS=C foo, он будет запускать команду echo на C, вне зависимости от роли параметр к задаче.

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

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

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

подводя итог: HOSTS полностью переопределяет объявление 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

вы должны быть в состоянии сделать что-то подобное в развертывании.РБ:

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