Selector
Deployer uses the selector to choose hosts. Each host can have a set of labels. Labels are key-value pairs.
For example, stage: production or role: web.
You can use labels to select hosts. For example, dep deploy stage=production
will deploy to all hosts with stage: production label.
Let's define two labels, type and env, to our hosts:
host('web.example.com')
->setLabels([
'type' => 'web',
'env' => 'prod',
]);
host('db.example.com')
->setLabels([
'type' => 'db',
'env' => 'prod',
]);
or use ->addLables() method to add labels to the existing host.
Now let's define a task to check labels:
task('info', function () {
writeln('type:' . get('labels')['type'] . ' env:' . get('labels')['env']);
});
Now we can run this task with a selector:
$ dep info env=prod
task info
[web.example.com] type:web env:prod
[db.example.com] type:db env:prod
As you can see, Deployer will run this task on all hosts with the env: prod label.
And if we define only the type label, Deployer will run this task on the specified host.
dep info type=web
task info
[web.example.com] type:web env:prod
Selector syntax
Label syntax is represented by disjunctive normal form (OR of ANDs).
(condition1 AND condition2) OR (condition3 AND condition4)
Each condition in the subquery that is represented by conjunctive normal form
(condition1 OR condition2) AND (condition3 OR condition4)
Explanation
For example, type=web,env=prod is a selector of: type=web OR env=prod.
$ dep info 'type=web,env=prod'
task info
[web.example.com] type:web env:prod
[db.example.com] type:db env:prod
As you can see, both hosts are selected (as both of them have the env: prod label).
We can use & to define AND. For example, type=web & env=prod is a selector
for hosts with type: web AND env: prod labels.
$ dep info 'type=web & env=prod'
task info
[web.example.com] type:web env:prod
We can use | to define OR in a subquery. For example, type=web|db & env=prod is a selector
for hosts with (type: web OR type: db) AND env: prod labels.
$ dep info 'type=web|db & env=prod'
task info
[web.example.com] type:web env:prod
We can also use != to negate a label. For example, type!=web is a selector for
all hosts which do not have a type: web label.
$ dep info 'type!=web'
task info
[db.example.com] type:db env:prod
Deployer CLI can take a few selectors as arguments. For example,
dep info type=web env=prod is the same as dep info 'type=web,env=prod'.
You can install bash autocompletion for Deployer CLI, which will help you to write selectors. See installation for more.
Deployer also has a few special selectors:
all- select all hostsalias=...- select host by alias
If a selector does not contain an = sign, Deployer will assume that it is an alias.
For example dep info web.example.com is the same as dep info alias=web.example.com.
$ dep info web.example.com
task info
[web.example.com] type:web env:prod
$ dep info 'web.example.com' 'db.example.com'
$ # Same as:
$ dep info 'alias=web.example.com,alias=db.example.com'
Using the select() function
You can use the select() function to select hosts by selector in your PHP code.
task('info', function () {
$hosts = select('type=web|db,env=prod');
foreach ($hosts as $host) {
writeln('type:' . $host->get('labels')['type'] . ' env:' . $host->get('labels')['env']);
}
});
Or you can use the on() function to run a task on selected hosts.
task('info', function () {
on(select('all'), function () {
writeln('type:' . get('labels')['type'] . ' env:' . get('labels')['env']);
});
});
Task selectors
To restrict a task to run only on selected hosts, you can use the select() method.
task('info', function () {
// ...
})->select('type=web|db,env=prod');
Labels in YAML
You can also define labels in a YAML recipe. For example:
hosts:
web.example.com:
remote_user: deployer
env:
environment: production
labels:
env: prod
But make sure to distinguish between the env and labels.env keys.
env is a configuration key, and labels.env is a label.
task('info', function () {
writeln('env:' . get('env')['environment'] . ' labels.env:' . get('labels')['env']);
});
Will print:
$ dep info env=prod
task info
[web.example.com] env:production labels.env:prod