主機 (Hosts)
在Deployer中定義主機是部署應用所必需的. 它可以是遠程計算機、本地計算機或云主機實例. 每個主機都包含主機名(hostname、環境(stage)、一個或多個角色(roles)以及配置參數.
在 deploy.php 文件中使用 host 函數定義主機。以下是主機定義的示例:
host('domain.com')
->stage('production')
->roles('app')
->set('deploy_path', '~/app');
主機 domain.com 包含 production(生產) 環境(stage)定義, 一個 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 主機上分支設置成了 production, 其他主機默認是 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');
對于數字模式,可以根據需要包含或刪除補位的0.
您還可以定義字母范圍:
host('db[a:f].domain.com');
本地主機 (Localhost)
如果您需要在部署到遠程主機之前構建發行版,或者部署到localhost而不是remote, 您需要定義localhost:
localhost()
->stage('production')
->roles('test', 'build')
...
主機別名 (Host aliases)
如果要將應用程序部署到同一個主機(例如在不同的目錄中), 可以描述兩個主機別名:
host('domain.com/green', 'domain.com/blue')
->set('deploy_path', '~/{{hostname}}')
...
這對于Deployer, 相當于兩個主機, 部署后您將看到以下目錄結構:
~
└── domain.com
├── green
│ └── ...
└── blue
└── ...
同主機下多環境(stage)
有時, 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 函數引入主機清單文件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、 forwardAgent 相關參數, 并在文件~/.ssh/config中設置.
如果清單文件中定義了多個主機, 可以使用YAML的擴展語法:
.base: &base
roles: app
deploy_path: ~/app
...
www1.domain.com:
<<: *base
stage: production
beta1.domain.com:
<<: *base
stage: beta
...
以.(點)開頭的主機稱為隱藏主機,在該文件外不可見。
在清單文件中添加local聲明:
localhost:
local: true
roles: build
...
Become
Deployer允許您 '成為(become)' 另一個用戶,該用戶有別與登錄到計算機的用戶(遠程用戶).
host('domain.com')
->become('deployer')
...
默認情況下,Deployer使用 sudo 權限提升方法。
注意 這個become在
tty時無效.
下一節: 流水線.