2016-08-30 1 views
2

Я развертывал приложение Symfony2 на одном сервере всего несколько месяцев, и это было прекрасно, но поскольку я добавил больше серверов, я застреваю, когда хочу одновременно обновлять все мои серверы, но запускать несколько команд только один раз (например, миграцию базы данных и создание активов и нажатие на S3).Capistrano развертывается на всех серверах, но запускает некоторые задачи только на одном

Вот мои серверы:

server '192.168.0.100', user: 'ubuntu', roles: %w{app db web toto} 
server '192.168.0.101', user: 'ubuntu', roles: %w{app db web} 

А вот одна задача выполняется у меня в deploy.rb:

namespace :specific do 
    task :command do 
     on roles(:all) do |host| 
      if host.roles.include?(:toto) 
       invoke 'symfony:console', 'one:specific:command' 
      end 
     end 
    end 
end 

С cap --roles=toto staging deploy но только один из двух моих серверов были обновлены.

Я попробовал метод фильтра так:

namespace :assets do 
    task :increment do 
     set :filter, :roles => %w{toto} 
     invoke 'symfony:console', 'one:specific:command' 
    end 
end 

и другие методы, копирование вставки из переполнения стека ответов, но не нашел ни одного совпадения ответа

+0

Возможный дубликат [Capistrano 3: Запуск задачи только на одном сервере из пула серверов, назначенных роли] (http://stackoverflow.com/questions/23095865/capistrano-3-run-task-only-on -a-single-server-from-a-pool-of-servers-assign-a) – LaurentG

ответ

2

я бы колебался больше, так как этот ответ не работает. И я до сих пор не удалось найти решение, в любой другой должности, так вопрос, или Capistrano документации ...


Я колебался опубликовать этот вопрос, и, наконец, нашел мой ответ. Но, как мне потребовалось долго искать, вот ответ:

Просто добавьте primary: true на один сайт:

server '192.168.0.100', roles: %w{app db web}, primary: true 
server '192.168.0.101', roles: %w{app db web} 

И в deploy.rb:

namespace :specific do 
    task :command do 
     on primary(:web) do 
      invoke 'symfony:console', 'one:specific:command' 
     end 
    end 
end 

Мой вывод команды по-прежнему с указанием на двух серверах, но, надеюсь, только одна сделала конкретную команду:

03 php app/console one:specific:command 
✔ 03 [email protected] 1.153s 
✔ 03 [email protected] 6.551s 

Наконец-то!

+1

Я считаю, что по умолчанию первая запись определяется как основной сервер. Поэтому, если вы хотите, чтобы только один сервер в определенной роли выполнял задачу, но вам все равно, какой она есть, вы можете опустить первичный: истинный аргумент. –

+0

@will_in_wi Hum ... Мне тоже придется попробовать. И возможно это: http://capistranorb.com/documentation/advanced-features/property-filtering/ – LaurentG

Смежные вопросы