主機(jī) (Hosts)
在Deployer中定義主機(jī)是部署應(yīng)用所必需的. 它可以是遠(yuǎn)程計(jì)算機(jī)、本地計(jì)算機(jī)或云主機(jī)實(shí)例. 每個(gè)主機(jī)都包含主機(jī)名(hostname、環(huán)境(stage)、一個(gè)或多個(gè)角色(roles)以及配置參數(shù).
在 deploy.php 文件中使用 host 函數(shù)定義主機(jī)。以下是主機(jī)定義的示例:
host('domain.com')
->stage('production')
->roles('app')
->set('deploy_path', '~/app');
主機(jī) domain.com 包含 production(生產(chǎn)) 環(huán)境(stage)定義, 一個(gè) app 角色以及一個(gè)配置參數(shù) deploy_path = ~/app.
主機(jī)還可以用yaml語法來描述. 把下列定義保存到文件 hosts.yml:
domain.com:
stage: production
roles: app
deploy_path: ~/app
然后在 deploy.php中引用:
inventory('hosts.yml');
確保~/.ssh/config文件包含有關(guān)連接信息.
或者您可以在 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');
最佳實(shí)踐 在文件
~/.ssh/config中保存相關(guān)連接信息. 這樣就允許不同的用戶以不同的方式進(jìn)行連接.
主機(jī)配置覆蓋
例如,如果您有一些全局配置, 則可以按主機(jī)覆蓋它:
set('branch', 'master');
host('prod')
...
->set('branch', 'production');
這樣在 prod 主機(jī)上分支設(shè)置成了 production, 其他主機(jī)默認(rèn)是 master.
獲取主機(jī)信息
在任何任務(wù)中, 可以通過get函數(shù)獲取主機(jī)配置, 通過host函數(shù)獲取主機(jī)對(duì)象.
task('...', function () {
$deployPath = get('deploy_path');
$host = host('domain.com');
$port = $host->getPort();
});
多主機(jī)
可以傳多個(gè)主機(jī)參數(shù)給host函數(shù):
host('110.164.16.59', '110.164.16.34', '110.164.16.50', ...)
->stage('production')
...
如果你主機(jī)列表文件hosts.yml包含多個(gè)主機(jī),您可以用相同的方式更改所有的配置.
inventory('hosts.yml')
->roles('app')
...
主機(jī)范圍
如果有許多主機(jī)遵循類似的模式,可以這樣描述它們,而不是列出每個(gè)主機(jī)名:
host('www[01:50].domain.com');
對(duì)于數(shù)字模式,可以根據(jù)需要包含或刪除補(bǔ)位的0.
您還可以定義字母范圍:
host('db[a:f].domain.com');
本地主機(jī) (Localhost)
如果您需要在部署到遠(yuǎn)程主機(jī)之前構(gòu)建發(fā)行版,或者部署到localhost而不是remote, 您需要定義localhost:
localhost()
->stage('production')
->roles('test', 'build')
...
主機(jī)別名 (Host aliases)
如果要將應(yīng)用程序部署到同一個(gè)主機(jī)(例如在不同的目錄中), 可以描述兩個(gè)主機(jī)別名:
host('domain.com/green', 'domain.com/blue')
->set('deploy_path', '~/{{hostname}}')
...
這對(duì)于Deployer, 相當(dāng)于兩個(gè)主機(jī), 部署后您將看到以下目錄結(jié)構(gòu):
~
└── domain.com
├── green
│ └── ...
└── blue
└── ...
同主機(jī)下多環(huán)境(stage)
有時(shí), prod和beta環(huán)境只有一臺(tái)服務(wù)器. 您可以輕松地配置它們:
host('production')
->hostname('domain.com')
->set('deploy_path', '~/domain.com');
host('beta')
->hostname('domain.com')
->set('deploy_path', '~/beta.domain.com');
可以使用以下命令進(jìn)行部署:
dep deploy production
dep deploy beta
主機(jī)清單文件
通過 inventory 函數(shù)引入主機(jī)清單文件hosts.yml:
inventory('hosts.yml');
下面是一個(gè)帶有全套配置的主機(jī)清單示例文件 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函數(shù)定義主機(jī)時(shí)的建議, 最好省略如: user、 port、 identityFile、 forwardAgent 相關(guān)參數(shù), 并在文件~/.ssh/config中設(shè)置.
如果清單文件中定義了多個(gè)主機(jī), 可以使用YAML的擴(kuò)展語法:
.base: &base
roles: app
deploy_path: ~/app
...
www1.domain.com:
<<: *base
stage: production
beta1.domain.com:
<<: *base
stage: beta
...
以.(點(diǎn))開頭的主機(jī)稱為隱藏主機(jī),在該文件外不可見。
在清單文件中添加local聲明:
localhost:
local: true
roles: build
...
Become
Deployer允許您 '成為(become)' 另一個(gè)用戶,該用戶有別與登錄到計(jì)算機(jī)的用戶(遠(yuǎn)程用戶).
host('domain.com')
->become('deployer')
...
默認(rèn)情況下,Deployer使用 sudo 權(quán)限提升方法。
注意 這個(gè)become在
tty時(shí)無效.
下一節(jié): 流水線.