Tipp:

Ich halte es für empfehlenswert, auch für lokale Sites mit Site-Aliasen zu arbeiten:

  1. Die Befehle sind von überall aus innerhalb des Datei-Systems – und nicht nur aus dem lokalen Apache-Webroot – ausführbar.
  2. Indem man anstelle von "default" einen lokalen Site-Alias verwendet, wird es erheblich transparenter, welche Daten man gerade von wo nach wo synchronisiert. Das hilft Fehler zu vermeiden.

Drush site-aliase

Über Site-Aliase lassen sich externe Installationen per Drush ansprechen, soweit SSH-Zugriff auf die Server besteht.

Site-aliase werden in der Datei ~/.drush/aliases.drushrc.php definiert.

Aufbau der Datei

Im folgenden Beispiel werden zwei Site-Aliase für comm-press für die Livesite und die lokale Umgebung definiert. Diese remotes lassen sich per Drush als @cp-livesite bzw. @cp-local ansprechen.

<?php

/*
---------------------------
* comm-press
---------------------------
*/

/*
* comm-press: DrupalConcept Live-Site
*/

$aliases['cp-livesite'] = array(
  'uri' => 'www.comm-press.de',
  'root' => '/var/www/clients/client4/site9/docroot',
  'remote-host' => 'pro10.drupalconcept.net',
  'remote-user' => '[SSH-User]',
  'path-aliases' => array(
    '%pubimg' => '/var/www/clients/client4/site9/docroot/sites/default/files',
  ),
  'databases' => array(
    'default' => array(
      'default' => array(
        'driver' => 'mysql',
        'database' => '[NameDerDatenbank]',
        'username' => '[NameDesDatenbankNutzers]',
        'password' => '[DatenbankPasswort]',
        'host' => 'localhost',
        'prefix' => '',
        'collation' => 'utf8_general_ci',
      ),
    ),
  ),
);

/*
* comm-press: lokale Umgebung
*/

$aliases['cp-local'] = array(
  'uri' => 'comm-press.local',
  'root' => '/srv/www/comm-press/htdocs',
  'path-aliases' => array(
    '%pubimg' => '/srv/www/comm-press/htdocs/sites/default/files',
  ),
);

Ein umfangreich dokumentiertes Beispiel findet sich unter http://drush.ws/examples/example.aliases.drushrc.php.

Testen der Konfiguration: Drush status

Die Konfiguration lässt sich am besten per "drush status" testen:

drush @site status

Dieser Befehl sollte den vollständigen Status der Seite zurück liefern. Also z.B.:

Drupal version         :  6.26.19                               
Site URI               :  www.comm-press.de                     
Database driver        :  mysql                                 
Database hostname      :  localhost                             
Database username      :  *** [NameDesDatenbankNutzers] ***                                 
Database name          :  *** [NameDerDatenbank] ***      
Database               :  Connected                             
Drupal bootstrap       :  Successful                            
Drupal user            :  Gast                                  
Default theme          :  commpress                             
Administration theme   :  seven                                 
PHP configuration      :  /etc/php5/cli/php.ini                 
Drush version          :  5.3                                   
Drush configuration    :                                        
Drupal root            :  /var/www/clients/client4/site9/docroot
Site path              :  sites/default                         
File directory path    :  sites/default/files

Theoretisch ist es möglich, die Gesamtkonfiguration auch in unterschiedliche Konfigurationsdateien z.B. der Art project1.aliases.drushrc.php auszulagern und aufzuteilen. Ich habe das allerdings nicht ausprobiert und speichere die gesamte Konfiguration sämtlicher Projekte in einer einzigen Datei.

Ebenso ist es möglich, für bestimmte wiederkehrende Konfigurationen mit Variablen zu arbeiten. Damit habe ich mich aber ebenfalls nicht beschäftigt.

Drush Befehle remote ausführen

Um Drush-Befehle remote auszuführen, verwendet man die gleiche Syntax wie lokal, nur dass man den Site-alias mit angibt.

Mit diesem Befehl lässt sich eine externe Seite in den Wartungsmodus nehmen:

drush @cp-livesite variable_set site_offline 1

Drush sql-sync

Mit Drush sql-sync lassen sich die Inhalte von Datenbanken synchronisieren.

Drush führt dabei auf dem Quellsystem ein sqldump aus, komprimiert die Datei, überträgt sie und führt auf dem Zielsystem ein Restore aus.

Dabei werden nur die SQL-Befehle innerhalb des Dumps ausgeführt: die Daten der Quelldatenbank werden – sofern nicht bereits vorhanden – additiv an bestehende Daten angefügt.

Sofern die Zieldatenbank Tabellen enthält, die in der Quelldatenbank nicht vorhanden sind, werden diese Tabellen nicht berührt und werden nach der Synchronisation weiterhin erhalten sein.

Wenn man sicher gehen möchte, dass beide Datenbanken nach der Synchronisation absolut identisch sind, sollte man sämtliche Tabellen der Zieltdatenbank vorher mit PhpMyAdmin löschen.

Der Befehl für die Synchronisation lautet:

drush sql-sync @quelle @ziel

Also zum Beispiel

drush sql-sync @cp-livesite @cp-local

Tipp:

Nach Absenden des Befehls erscheint erst noch eine Sicherheitsabfrage, die aufmerksam kontrolliert werden sollte! Ein Übergehen dieser Abfrage mit dem Parameter "-y" ist nicht empfehlenswert!

