在 Deployer 中定义一个主机,对于部署我们的应用程序来说是必须的。主机可以是一个远程主机、一个本地主机或 Amazon EC2 实例。每个主机包含一个主机名,一个应用环境,一个或多个角色,以及配置变量。
我们可以在 deploy.php 文件中使用 host 函数来定义主机。下面是主机定义的一个示例:
host('domain.com')
->stage('production')
->roles('app')
->set('deploy_path', '~/app');
主机 domain.com 具有 production 应用环境,一个 app 角色,以及一个配置变量 deploy_path = ~/app。
也可以通过使用 yaml 语法来描述主机。将其写入到一个 hosts.yml 文件:
domain.com:
stage: production
roles: app
deploy_path: ~/app
之后引入到 deploy.php:
inventory('hosts.yml');
确保我们的 ~/.ssh/config 文件包含,有关域名以及如何连接的相关信息。或者我们可以在 deploy.php 中指定这些相关信息。
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');
最佳实践是:在 ~/.ssh/config 配置主机的连接信息。这种方式允许不同用户以不同方式来连接。
按主机覆盖配置
例如,如果有一些全局配置,我们可以按主机覆盖它:
set('branch', 'master');
host('prod')
...
->set('branch', 'production');
现在,在 prod 主机上,branch 被设置为 production,而其他主机的 branch 扔为 master。
收集主机信息
在任意任务内,我们可以使用 get 函数来获取主机配置,以及使用 host 函数来获取主机对象。
task('...', function () {
$deployPath = get('deploy_path');
$host = host('domain.com');
$port = $host->getPort();
});
多主机
我们可以给 host 函数传递多个主机:
host('110.164.16.59', '110.164.16.34', '110.164.16.50', ...)
->stage('production')
...
如果我们的清单 hosts.yml 文件包含多个主机,我们可以以同样的方式来更改所有主机的配置。
inventory('hosts.yml')
->roles('app')
...
主机范围
如果我们有很多遵循相似模式的主机,可以像下面这样描述它们,而不是列出每个主机名:
host('www[01:50].domain.com');
对于数字模式,可以根据个人需要包含或删除前导零。范围是内包含。
我们也可以定义字母范围:
host('db[a:f].domain.com');
本地主机
如果我们需要在部署到远程主机之前构建发布版本,或者部署到 localhost 而非远程主机,我们需要定义 localhost:
localhost()
->stage('production')
->roles('test', 'build')
...
主机别名
如果想要部署应用程序到一台主机上,但是例如在不同目录下,我们可以描述 2 个主机别名:
host('domain.com/green', 'domain.com/blue')
->set('deploy_path', '~/{{ hostname }}')
...
对于 Deployer,这些主机是不同的主机,在部署到 2 台主机后,我们可以看到如下的目录结构:
~
domain.com
green
...
blue
...
一台主机多个应用环境
通常,对于 prod 和 beta 应用环境,我们只有一台服务器。我们可以轻松配置它们:
host('production')
->hostname('domain.com')
->set('deploy_path', '~/domain.com');
host('beta')
->hostname('domain.com')
->set('deploy_path', '~/beta.domain.com');
现在我们可以使用如下命令来部署:
dep deploy production
dep deploy beta
清单文件(inventory file - 机器列表配置,配置清单)
通过 inventory 函数,包含定义在清单文件 hosts.yml 中的主机:
inventory('hosts.yml');
下面是一个带有完整配置设置的清单文件 hosts.yml 示例:
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}}"
注意,与 deploy.php 文件中的 host 函数一样,最好省略 user、port、identityFile、forwordAgent等信息,而在 ~/.ssh/config 文件中使用它。
如果我们的清单文件包含许多相似的主机定义,我们可以使用 YAML 扩展语法:
.base: &base
roles: app
deploy_path: ~/app
...
www1.domain.com:
<<: *base
stage: production
beta1.domain.com:
<<: *base
stage: beta
...
以 '.' 开头的主机,称为隐藏主机,并且在该文件外部不可见。
为了在清单文件中定义 localhost,添加一个 local 键:
localhost:
local: true
roles: build
...
成为(become)
Deployer 允许我们成为,与登录主机的用户不同的另外一个用户(远程用户)。
host('domain.com')
->become('deployer')
...
Deployer 默认使用 sudo 权限升级方法。
注意:become 不能与 tty 运行选项一起使用。
接下来:部署流(https://deployer.org/docs/flow)