Drall is a tool that helps run drush commands on multi-site Drupal installations.
One command to drush them all. — Jigarius
A big thanks and shout-out to Symetris for sponsoring the initial development of Drall.
Drall is listed on Packagist.org.
Thus, it can easily be installed using composer
as follows:
composer require jigarius/drall
Drall's functioning depends on its Placeholders. Here's how Drall works under the hood:
- Receive a command, say,
drall exec COMMAND
. - Ensure there is a
@@placeholder
inCOMMAND
. - Run
COMMAND
after replacing@@placeholder
with site-specific values. - Display the result.
Drall supports the following placeholders:
This placeholder is replaced with the name of the site's directory under
Drupal's sites
directory. These are the values of the $sites
array
usually defined in sites.php
.
# @@dir is replaced with "ralph" and "leo".
$sites['raphael.com'] = 'ralph';
$sites['leonardo.com'] = 'leo';
Note: In older versions of Drall, this was called @@uri
.
This placeholder is replaced with keys of the $sites
array.
# @@key is replaced with "raphael.com", "raphael.local" and "leonardo.com".
$sites['raphael.com'] = 'ralph';
$sites['raphael.local'] = 'ralph';
$sites['leonardo.com'] = 'leo';
This placeholder is replaced with unique keys of the $sites
array. If a site
has multiple keys, the last one is used as its unique key.
# @@key is replaced with "raphael.local" and "leonardo.local".
$sites['raphael.com'] = 'ralph';
$sites['raphael.local'] = 'ralph';
$sites['leonardo.com'] = 'leo';
$sites['leonardo.local'] = 'leo';
This placeholder is replaced with the first part of the site's alias.
# @@site is replaced with "@ralph" and "@leo".
@ralph.local
@leo.local
Note: This placeholder only works for sites with Drush aliases.
To see a list of commands offered by Drall, run drall list
. If you feel lost,
run drall help
or continue reading this documentation.
With exec
you can execute drush as well as non-drush commands on multiple
sites in your Drupal installation.
In Drall 2.x there were 2 exec commands. These are now unified into a single command just like version 1.x.
drall exec:drush ...
is nowdrall exec drush ...
drall exec:shell ...
is nowdrall exec ...
When drall exec
receives a signal to interrupt (usually ctrl c
), Drall
stops after processing the site that is currently being processed. This
prevents the current command from terminating abruptly. However, if a second
interrupt signal is received, then Drall stops immediately.
In this method, the --uri
option is sent to drush
.
drall exec -- drush --uri=@@dir core:status
If it is a Drush command and no valid @@placeholder
are present, then
--uri=@@dir
is automatically added after each occurrence of drush
.
# Raw drush command (no placeholders)
drall exec drush core:status
# Command that is executed (placeholders injected)
drall exec -- drush --uri=@@dir core:status
$ drall exec drush core:status
drush --uri=default core:status
drush --uri=donnie core:status
drush --uri=leo core:status
drush --uri=mikey core:status
drush --uri=ralph core:status
In this method, a site alias is sent to drush
.
drall exec drush @@site.local core:status
$ drall exec drush @@site.local core:status
drush @tmnt.local core:status
drush @donnie.local core:status
drush @leo.local core:status
drush @mikey.local core:status
drush @ralph.local core:status
You can run non-Drush commands the same was as you run Drush commands. Just make sure that the command has valid placeholders.
Important: You can only use any one of the possible placeholders, e.g. if
you use @@dir
and you cannot mix it with @@site
.
$ drall exec cat web/sites/@@uri/settings.local.php
cat web/sites/default/settings.local.php
cat web/sites/donnie/settings.local.php
cat web/sites/leo/settings.local.php
cat web/sites/mikey/settings.local.php
cat web/sites/ralph/settings.local.php
drall exec "drush @@site.dev updb -y && drush @@site.dev cim -y && drush @@site.dev cr"
For the drall exec
command, all Drall options must be set right after
drall exec
. Additionally, --
must be used before the command to be
executed. Following are some examples of running drush
with options.
# Drall is --verbose
drall exec --verbose -- drush core:status
# Drush is verbose
drall exec -- drush --verbose core:status
# Both Drall and Drush are --verbose
drall exec --verbose -- drush --verbose core:status
In summary, the syntax is as follows:
drall exec [DRALL-OPTIONS] -- drush [DRUSH-OPTIONS]
Besides the global options, the exec
command supports the following options.
This option makes Drall wait for n
seconds after processing each item.
drall exec --interval=3 -- drush core:rebuild
Such an interval cannot be used when using a multiple workers.
Say you have 100 sites in a Drupal installation. By default, Drall runs
commands on these sites one after the other. To speed up the execution, you
can ask Drall to execute multiple commands in parallel. You can specify the
number of workers with the --workers=n
option, where n
is the
number of processes you want to run in parallel.
Please keep in mind that the performance of the workers depends on your resources available on the computer executing the command. If you have low memory, and you run Drall with 4 workers, performance might suffer. Also, some operations need to be executed sequentially to avoid competition and conflict between the Drall workers.
The command below launches 3 instances of Drall to run core:rebuild
command.
drall exec --workers=3 -- drush core:rebuild
When a worker runs out of work, it terminates automatically.
By default, Drall displays a progress bar that indicates how many sites have been processed and how many are remaining. In verbose mode, this progress indicator also displays the time elapsed.
However, the progress display that can mess with some terminals or scripts
which don't handle backspace characters. For these environments, the progress
bar can be disabled using the --no-progress
option.
drall exec --no-progress -- drush core:rebuild
This option allows you to see what commands will be executed without actually executing them.
$ drall exec --dry-run --group=bluish -- drush core:status
drush --uri=donnie core:status
drush --uri=leo core:status
Get a list of all available site directory names in the Drupal installation.
All sites/*
directories containing a settings.php
file are treated as
individual sites.
$ drall site:directories
default
donnie.com
leo.com
mikey.com
ralph.com
The output can then be iterated with scripts.
for site in $(drall site:directories)
do
echo "Current site: $site";
done;
Get a list of all keys in $sites
. Usually, these are site URIs.
$ drall site:keys
tmnt.com
donatello.com
leonardo.com
michelangelo.com
raphael.com
The output can then be iterated with scripts.
for site in $(drall site:keys)
do
echo "Current site: $site";
done;
Get a list of site aliases.
$ drall site:aliases
@tmnt.local
@donnie.local
@leo.local
@mikey.local
@ralph.local
The output can then be iterated with scripts.
for site in $(drall site:aliases)
do
echo "Current site: $site";
done;
This section covers some options that are supported by all drall
commands.
Specify the target site group. See the section site groups for more information on site groups.
drall exec --group=GROUP -- drush core:status --field=site
If --group
is not set, then the Drall uses the environment variable
DRALL_GROUP
, if it is set.
Filter placeholder values with an expression. This is helpful for running commands on specific sites.
# Run only on the "leo" site.
drall exec --filter=leo -- drush core:status
# Run only on "leo" and "ralph" sites.
drall exec --filter="leo||ralph" -- drush core:status
For more on using filter expressions, refer to the documentation on consolidation/filter-via-dot-access-data.
Display verbose output.
Display debug-level output.
Drall uses sites.php
to determine site hostnames and site directories.
However, some Drupal multi-site installations do not have a sites.php
because the content of the DRUPAL/sites
directory changes very frequently,
thereby making it difficult to maintain such a sites.php
.
In such cases, it is suggested that you create a DRUPAL/sites/sites.php
based on misc/example.sites.php so that Drall can
detect the sites in your Drupal installation. Additionally, in this file you
can alter the $sites
variable based on your requirements.
Drall allows you to group your sites so that you can run commands on these
groups using the --group
option.
In a site alias definition file, you can assign site aliases to one or more groups like this:
# File: tnmt.site.yml
local:
root: /opt/drupal/web
uri: http://tmnt.com/
# ...
drall:
groups:
- cartoon
- action
This puts the alias @tnmt.local
in the cartoon
and action
groups.
If your project doesn't use site aliases, you can still group your sites using
one or more sites.GROUP.php
files like this:
# File: sites.bluish.php
$sites['donnie.drall.local'] = 'donnie';
$sites['leo.drall.local'] = 'leo';
This puts the sites donnie
and leo
in a group named bluish
.
Here's how you can set up a local dev environment.
- Clone the
https://github.com/jigarius/drall
repository.- Use a branch as per your needs.
- Run
docker compose up -d
. - Run
docker compose start
. - Run
make ssh
to launch a shell in the Drupal container. - Run
make provision
. - Run
drall --version
to test the setup. - Run
make lint
to run linter. - Run
make test
to run tests.
You should now be able to make ssh
and then run drall
. A multi-site Drupal
installation should be present at /opt/drupal
. Oh! And Drall should be
present at /opt/drall
.
To access the dev sites in your browser, add the following line to your hosts
file. It is usually located at /etc/hosts
. This is completely optional, so
do this only if you need it.
127.0.0.1 tmnt.drall.local donnie.drall.local leo.drall.local mikey.drall.local ralph.drall.local
The sites should then be available at: