Drush aliases
Have you noticed how your remote drush aliases (e.g., @my-dev-server) don't work when you're logged into the remote server? It's because aliases with the "remote-host" key specified can't work locally. Quite annoying!
In order to execute your (scripted) drush actions, you've first gotta change into the appropriate sites directory. What a hassle! Let's make life easier. Below (and in this gist) you'll find a solution that works in most hosting environments. It detects the local server name/ip, and strips the "remote-host" entry from entries that match. Skip to the bottom of the code snippet to see the real magic.
/**
* @file
* Example drush alias file for multihost use.
*/
// Alias settings common to all.
$aliases['base'] = array(
'root' => '/var/www/docroot',
'remote-user' => 'georgepburdell',
'path-aliases' => array(
'%files' => 'sites/default/files',
'%dump' => '/tmp/dump.sql',
),
);
// We explicitly include the "remote-host" key for each
// alias below. This means that the aliases won't work
// when logged in to the same box. E.g. @dev fails
// while logged into the dev server. So, at the end, we
// determine the current server and remove
// "remote-host" from all local aliases.
//
// Dev site.
$aliases['dev'] = array(
'parent' => '@example.base',
'remote-host' => 'dev.example.com',
'uri' => 'dev.example.com',
);
// Alias entry for a "home directory" site hosted on
// the dev server. Note the parent is @dev and not
// @base.
$aliases['georgepburdell'] = array(
'parent' => '@example.dev',
'root' => '/home/georgepburdell/public_html',
'uri' => 'georgepburdell.dev.example.com',
);
// Staging site.
$aliases['stage'] = array(
'parent' => '@example.base',
'remote-host' => 'stage.example.com',
'uri' => 'stage.example.com',
);
// Production site.
$aliases['prod'] = array(
'parent' => '@example.base',
'remote-host' => 'www.example.com',
'uri' => 'www.example.com',
);
// TL;DR: MAGIC STARTS HERE.
//
// Remove "remote-host" from entries that correspond
// with the current server. This allows us to use the
// same alias file in all environments.
$ip = gethostbyname(php_uname('n'));
foreach ($aliases as &$alias) {
if (empty($alias['remote-host'])) {
continue;
}
if (gethostbyname($alias['remote-host']) === $ip) {
unset($alias['remote-host']);
}
}
Ví dụ gọi drush
In this example, calling "drush sa @example.dev" from the dev server shows the alias record without a "remote-host" key. Voila!
$aliases["example.dev"] = array (
'#name' => 'example.dev',
'remote-user' => 'georgepburdell',
'path-aliases' =>
array (
'%files' => 'sites/default/files',
'%dump' => '/tmp/dump.sql',
),
'root' => '/var/www/html',
'uri' => 'http://dev.example.com',
);