Defining a host in Deployer is necessary to deploy your application. It can be a remote machine, a local machine or Amazon EC2 instances. Each host contains a hostname, a stage, one or more roles and configuration parameters.
You can define hosts with the host
function in deploy.php
file. Here is an example of a host definition:
host('domain.com')
->stage('production')
->roles('app')
->set('deploy_path', '~/app');
Host domain.com has stage production
, one role app
and a configuration parameter deploy_path
= ~/app
.
Hosts can also be described by using yaml syntax. Write this in a hosts.yml
file:
domain.com:
stage: production
roles: app
deploy_path: ~/app
Then to deploy.php
:
inventory('hosts.yml');
Make sure that your ~/.ssh/config
file contains information about your domains and how to connect.
Or you can specify that information in the deploy.php
file itself.
host('domain.com')
->user('name')
->port(22)
->configFile('~/.ssh/config')
->identityFile('~/.ssh/id_rsa')
->forwardAgent(true)
->multiplexing(true)
->addSshOption('UserKnownHostsFile', '/dev/null')
->addSshOption('StrictHostKeyChecking', 'no');
Best practice is to leave connecting information for hosts in the
~/.ssh/config
file. That way you allow different users to connect in different ways.
For example, if you have some global configuration you can override it per host:
set('branch', 'master');
host('prod')
...
->set('branch', 'production');
Now onthe prod host the branch is set to production
, on others to master
.
Inside any task, you can get host config with the get
function, and the host object with the host
function.
task('...', function () {
$deployPath = get('deploy_path');
$host = host('domain.com');
$port = $host->getPort();
});
You can pass multiple hosts to the host
function:
host('110.164.16.59', '110.164.16.34', '110.164.16.50', ...)
->stage('production')
...
If your inventory hosts.yml
file contains multiple, you can change the config for all of them in the same way.
inventory('hosts.yml')
->roles('app')
...
If you have a lot of hosts following similar patterns, you can describe them like this rather than listing each hostname:
host('www[01:50].domain.com');
For numeric patterns, leading zeros can be included or removed, as desired. Ranges are inclusive.
You can also define alphabetic ranges:
host('db[a:f].domain.com');
If you need to build your release before deploying on a remote machine, or deploy to localhost instead of remote, you need to define localhost:
localhost()
->stage('production')
->roles('test', 'build')
...
If you want to deploy an app to one host, but for example in different directories, you can describe two host aliases:
host('domain.com/green', 'domain.com/blue')
->set('deploy_path', '~/{{hostname}}')
...
For Deployer, those hosts are different ones, and after deploying to both hosts you will see this directory structure:
~
└── domain.com
├── green
│ └── ...
└── blue
└── ...
Often you have only one server for prod and beta stages. You can easily configure them:
host('production')
->hostname('domain.com')
->set('deploy_path', '~/domain.com');
host('beta')
->hostname('domain.com')
->set('deploy_path', '~/beta.domain.com');
Now you can deploy with these commands:
dep deploy production
dep deploy beta
Include hosts defined in inventory files hosts.yml
by inventory
function:
inventory('hosts.yml');
Here an example of an inventory file hosts.yml
with the full set of configuration settings
domain.com:
hostname: domain.com
user: name
port: 22
configFile: ~/.ssh/config
identityFile: ~/.ssh/id_rsa
forwardAgent: true
multiplexing: true
sshOptions:
UserKnownHostsFile: /dev/null
StrictHostKeyChecking: no
stage: production
roles:
- app
- db
deploy_path: ~/app
extra_param: "foo {{hostname}}"
Note that, as with the
host
function in the deploy.php file, it's better to omit information such as user, port, identityFile, forwardAgent and use it from the~/.ssh/config
file instead.
If your inventory file contains many similar host definitions, you can use YAML extend syntax:
.base: &base
roles: app
deploy_path: ~/app
...
www1.domain.com:
<<: *base
stage: production
beta1.domain.com:
<<: *base
stage: beta
...
Hosts that start with .
(dot) are called hidden and are not visible outside that file.
To define localhost in inventory files add a local
key:
localhost:
local: true
roles: build
...
Deployer allows you to ‘become’ another user, different from the user that logged into the machine (remote user).
host('domain.com')
->become('deployer')
...
Deployer uses sudo
privilege escalation method by default.
Note that become doesn't work with
tty
run option.
Next: deployment flow.