Алиасы в drush и синхронизация файлов/базы данных используя sql-sync и rsync

Drush многими воспринимается всего лишь как средство консольного управления для друпал сайтов. Все конечно же знают как с помощью драш установить(скачать, включить, отключить или удалить) друпал проекты (модули и темы), почистить кеш, запустить крон и даже обновить друпал установку.

Еще можно конечно cбрасывать пароль(если его забыл контент менеджер ), добавлять роли пользователям, устанавливать значения переменных (variables) и удалять их.

Но почему то мало кто вспоминает о drush, как о средстве синхронизации (деплоймента) между локальным и рабочим серверами. При этом можно синхронизировать как файлы, так и базу данных.

Прежде чем заняться непосредственно синхронизацией, нужно создать так называемые алиасы как для локального сервера, так и для удаленного соответственно.
Для этого на локальном сервере перейдем в домашнюю папку и создадим файл, в котором опишем алиасы.

В консоли введем следующие команды:


mkdir ~/.drush
nano ~/.drush/aliases.drushrc.php

При этом алиасы можно описывать и в файлах типа *.aliases.drushrc.php или же просто drushrc.php. Это удобно для разделения алиасов для разных проектов.

Также алиасы могут наследоваться. Для этого нужно создать родительский алиас, а затем в дочернем в свойстве 'parent' указать имя родительского алиаса, добавив перед именем символ @.
После создания алиасов и сохранения их можно будет использовать. Кроме синхронизации они используются, чтобы не переходя в корень установки друпала, выполнять команды драш, просто указав соответствующий алиас:


$local_sites = '/home/username/domains/';

$aliases['site.local'] = array(
  'root' => $local_sites . 'site.local',
  'path-aliases' => array(
    '%dump-dir' => $local_sites . 'drush.dbdumps',
    '%files' => $local_sites . 'site.local/sites/default/files'
  )
);

$remote_sites = '/var/www/sites/';

$aliases['remote'] = array (
  'remote-host' => '10.0.0.65',
  'remote-user' => 'username',
  'ssh-options' => "-p 22",
  'path-aliases' => array(
  '%dump-dir' => '/home/username/drush.dbdumps'
)
);

$aliases['remote.local'] = array(
  'parent' => '@remote',
  'root' => $remote_sites . 'remote.local',
  'path-aliases' => array(
    '%files' => $remote_sites . 'remote.local/sites/default/files'
  )
);

Рассмотрим синхронизацию базы данных с удаленного сервера на локальный.
Для этого выполним следующую команду:


drush sql-sync @remote.local @site.local 

При этом указываем сначала откуда будет происходить синхронизация, а затем - куда.

Также можно использовать следующие дополнительные параметры:

  • --create-db Создать новую бд перед началом импорта на целевой машине.
  • --db-su При создании бд соответственно указать пользователя mysql .
  • --db-su-pw И для указанного пользователя пароль.
  • --dump-dir Директория для сохранения sql дампов, на случай если что то надо откатить
  • --tables-list Список таблиц для синхронизации перечисленных через запятую
  • --skip-tables-key Ключ для таблиц, которые не нужно синхронизировать (задается в drushrc.php)

Если в параметр --skip-tables-key передано значение common, то в файле drushrc.php должна содержаться строка


 $options['skip-tables']['common'] = array('migration_data1', 'migration_data2');

Далее рассмотрим синхронизацию файлов с удаленного сервера на локальный.
Выполняем в консоли команду


drush rsync @remote.local:%files/ @site.local:%files/

У rsync имеются следующие дополнительные параметры

  • --exclude-conf Исключить файл settings.php при синхронизации. По-умолчанию.
  • --exclude-files Исключить директории с файлами
  • --exclude-paths Список исключенных путей разделенных символами : (Unix-based systems) или ; (Windows)
  • --exclude-sites Исключить сайты из каталога sites
  • --include-conf Добавить файл settings.php, исключенный по умолчанию
  • --include-paths Список включенных путей разделенных символами : (Unix-based systems) или ; (Windows)
  • --include-vcs Включить специальные директории для систем контроля версий (e.g. .svn). По-умолчанию vcs файлы исключены .

Синхронизация файлов может занять очень длительное время - до завершения командная строка не должна закрываться (сессия закрываться). Если нужно увидеть прогресс синхронизации, то можно воспользоваться какой-нибудь системной утилитой для мониторинга сетевого трафика.