Host filtering

You may encounter situations where you only want to deploy to a subset of the servers defined in your configuration. For example, a single server or set of servers may be misbehaving, and you want to re-deploy to just these servers without deploying to every server.

You can use the host filter to restrict Capistrano tasks to only servers that match a given set of hostnames.

If the filter matches no servers, no actions will be taken.

If you specify a filter, it will match servers that have the listed hostnames, and it will run all the roles for each server. In other words, it only affects the servers the task runs on, not what tasks are run on a server.

Specifying a host filter

There are three ways to specify the host filter.

Environment variable

Capistrano will read the host filter from the environment variable HOSTS if it is set. You can set it inline:

HOSTS=server1,server2 cap production deploy

Specify multiple hosts by separating them with a comma.

In configuration

You can set the host filter inside your deploy configuration. For example, you can set the following inside config/deploy.rb:

set :filter, :hosts => %w{server1 server2}

Note that you specify the filter as an array rather than as a comma-separated list of servers when using this method.

Note that the keyname :host is also supported.

On the command line

In a similar way to using the environment variable, you can set the role filter by specifying it as a command line argument to cap:

cap --hosts=server1,server2 production deploy

Like the environment variable method, specify multiple servers by separating them with a comma.

Using Regular Expressions

If the host name in a filter doesn’t match the set of valid characters for a DNS name (Given by the regular expression /^[-A-Za-z0-9.]+$/) then it’s assumed to be a regular expression in standard Ruby syntax.

For example, if you had three servers named localrubyserver1, localrubyserver2, and amazonrubyserver1, but only wanted to deploy to localrubyserver*, you call Capistrano with a regex:

cap --hosts=^localrubyserver production deploy
Fork me on GitHub