Capistrano 3 Изменение параметров ssh внутри задачи


Я пытаюсь запустить задачу capistrano V. 3 в том же этапе с различными ssh_options.

Моя постановка.rb говорят:

set :stage, :production

set :user, 'deploy'
set :ssh_options, { user: 'deploy' }

С этой конфигурацией capistrano соединяется с пользователем deploy, что верно для остальных такс. Но мне нужно подключить его для одной конкретной задачи с an_other_user , который хорошо настроен на сервере. Тогда мой рецепт говорит:

...
tasks with original user
...

task :my_task_with_an_other_user do
  set :user, 'an_other_user'
  set :ssh_options, { user: 'an_other_user' }

  on roles(:all) do |host|
    execute :mkdir, '-p', 'mydir'
  end
end

...
other tasks with original user
...

При выполнении:

Производство колпачков пространство имен: my_task_with_an_other_user

Капистрано установить SSH-подключение с оригинальными :пользователь "развернуть" (пользователь объявлен в производстве.рубидий).

Как я могу изменить пользователя и / или ssh_options его внутри задачи?

2 5

2 ответа:

Капистрано 3

Мне было трудно найти решение. Но решение гораздо лучше, чем версия 2. Команда Cap проделала огромную работу. Убедитесь, что вы обновили Capistrano до версии 3.2.x+ вот в чем фокус:

# in config/deploy/production.rb, or config/deploy/staging.rb
# These roles are used for deployment that works with Cap hooks
role :app, %w{deploy@myserver.com}
role :web, %w{deploy@myserver.com}
role :db,  %w{deploy@myserver.com}

# Use additional roles to run side job out side Capistrano hooks
# 'foo' is another ssh user for none-release purpose tasks (mostly root tasks).
# e.g. user 'deploy' does not have root permission, but 'foo' has root permission.
# 'no_release' flag is important to flag this user will skip some standard hooks
# (e.g. scm/git/svn checkout )
role :foo_role, %w{foo@myserver.com}, no_release: true

Убедитесь, что оба пользователя 'deploy' и ' foo ' могут ssh в поле. В задачах используйте ключевое слово on:

task :restart do
  on roles(:foo_role) do
    sudo "service nginx restart"
  end
end

task :other_standard_deployment_tasks do
  on release_roles(:all) do
     # ...
  end
end

Другие готы:

Убедитесь, что некоторые задачи Capistrano пропускают дополнительную роль no release, которую вы добавили. В противном случае это может привести к файлу проблемы с разрешениями во время развертывания. Например, расширение capistrano/bundler необходимо переопределить значение по умолчанию bundler_roles

set :bundler_roles, %w(web app db)  # excludes the no release role.

Капистрано 2

Раньше у меня были пользовательские функции для закрытия и повторного подключения сеансов ssh.

Поместите следующие методы в deploy.rb. Вызов with_user для переключения сеанса ssh. Немного упрощено версия:

def with_user(new_user, &block)
  old_user = user
  set :user, new_user
  close_sessions
  yield
  set :user, old_user
  close_sessions
end

def close_sessions
  sessions.values.each { |session| session.close }
  sessions.clear
end

Использование:

task :update_nginx_config, :roles => :app do
  with_user "root" do
    sudo "nginx -s reload"
  end
end

Ответ @activars не сработал для меня. Потому что когда я определил несколько ролей для одной среды-только одна была развернута : (

Таким образом, мое решение состояло в создании нескольких сред, например: производство.РБ и еще производственный корень.РБ.

Productionroot имеет содержимое с флагом no_release=true-точно так же, как вы указали:

server '146.120.89.81', user: 'root', roles: %w{foo_role}, no_release: true

После этого я создал скрипт sh, который работает

#/usr/bin/env bash
bundle exec cap production deploy
bundle exec cap productionroot deploy