You will destroy data from comm-press and replace with data from pro10.drupalconcept.net/db17.
You might want to make a backup first, using the sql-dump command.
Do you really want to continue? (y/n):

Drush rsync

Mit dem Befehl Drush rsync lassen sich Dateien übertragen. Um zu verhindern, dass Dateien aus dem git mit übertragen werden, sollte der der Befehl niemals ohne die Angabe eines Verzeichnisses ausgeführt werden:

drush rsync @quelle @ziel

Der passende Befehl für die Synchronisation mit einem Git-Repository lautet z.B.

drush rsync @cp-livesite:sites/default/files @cp-local:sites/default/files

Nach Absenden des Befehls erscheint ebenfalls erst noch eine Sicherheitsabfrage, die auch hier aufmerksam kontrolliert werden sollte!

Tipp:

Zum Debugging und weil das Synchronisieren größerer Verzeichnisse sehr lange dauern kann, lässt sich mit "-v" bzw. "-vv" ("verbose") ein ausführlicher Status während des Prozesses zurück geben:

drush rsync @cp-livesite:sites/default/files @cp-local:sites/default/files -vv

Mit Systemvariablen arbeiten

Für einige typische System-Pfade existieren bereits Variablen wie %files oder %private, die sich einzeln oder in Kombination verwenden lassen:

drush rsync @cp-livesite:%files @cp-livesite:%files

Um nur das /sites/default/files/img-Verzeichnis und nicht das gesamte Files-Verzeichnis zu synchronisieren kann der Befehl auch mit Angabe von Ordnern verwendet werden:

drush rsync @cp-livesite:%files/img @cp-local:%files/img

Synchronieren des ../private-Verzeichnisses

Der Pfad zum privaten Dateien-System ist unter %private verfügbar.

Warnung:

Die Synchronisation des gesamten privaten Dateien-Systems wäre technisch möglich, würde in unserer Konfiguration aber die settings.php auf dem Zielsystem überschreiben!

Wir empfehlen die Zugangsdaten der Datei "settings.php" außerhalb des Apache Webroots abzulegen. Das erreichen wir, indem wir die Datei ../private/local.settings.php per include in der normalen /sites/default/settings.php einfügen.

So, if you work @ comm-press, never do this:

drush rsync @quelle:%private @ziel:%private

Verwendung von Pfad-Aliasen

Mit dem folgenden Sub-Array lassen sich innerhalb der aliases.drushrc.php weitere Variablen für Pfade definieren, die beim rsync verwendet werden können.

  'path-aliases' => array(
    '%pubimg' => '/srv/www/comm-press/htdocs/sites/default/files',
    '%privimg' => '/srv/www/comm-press/private',
  ),

Die Syntax zum Synchronisieren lautet dementsprechend:

drush rsync @cp-livesite:%pub-img @cp-local:%pub-img

bzw. um innerhalb von sites/default/files nur den Ordner " download" zu synchronisieren:

drush rsync @cp-livesite:%pub-img/download @cp-local:%pub-img/download

Ausschließen von Pfaden

Mit dem folgenden Sub-Array "command-specific" lassen sich theoretisch Pfade definieren, die bei der Synchronisation ausgeschlossen werden.

  'command-specific' => array (
    'rsync' => array (
          'exclude-paths' => '/var/www/clients/client4/site142/docroot/sites/default/files/js:/var/www/clients/client4/site142/docroot/sites/default/files/css:/var/www/clients/client4/site142/docroot/sites/default/files/backup_migrate',
      ),
  ),

Bei meinen Versuchen hat dies jedoch nicht funktioniert.

Möglicherweise liegt hier ein Fehler innerhalb von Drush vor.

Direkte Synchronisation zwischen zwei Remotes

Ein direkter rsync zwischen zwei Remote-Servern ist grundsätzlich möglich. Dabei werden die Daten unmittelbar übertragen ohne dass sie erst zum lokalen System herunter- und von dort wieder hochgeladen werden.

Dies funktioniert allerdings nur dann, wenn sich die beiden Server per SSH erreichen können und die gleichen Aliase verwenden wie das lokale System.

Problem: rsync bei Multisite-Installationen

Laut Eugen gibt es ein Problem bei der Datei-Synchronisation innerhalb von Multisite-Installationen. Aufgrund eines Fehlers innerhalb von Drush werden dann nicht nur die Dateien eines einzelnen Systems sondern die Dateien sämtlicher Multisite-Ordner in das Zielverzeichnis kopiert.

Ich habe das nicht beobachten können. Wer das genau wissen möchte, sollte sich an Eugen Mayer von KontextWork wenden...

Dokumentation der Drush Befehle

Eine umfassende Dokumentation zu drush findet sich unter http://drush.ws, eine Beispiel-Datei einer site-alias-Konfiguration unter http://drush.ws/examples/example.aliases.drushrc.php.

Danksagung

Vielen Dank an Markus Heurung von Freistil IT, der mich mit seiner "Staging with git and drush"-Session auf dem Drupal-Camping inspiriert hat, mich endlich mal mit Drush-Aliasen auseinander zu setzen.

Markus hat diese Session bereits im Juni auf dem DrupalCamp im Barcelona gehalten. Die Slides befinden sich hier.