Как развернуть на одном конкретном сервере с помощью Capistrano - PullRequest
56 голосов
/ 10 января 2009

У меня есть производственная система, в которой есть несколько серверов на несколько ролей. Я хотел бы протестировать новый сервер приложений путем развертывания на этом конкретном сервере, без необходимости повторного развертывания на каждом сервере в рабочей среде. Есть ли способ попросить 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)?

Ответы [ 5 ]

124 голосов
/ 22 января 2009

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

3 голосов
/ 11 января 2009

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

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

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

cap HOSTS=app2.example.com,app3.example.com,app4.example.com ROLE=app deploy
2 голосов
/ 24 января 2011

У меня похожая проблема, и я попробовал следующее. Работает:

cap production ROLES=web HOSTS=machine1 stats
1 голос
/ 10 января 2009

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

task :production do
  if ENV['SERVER'] && ENV['ROLE']
    role ENV['ROLE'], ENV['SERVER']
  else
    # your full config
  end
end
0 голосов
/ 11 марта 2015

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

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

end 
...