Drush in einer Multisite-Umgebung

Um drush in einer Multisiteumgebung zu arbeiten, haben sich folgende Mechanismen als nützlich erwiesen:

Drush-Alias für Multisite

An dieser Stelle werden Aliase auf die jeweiligen drush-Version(Symlink) und der auf -r bzw. --root folgenden Wurzel der Drupal-Installation gesetzt.

Alternativ zu Aliasen auf die Drupal-Wurzel, kann dies auch über
drushrc.php, die Konfigurationsdatei für drush erfolgen.

Drush ist in nach /usr/local/share/ installiert worden und das Wrapper-Skript /usr/local/share/drush/drush ist ein Softlink nach /usr/local/bin/drush.

alias drush5_='/usr/local/bin/drush/drush -r /home/drupal/5.x '
alias drush6_='/usr/local/bin/drush/drush -r /home/drupal/6.x '

Verwendung von drush in der Multisiteumgebung

Der Aufruf von drush erfolgt über den angelegten Alias + die Spezifizierung der Subsite,
mittels -l oder --uri="".

Im folgenden Beispiel werden die Informationen über den Status der Seite aktualisiert.

drush6_ -l http://example.com pm-refresh

Für 5.x ist das Modul Update Status Voraussetzung für die Aktionen pm-refresh (rf) und pm-update (up).

sites/all/modules & sites/example.com/modules

Wenn sites/all/modules und sites/example.com/modules parallel existieren, installiert drush Module nach sites/all/modules.

Im Falle, das sites/all/modules nicht existiert, dafür aber sites/example.com/modules wird sites/all/modules erstellt und benutzt.

Um trotzdem sites/example.com/modules verwenden zu können existiert in sites/all kein modules Verzeichnis und sites/all ist schreibgeschütz.

Multisite-Features unter Drupal 7.x

Rudimente für ein Drupal-Deployment mit

  • Lokaler Entwicklungumgebung
  • Stage-Umgebung
  • Live / Produktionsumgebung

unter Verwendung, der in Drupal-7 neu eingeführten Multisite-Features in der Datei sites.php, Drush-Aliases
und einer speziellen settings.php,
die in diesem Fall versioniert wird.

sites.php -- Verzeichnis Aliase in Drupal 7.x

Die in Drupal 7.x neu eingeführte Datei sites.php stellt erstmalig Verzeichnis-Aliase für Drupal-Multisites zur Verfügung.

So ist es jetzt möglich mit verschiedenen Domains bzw. VirtualHosts ein bestimmtes Verzeichnis innerhalb von sites anzusprechen,
ohne über z.B. Symbolische Links zu gehen, was in vorgigen Drupal-Versionen zur Folge haben konnte, daß Datei- oder Modulpfade beim "umbiegen" von der Dev-Site example.mydomain.de auf die Live-Site example.com divergent sind.

// sites/sites.php

// (LOCAL) DEV SITE
$sites['example.localhost'] = 'example.com';

// STAGE SITES
$sites['stage-example.mydomain.de'] = 'example.com';
$sites['stage.example.com'] = 'example.com';

// LIVE SITE
$sites['example.com'] = 'example.com';

@see /path/to/drupal7/sites/example.sites.php

settings.php für DEV, STAGE und LIVE

Im folgenden Ausschnitt der settings.php werden für

  • DEV SITE
  • STAGE SITE
  • LIVE SITE

unterschiedliche Datenbanken und Vorbelegungen von Variablen definiert.

Die verschiedenen Umgebungen sind von einem Switch auf $_SERVER['HTTP_HOST'] eingeschlossen,
und es werden über den Host-Header des aktuellen Requests die entsprechenden Einstellungen genommen.

Die Verwendung des Contributed-Modules "Environment Indicator" weist optisch zusätzlich darauf hin, auf welcher Umgebung man sich gerade befindet, hierzu hat mich besonders Dirk Rüdigers Artikel zu Drush site-alias motiviert(s.u.).

// sites/default/settings.php

switch ($_SERVER['HTTP_HOST']) {
  case 'stage.example.com':
  case 'stage-example.mydomain,de':

    $conf['environment_indicator_text'] = 'STAGE SITE';
    $conf['environment_indicator_color'] = 'salmon';

    $databases = array (
      'default' =>
      array (
        'default' =>
        array (
          'database' => 'stage_db',
          'username' => 'stage_db_user',
          'password' => 'stage_db_passwd',
          'host' => 'localhost',
          'port' => '',
          'driver' => 'mysql',
          'prefix' => '',
        ),
      ),
    );
    break;

  case 'example.com':

    $conf['environment_indicator_text'] = 'LIVE SITE';
    $conf['environment_indicator_color'] = 'red';

    $databases = array (
      'default' =>
      array (
        'default' =>
        array (
          'database' => 'live_db',
          'username' => 'live_db_user',
          'password' => 'live_db_passwd',
          'host' => 'localhost',
          'port' => '',
          'driver' => 'mysql',
          'prefix' => '',
        ),
      ),
    );
    break;

  default:
    $conf['environment_indicator_text'] = 'LOCAL DEV SITE';
    $conf['environment_indicator_color'] = 'green';

    $databases = array (
      'default' =>
      array (
        'default' =>
        array (
          'database' => 'local_dev',
          'username' => 'local_dev_user',
          'password' => 'local_dev_passwd',
          'host' => 'localhost',
          'port' => '',
          'driver' => 'mysql',
          'prefix' => '',
        ),
      ),
    );
}

@see /path/to/drupal7/sites/default/default.settings.php

Drush-Aliases

In drush V. 3. wurden Site-Aliase eingeführt, dies ermöglicht, ähnlich wie bei Aliasen auf der Shell eine kurze Schreibweise für eine längere Befehlangabe.

Um explizit eine Drupal-Site und deren spezifische Einstellungen in einer Drupal-Multisite-Umgebung anzusprechen,
sind die Angabe der Drupal-Wurzel (--root=/path/to/drupal)
und der Name der Site bzw. dem Namen des Verzeichnisse in dem die jeweilige Site liegt (--uri=example.com) nötig.

Durch das folgende Snippet lassen sich die Instanzen über die Aliase

  • @dev
  • @stage
  • @stage2
  • @live

ansprechen und die Optionen --uri=example.com bzw. der kurzen Schreibweise -l example.com werden $_SERVER['HTTP_HOST'] durch drush gesetzt.

// /etc/drush/aliases.drushrc.php

$aliases['dev'] = array(
  'uri' => 'example.localhost',
  'root' => '/multi/drupal/7.x',
);

$aliases['stage'] = array(
  'uri' => 'stage-example.mydomain.de',
  'root' => '/multi/drupal/7.x',
);

$aliases['stage2'] = array(
  'parent' => '@stage',
  'uri' => 'stage.example.com',
);

$aliases['live'] = array(
  'uri' => 'example.com',
  'root' => '/multi/drupal/7.x',
);

Analog zum Host-Header des aktuellen Requests einer Web-Anfrage
wird in der obigen settings.php nun hierüber verzweigt.

@see /path/to/drush/examples/example.aliases.drushrc.php

Weiterführendes