当前位置: 代码迷 >> 综合 >> Laravel Envoy - SSH远程任务执行工具的配置与使用
  详细解决方案

Laravel Envoy - SSH远程任务执行工具的配置与使用

热度:85   发布时间:2023-12-09 11:23:04.0

Laravel Envoy - SSH远程任务执行工具的配置与使用

目前只支持MMac和Linux上运行

我们在任何一台服务器上安装 envoy 即可,由这台服务器想其他服务器发起连接,发送指令。

// 安装composercurl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
su vagrant// 国内镜像
composer config -g repo.packagist composer https://packagist.phpcomposer.com//安装Laravel安装器,此安装器是用来安装laravel程序,已经装过了可忽略
composer global require "laravel/installer"// 安装laravel/envoy
composer global require "laravel/envoy"
// 使用global安装的插件是放在composer下的vendor中,此处是在 composer\vendor\laravel下。并且在
// composer\vendor\bin 下多出了 envoy 和 envoy.bat 文件,实际上他们都指向 composer\vendor\laravel\envoy\bin\envoy文件。// 将 composer/vendor/bin 放到环境变量,这样就可以使用bin里面的程序了。
vi /etc/profile
export PATH=$PATH:/home/vagrant/.config/composer/vendor/bin// 使其生效 
source /etc/profile

github地址 https://github.com/laravel/envoy

安装完毕

envoy --version
Laravel Envoy 1.6.4su root

在使用之前首先配置各个服务器之间的ssh公钥模式的认证设置,
我们知道ssh默认是使用用户名密码来登录的,这样做比较麻烦,因此我们需要使用免密登录的模式,也就是使用公钥密钥对的形式。
另外,本服务器是通过ssh客户端去连接目标服务器的ssh服务,所以目标服务器必须开启sshd服务,默认是开启的。

假设要登录的机器为192.168.2.201,当前登录的机器为192.168.2.200。
首先在200的机器上生成密钥(如果已经生成可以跳过):
ssh-keygen -t rsa
然后在将生成的公钥(以 .pub 为后缀的)复制到机器201上的 /root/.ssh/authorized_keys中,
使用如下命令:
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.2.201
root为需要登录到机器 201 上的身份,可以替换成需要的用户名。目标服务器ssh登录如果不是22端口,
那么需要增加 -p 参数。
此过程会提示你输入 root@192.168.2.201 的登录密码才能通过。
如果有多台机器,则都要复制过去。但是在201上却没有找到 /root/.ssh 目录,我试图 mkdir .ssh,却提示目录已存在,看来是隐藏了,
使用 ls -a ,于是在 .ssh 下找到 authorized_keys 文件,证明公钥传输成功了。 

如果没设置好ssh密钥,或者你设置的用户名和要登录的用户名不一致的话,那么你每次执行 envoy run deploy 的时候,都提示你输入密码,会比较麻烦。

简单使用
1.初始化并创建 deploy 任务
首先, 在你的项目跟目录下,或者 /home/vagrant/.config/composer 下, 执行以下命令进行初始化
envoy init root@192.168.2.201
上面的命令会在此文件夹下生成一个 Envoy.blade.php 的文件。
我们先做个简单测试

@servers(['web' => 'root@192.168.2.201'])@task('deploy')cd /mydata/dataecho "outer info" >> outer.log
@endtask

然后运行命令:envoy run deploy
于是我们去到 192.168.2.201 ,已经写入成功了,到此部署完成。

讲到这里,我们就知道 envoy 工具集成了ssh工具,还包含其他的功能;并且,虽然它是为Laravel写的扩展,但是最终还是经过ssh来实现控制的,所以,我们可以用它来维护集群中各个服务器,比如代码发布与更新,让它们同时执行一个操作等,就不用逐个进入服务器,然后执行命令,简直不要太爽。

并且,envoy 会将目标服务器的返回信息逐行显示,例如:

@servers(['web' => 'root@192.168.2.201'])@task('deploy')cd /mydata/datacat outer.log
@endtask

因为之前已经写入了信息,所以 envoy run deploy 会输出

[root@192.168.2.201]: outer info
[root@192.168.2.201]: outer info
[root@192.168.2.201]: outer info
[root@192.168.2.201]: outer info
[root@192.168.2.201]: outer info
[root@192.168.2.201]: outer info
[root@192.168.2.201]: outer info

