Конфигурация
В Laravel есть простой способ подключения по SSH к удаленным серверам и запуска команд, позволяющий легко создавать Artisan-задачи, работающие на удаленном сервере. Фасад SSH обеспечивает точку доступа для соединения с вашими удаленными серверами и запуска команд.
Файл конфигурации расположен в папке app/config/remote.php. Он содержит все параметры,необходимые для настройки ваших удалённых подключений. Массив connections содержит список ваших серверов c их именами в качестве ключей. Просто добавьте учётные данные в массив connections и вы будете готовы к запуску удалённых задач. Обратите внимание, что SSH поддерживает аутентификацию как с помощью пароля, так и по SSH-ключу.
Хотите легко и просто запускать множество задач на вашем удалённом сервере? Попробуйте инструмент запуска задач Envoy!
Основы работы
Запуск команд на сервере по умолчанию
Для запуска команд через удалённое подключению по умолчанию (default) используйте метод PHPSSH::run()
:
SSH::run(array(
'cd /var/www',
'git pull origin master',
));
Запуск команд через указанное подключение
Также вы можете запускать команды через указанное подключение, используя метод PHPinto()
:
SSH::into('staging')->run(array(
'cd /var/www',
'git pull origin master',
));
Отлавливание результата запуска команд
Вы можете отловить «живой» результат выполнения своих удалённых команд, передав замыкание в метод PHPrun()
:
SSH::run($commands, function($line)
{
echo $line.PHP_EOL;
});
Задачи
Если вам нужно зарегистрировать группу команд, которые должны всегда запускаться вместе, вы можете использовать метод PHPdefine()
, чтобы зарегистрировать PHPtask
:
SSH::into('staging')->define('deploy', array(
'cd /var/www',
'git pull origin master',
'php artisan migrate',
));
После того, как задача была зарегистрирована, вы можете использовать метод PHPtask()
для её запуска:
SSH::into('staging')->task('deploy', function($line)
{
echo $line.PHP_EOL;
});
SFTP-загрузка
Класс SSH включает в себя простой способ скачивания файлов, используя методы PHPget()
и PHPgetString()
:
SSH::into('staging')->get($remotePath, $localPath);
$contents = SSH::into('staging')->getString($remotePath);
SFTP-выгрузка
Также класс SSH включает простой способ выгрузки файлов и даже строк на сервер, используя методы PHPput()
и PHPputString()
:
SSH::into('staging')->put($localFile, $remotePath);
SSH::into('staging')->putString($remotePath, 'Foo');
Отслеживание удалённых логов
В Laravel есть полезная команда для отслеживания файлов laravel.log на любом из ваших удаленных подключений. Просто используйте Artisan-команду shtail
и укажите имя удалённого подключения, которое вы хотите отследить:
shphp artisan tail staging php artisan tail staging --path=/path/to/log.file
Инструмент запуска задач Envoy
Laravel Envoy обеспечивает чистый и минимальный синтаксис для регистрации общих задач, запускаемых на удалённых серверах. Используя синтаксис в стиле Blade, вы легко можете настроить задачи для развёртывания, Artisan-команды и прочее.
Envoy требует PHP 5.4 или выше и работает только на ОС Mac/Linux.
Установка
Сначала установите Envoy с помощью команды Composer shglobal
:
shcomposer global require "laravel/envoy=~1.0"
Не забудьте поместить каталог ~/.composer/vendor/bin в ваш ПУТЬ, чтобы исполняемый файл envoy мог быть найден при запуске команды shenvoy
в терминале.
Затем создайте файл Envoy.blade.php в корне вашего проекта. Вот пример для начала:
@servers(['web' => '192.168.1.1']) @task('foo', ['on' => 'web']) ls -la @endtask
Как видите, массив @servers определён в начале файла. Вы можете ссылаться на эти сервера в параметре on при объявлении задач. Поместите в ваши объявления @task тот Bash-код, который будет запускаться на сервере при исполнении задачи.
Для простого создания стаб-файла Envoy используйте команду shinit
:
shenvoy init user@192.168.1.1
Запуск задач
Для запуска задачи используйте команду shrun
вашего Envoy:
shenvoy run foo
При необходимости вы можете передать переменные в файл Envoy с помощью ключей командной строки:
shenvoy run deploy --branch=master
Вы можете использовать параметры с синтаксисом Blade, к которому привыкли:
@servers(['web' => '192.168.1.1']) @task('deploy', ['on' => 'web']) cd site git pull origin {{ $branch }} php artisan migrate @endtask
Для объявления переменных и выполнения общих PHP-задач в файле Envoy вы можете использовать директиву @setup:
@setup $now = new DateTime(); $environment = isset($env) ? $env : "testing"; @endsetup
А для подключения любых PHP-файлов используйте директиву @include:
@include('vendor/autoload.php');
Несколько серверов
Вы легко можете запускать задачи на нескольких серверах. Просто перечислите эти сервера в объявлении задач:
@servers(['web-1' => '192.168.1.1', 'web-2' => '192.168.1.2']) @task('deploy', ['on' => ['web-1', 'web-2']]) cd site git pull origin {{ $branch }} php artisan migrate @endtask
По умолчанию задачи будут выполняться на каждом сервере поочерёдно. То есть задача будет завершаться на первом сервере перед переходом к выполнению на следующем.
Параллельное выполнение
Если вы хотите запускать задачи на нескольких серверах параллельно, просто добавьте парметр parallel в объявление задач:
@servers(['web-1' => '192.168.1.1', 'web-2' => '192.168.1.2']) @task('deploy', ['on' => ['web-1', 'web-2'], 'parallel' => true]) cd site git pull origin {{ $branch }} php artisan migrate @endtask
Макрос задач
Макрос позволяет вам определить набор задач, которые будут запускаться последовательно с помощью одной команды. Например:
@servers(['web' => '192.168.1.1']) @macro('deploy') foo bar @endmacro @task('foo') echo "HELLO" @endtask @task('bar') echo "WORLD" @endtask
Теперь макрос deploy может быть запущен одной простой командой:
shenvoy run deploy
Оповещения
Вы можете посылать оповещение в чат HipChat своей команды после запуска задачи с помощью простой директивы @hipchat:
@servers(['web' => '192.168.1.1']) @task('foo', ['on' => 'web']) ls -la @endtask @after @hipchat('token', 'room', 'Envoy') @endafter
Вы также можете задать своё собственное сообщение в чат HipChat, в котором можете использовать любые переменные, объявленные в @setup или подключенные с помощью @include:
@after @hipchat('token', 'room', 'Envoy', "$task ran on [$environment]") @endafter
Это удивительно простой способ держать вашу команду в курсе запущенных на сервере задач.
Следующий синтаксис используется для отправки оповещений в Slack:
@after @slack('team', 'token', 'channel') @endafter
Обновление Envoy
Для обновления Envoy просто запустите команду shself-update
:
shenvoy self-update
Если ваш Envoy установлен в /usr/local/bin, вам может потребоваться shsudo
: