drush inheritance, site-ssh and site-list It's possible I'm going about this all wrong, and I should be setting up my aliases file differently.

We have a set up with 4 load-balanced production servers running the same code and accessing the same database. I want to set up a drush aliases file to access them by a short name and also allow commands to be run on all of them simultaneously. Here's what I have so far, in ~/.drush/cust.aliases.drushrc.php:

&lt;?php
$aliases['production'] = array (
  'root' =&gt; '/var/www/cust',
  'uri' =&gt; 'www.example.com',
  'databases' =&gt; array(
    'default' =&gt; array(
      'default' =&gt; array(
        'database' =&gt; '...',
        'username' =&gt; '...',
        'password' =&gt; '...',
        'host' =&gt; '...',
        'port' =&gt; '3306',
        'driver' =&gt; 'mysql',
      ),
    ),
  ),
  'site-list' =&gt; array(
    'production.1',
    'production.2',
    'production.3',
    'production.4',
  ),
);
$aliases['production.1'] = array (
  'parent' =&gt; '@production',
  'remote-host' =&gt; '...',
  'site-list' =&gt; array(),
);
$aliases['production.2'] = array (
  'parent' =&gt; '@production',
  'remote-host' =&gt; '...',
);
$aliases['production.3'] = array (
  'parent' =&gt; '@production',
  'remote-host' =&gt; '...',
);
$aliases['production.4'] = array (
  'parent' =&gt; '@production',
  'remote-host' =&gt; '...',
);
?&gt;


Now the problem I have is that the site-list variable is being added to the individual definitions, so the site-ssh command thinks that they are a list. I've tried a few things to sort this out, including adding 'site-list' =&gt; NULL, 'site-list' =&gt; array() and 'site-list' =&gt; '' to the the production.x definitions, but this doesn't work since site-ssh just uses isset. Neither do my attempts to use the unset function because the inheritance happens after I've tried to unset it.
The problem here is that Drush will always prefer the non-empty 'site-list' in @production over any empty value you provide in the specific site aliases.  This is regrettable, as it makes it Hard to delete values.

There are a couple of alternatives, though.  The most straightforward solution is to just take advantage of the fact that Drush alias files are executable php.  You can refactor your alias definitions like this:

&lt;?php
$common = array (
  'root' =&gt; '/var/www/cust',
  'uri' =&gt; 'www.example.com',
  'databases' =&gt; array(
    'default' =&gt; array(
      'default' =&gt; array(
        'database' =&gt; '...',
        'username' =&gt; '...',
        'password' =&gt; '...',
        'host' =&gt; '...',
        'port' =&gt; '3306',
        'driver' =&gt; 'mysql',
      ),
    ),
  ),
);
$aliases['production'] = array (
  'site-list' =&gt; array(
    'production.1',
    'production.2',
    'production.3',
    'production.4',
  ),
);
$aliases['production.1'] = array (
  'remote-host' =&gt; '...',
) + $common;
$aliases['production.2'] = array (
  'remote-host' =&gt; '...',
) + $common;
$aliases['production.3'] = array (
  'remote-host' =&gt; '...',
) + $common;
$aliases['production.4'] = array (
  'remote-host' =&gt; '...',
) + $common;


Your second option is to take advantage of a Drush feature that automatically creates group aliases for all aliases that are defined in a single alias file.  Start with your alias file definition as you show it in the question above; then:

1) Delete 'site-list' from the 'production' alias.

2) Move the 'production' alias to a different file (I use servers.aliases.drushrc.php to store aliases to all of the servers that I have sites on).

3) Keep the individual site aliases as they are, with 'parent' =&gt; '@server.production'.

Once you have done that, you may use @cust as an alias list for all of the aliases defined in cust.aliases.drushrc.php.