是以逐行的形式输出的。

Envoy.blade.php的解释:

@servers(['web' => 'root@192.168.2.201'])@task('deploy')cd /mydata/datasvn up
@endtask

@servers 的数组被定义在文件的起始位置处,让你在声明任务时可以在 on 选项里参照使用这些服务器。
@task声明里,你可以放置当任务运行时想要在远程服务器运行的 Bash 命令。

要知道我们使用ssh命令来登录远程机器的命令就是:
ssh vagrant@192.168.2.201 -p22
所以如果目标服务器的ssh端口不是22,我们可以在servers配置端口

@servers(['web' => 'root@192.168.2.201 -p2222'])

如果连上之后就进入目标服务器,退回到本机的命令
logout 192.168.2.201

高级使用
你可以通过指定服务器的 IP 地址为 127.0.0.1 来执行本地任务:(目前,Envoy 只支持 Mac和Linux环境 )

@servers(['localhost' => 'root@127.0.0.1'])

任务启动
有时,你可能想在任务启动前运行一些 PHP 代码。这时可以使用 @setup 区块在 Envoy 文件中声明变量以及运行普通的 PHP 程序:

@setup$now = new DateTime();$environment = isset($env) ? $env : "testing";
@endsetup

如果你想在任务执行前引入其他 PHP 文件,可以直接在 Envoy.blade.php 文件起始位置使用 @include :

@include('vendor/autoload.php')@task('foo')# ...
@endtask

任务变量
如果需要的话,你也可以通过命令行选项来传递变量至 Envoy 文件,以便自定义你的任务:

envoy run deploy --branch=master
你可以通过 Blade 的「echo」语法使用这些选项, 当然也能在任务里用「if」 和循环操作。举例来说,我们在执行 git pull 命令前,先检查 $branch 变量是否存在:

@servers(['web' => 'root@192.168.2.201'])@task('deploy', ['on' => 'web'])cd site@if ($branch)git pull origin {
    {
     $branch }}@endifphp artisan migrate
@endtask

任务宏
任务宏通过一个统一的、便捷的名字来划分一组任务,来让你把小而专的子任务合并到大的任务里。比如说,一个名为deploy 的任务宏可以在它定义范围内列出子任务名字 git 和 composer 来运行各自对应的任务:

@servers(['web' => 'root@192.168.2.201'])@story('deploy')gitcomposer
@endstory@task('git')git pull origin master
@endtask@task('composer')composer install
@endtask

当 story 写好后,像运行普通任务一样运行它就好了:

envoy run deploy

多个服务器
你可以在多个服务器上运行任务。首先,增加额外的服务器至你的 @servers 声明,每个服务器必须分配一个唯一的名称。一旦你定义好其它服务器,就能够在任务声明的 on 数组中列出这些服务器:

@servers(['web-1' => 'root@192.168.2.201', 'web-2' => 'root@192.168.2.202'])@task('deploy', ['on' => ['web-1', 'web-2']])cd sitegit pull origin {
    {
     $branch }}php artisan migrate
@endtask

并行运行
默认情况下,任务会按照顺序在每个服务器上运行。这意味着任务会在第一个服务器运行完后才跳到第二个。如果你想在多个服务器上并行运行任务,只需简单的在任务声明里加上 parallel 选项即可:

@servers(['web-1' => 'root@192.168.2.201', 'web-2' => 'root@192.168.2.202'])@task('deploy', ['on' => ['web-1', 'web-2'], 'parallel' => true])cd sitegit pull origin {
    {
     $branch }}php artisan migrate
@endtask

运行任务
要想运行一个在 Envoy.blade.php 文件中定义好的任务或者宏,就执行 Envoy 的 run 命令,并将这个任务的名字传递给它。Envoy 会去执行这个任务并且把任务执行过程中的输出给打印出来:

envoy run task

任务确认
如果你想要在运行任务之前进行提示确认,则可以增加 confirm 命令到任务声明。这个选项对于破坏性的操作来说是相当有用的

@task('deploy', ['on' => 'web', 'confirm' => true])cd sitegit pull origin {
    {
     $branch }}php artisan migrate
@endtask