Развертывание на одном конкретном сервере с помощью 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 ответов:
Я закончил тем, что разместил вопрос в списке пользователей 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