th0rn0/laravel-rancher

此包已被弃用且不再维护。未建议替换包。

Rancher API 的 Laravel 6 包装器

1.0.7 2019-12-28 16:55 UTC

This package is not auto-updated.

Last update: 2023-11-26 11:20:28 UTC


README

Rancher API 的 Laravel 包装器。此包提供了一个简单的接口来访问 Rancher 的 (出色的) API。使用 expressive,clean PHP 来编排您的私有容器服务。

安装

Laravel Rancher 使用 composer 使安装变得简单。

通过 composer 安装

composer require benmag/laravel-rancher

注册服务提供者 将 Laravel Rancher 服务提供者添加到您的 config/app.php 文件中的 providers 键

'providers' => [
    // ... other providers
    Benmag\Rancher\RancherServiceProvider::class,
]

Rancher 门面别名 然后将 Rancher 门面添加到您的 aliases 键: 'Rancher' => Benmag\Rancher\Facades\Rancher::class

配置

配置可以通过您的 .env 文件完成。

RANCHER_BASE_URL=https://:8080/v1/
RANCHER_ACCESS_KEY=xxxxxxx
RANCHER_SECRET_KEY=xxxxxxx

您还可以将配置文件发布到 config/rancher.php 进行编辑: php artisan vendor:publish --provider="Benmag\Rancher\RancherServiceProvider"

注意

确保您已启用身份验证。如果没有,您可能会遇到一些奇怪的行为。我仍需要研究以更协调的方式更改环境/项目,但您应该能够实例化一个新的客户端实例。

使用

Laravel Rancher 非常易于使用。

介绍

已经配置好了一切,只是想看看它的实际应用?请查看下面的示例代码。

<?php

namespace App\Http\Controllers;

use Rancher;
use App\Http\Controllers\Controller;

class HostController extends Controller
{
    public function index()
    {
        return response()->json(Rancher::host()->all());
    }
}

主机

检索所有主机

Rancher::host()->all();

通过 ID 检索主机

Rancher::host()->get("1h1");

通过 ID 激活主机

Rancher::host()->activate("1h1");

通过 ID 撤离主机

Rancher::host()->evacuate("1h1");

通过 ID 移除主机

Rancher::host()->remove("1h1");

容器

检索所有容器

Rancher::container()->all();

通过 ID 检索容器

Rancher::container()->get("1i140");

创建容器

use Rancher;
use Benmag\Rancher\Factories\Entity\Container;

$newContainer = new Container([
    'name' => 'HelloWorld',
    'description' => 'New container created via Laravel Rancher',
    'imageUuid' => "docker:ubuntu:14.04.3",
]);

Rancher::container()->create($newContainer);

堆栈

创建堆栈

use Rancher;
use Benmag\Rancher\Factories\Entity\Stack;

$newStack = new Stack([
    'name' => "my-stack",
    'description' => 'An example stack',
    'dockerCompose' => "odoo:\n  image: odoo\n  ports:\n    - \"8069:8069\"\n  links:\n    - db\ndb:\n  image: postgres\n  environment:\n    - POSTGRES_USER=odoo\n    - POSTGRES_PASSWORD=odoo\n",
    'rancherCompose' => ".catalog:\n  name: \"Odoo\"\n  version: \"0.1-educaas\"\n  description: \"ERP management powered by Odoo\"\n  uuid: odoo-0\n  questions:\n\nodoo:\n",
    'externalId' => "catalog://community:odoo:0",
    'startOnCreate' => true
]);

Rancher::stack()->project('1a8')->create($newStack);

在创建堆栈时,您需要告诉 Rancher 您想在哪个项目中创建它。

更新堆栈

use Rancher;
use Benmag\Rancher\Factories\Entity\Stack;

$updatedStack = new Stack([
    'name' => "my-updated-stack",
    'description' => 'An updated stack',
]);

Rancher::stack()->update("1st312", $updatedStack);

在堆栈中激活服务

Rancher::stack()->activateServices("1st312");

在Stack中停用服务

Rancher::stack()->deactivateServices("1st312");

删除Stack

Rancher::stack()->delete("1st312");

项目

创建新项目

use Rancher;
use Benmag\Rancher\Factories\Entity\Project;

$project = new Project([
    'name' => 'Hello World',
]);

Rancher::project()->create($project);

激活项目

Rancher::project()->activate("1a8");

停用项目

Rancher::project()->deactivate("1a8");

删除项目

Rancher::project()->delete("1a8");

服务

创建服务

use Rancher; 
use Benmag\Rancher\Factories\Entity\Service;

$newService = new Service([
    'name' => 'newService',
    'stackId' => '1st312',
    'launchConfig' => [
        'stdinOpen' => true,
        'imageUuid' => 'docker:ubuntu:14.04.3'
    ],
]);

Rancher::service()->project("1a8")->create($newService);

更新服务

use Rancher;
use Benmag\Rancher\Factories\Entity\Service;

$updatedService = new Service([
    "description" => "I was updated",
    "name" => "db",
    "scale" => 1
]);

Rancher::service()->project("1a8")->update("1s23", $updatedService);

添加服务链接

您还可以将单个服务链接添加到服务中。您可以使用name值指定链接别名。

use Rancher;

$serviceLink = ['name' => 'redis', 'serviceId' => '1s25'];

Rancher::service()->addServiceLink("1s24", $serviceLink);

设置服务链接

setServiceLinks方法将覆盖该服务的所有链接。

use Rancher;

$serviceLinks = [
    ['name' => 'db', 'serviceId' => '1s23']
];

Rancher::service()->setServiceLinks("1s24", $serviceLinks);

移除服务链接

也可以移除单个服务链接。

use Rancher;

$remove = ['name' => 'db', 'serviceId' => '1s23'];

Rancher::service()->removeServiceLink("1s24", $remove);

升级服务

use Rancher;

$serviceUpgrade = [
    'inServiceStrategy' => [
        'batchSize' => 1,
        'intervalMillis' => 2000,
        'startFirst' => false,
        'launchConfig' => [
            'imageUuid' => 'docker:postgres',
            'startOnCreate' => true,
        ]
    ]
];

Rancher::service()->upgrade("1s23", $serviceUpgrade);

完成服务升级

Rancher::service()->finishUpgrade("1s23");

取消服务升级

Rancher::service()->cancelUpgrade("1s23");

回滚升级

Rancher::service()->rollback("1s23");

取消回滚

Rancher::service()->cancelRollback("1s23");

负载均衡服务

创建负载均衡器

use Rancher; 
use Benmag\Rancher\Factories\Entity\LoadBalancerService;

$newLb = new LoadBalancerService([
    'name' => 'lb',
    'stackId' => '1st316',
    'launchConfig' => [
        'ports' => [
            "80",
            "8080"
        ],
        'imageUuid' => 'docker:rancher/lb-service-haproxy:v0.7.5'
    ],
    'lbConfig' => [
        'portRules' => [
            [
                'hostname' => '',
                'serviceId' => "1s583",
                'sourcePort' => 8080,
                'targetPort' => 80,
                'type' => 'portRule'
            ]
        ]
    ]
]);

Rancher::loadBalancerService()->project('1a8')->create($newLb);

更新负载均衡器

use Rancher;
use Benmag\Rancher\Factories\Entity\LoadBalancerService;

$updatedLb = new LoadBalancerService([
    'name' => 'lb-updated',
    'stackId' => '1st316',
    'launchConfig' => [
        'ports' => [
            "80",
        ],
        'imageUuid' => 'docker:rancher/lb-service-haproxy:v0.7.5'
    ],
    'lbConfig' => [
        'portRules' => [
            [
                'hostname' => '',
                'protocol' => 'http',
                'serviceId' => "1s583",
                'sourcePort' => 80,
                'targetPort' => 80,
                'type' => 'portRule'
            ]
        ]
    ],
]);

Rancher::loadBalancerService()->project("1a8")->update("1s26", $updatedLb);

将服务链接添加到负载均衡器

您还可以将单个服务链接添加到服务中。您可以使用name值指定链接别名。

use Rancher;

$serviceLink = [
    'serviceId' => '1s10', 
    'ports' => [
        "hello.world.domain.com=80"
    ]
];

Rancher::loadBalancerService()->addServiceLink("1s27", $serviceLink);

为负载均衡器设置服务链接

setServiceLinks方法将覆盖该负载均衡器的所有链接。

use Rancher;

$serviceLinks = [
    [
        'serviceId' => '1s23',
        'ports' => [
            "hello.world.example.com=80",
        ]
    ]
];

Rancher::loadBalancerService()->setServiceLinks("1s24", $serviceLinks);

从负载均衡器中移除服务链接

也可以移除单个服务链接。

use Rancher;

$remove = ['serviceId' => '1s23'];

Rancher::loadBalancerService()->removeServiceLink("1s24", $remove);

机器

[待办]

注册表

添加注册表

use Rancher; 
use Benmag\Rancher\Factories\Entity\Registry;

$registry = new Registry([
    'serverAddress' => "registry.example.com",
]);

$registryResponse = Rancher::registry()->project("1a8")->create($registry));

激活注册表

use Rancher; 

Rancher::registry()->activate($id);

停用注册表

use Rancher; 

Rancher::registry()->deactivate($id);

注册表凭证

添加注册表凭证

use Rancher; 
use Benmag\Rancher\Factories\Entity\RegistryCredential;

$cred = new RancherRegistryCredential([
    'registryId' => "1sp120",
    'email' => "email@example.com",
    'publicValue' => "username",
    'secretValue' => "password"
]);

Rancher::registryCredential()->create($cred);

注册令牌

创建注册令牌

use Rancher; 
use Benmag\Rancher\Factories\Entity\RegistrationToken;

Rancher::registrationToken()->create(new RegistrationToken([
    'accountId' => 'rancerProjectId'
]));

检索注册令牌

use Rancher; 

Rancher::registrationToken()->filter(['state' => 'active'])->get()

服务消费映射

[待办]

证书

获取证书

use Rancher; 
Rancher::certificate()->all();

创建证书

use Rancher; 
use Benmag\Rancher\Factories\Entity\Certificate;

$cert = new Certificate([
    'name' => 'My Cert', 
    'description' => 'Hello World',
    'key' => 'Your Private Key', 
    'cert' => 'Your Certificate',
    'certChain' => 'Your Chain Certs',
]);

Rancher::certificate()->create($cert);

删除证书

use Rancher; 
Rancher::certificate()->delete($id);

查询构建

该包装器还提供了一个方便的方式来构建较为复杂的Rancher API请求。以下方法返回实例,以便您可以在需要时将更多约束添加到请求中。

过滤器

Rancher允许您对API资源指定过滤器。通过键设置要应用的过滤器类型。以下是一个所有过滤器选项的示例。

$params = [
    'name' => 'Hello World', // name = "Hello World"
    'name_ne' => 'Hello World', // name != "Hello World"
    'name_notnull' => null, // name is not null
    'description_null' => null, // description is null
    'description_notlike' => 'Hello World', // description NOT LIKE '%Hello World%'
    'description_like' => 'Hello World', // description LIKE '%Hello World%'
    'name_prefix' => 'Hello', // name LIKE 'Hello%'
];

Rancher::stack()->filter($params)->get();

记住:要更改您要过滤的字段,更改键,例如 ['state' => 'active']['description_notnull' => null]

包含

使用Rancher,您可以通过include参数指定应与请求急切加载的附加端点。此功能通过with方法公开。

Rancher::service()->with(['instances'])->get("1s724");

字段

为实体动态公开定义来自API的附加字段。您可以使用此功能启用实体类未明确定义的访问属性。

Rancher::service()->fields(['uuid'])->get("1s724");

作用域

默认情况下,Rancher的作用域是您的凭证可以访问的默认项目。此连锁方法允许您轻松地将作用域更改为凭证可以动态访问的另一个项目。

Rancher::host()->scope('1a3302')->all();

当然,您可以使用setClient方法将客户端更改为全新的内容,但如果您想更改

现在一起来看

这是一个简单的示例,说明您如何使用方法链来构建复杂的Rancher API请求。

Rancher::services()
            ->scope('1a3302')
            ->with(['instances'])
            ->filter(['environmentId' => "1e512"])
            ->fields(['uuid'])
            ->get()

异常处理

Rancher API将根据需要返回错误。我仍在寻找处理这些异常的更优雅的方式... 目前,只需将您的调用包裹在try/catch块中即可。

try {
    
    Rancher::host()->deactivate("1h1");
    
} catch(ClientException $e) {
    $response = $e->getResponse();
    $responseBodyAsString = $response->getBody()->getContents();
    echo $responseBodyAsString;
}

Rancher API端点覆盖

牧场的API功能丰富。我已经尝试涵盖所有关键端点,但仍有几个端点目前尚未实现。

  • 主机 [5/8]
    • 删除
    • dockersocket
    • 清除
  • 容器 [7/18]
    • 更新
    • 删除
    • 分配
    • 控制台
    • 解除分配
    • 执行
    • 日志
    • 迁移
    • 设置标签
    • 更新健康状态
    • 更新不健康状态
  • 环境 [6/14]
    • 添加输出
    • 取消回滚
    • 取消升级
    • 错误
    • 导出配置
    • 完成升级
    • 回滚
    • 升级
  • 项目 [5/8]
    • 清除
    • 恢复
    • 设置成员
  • 服务 [13/14]
    • 移除
  • 负载均衡服务 [7/13]
    • 取消回滚
    • 取消升级
    • 完成升级
    • 移除
    • 回滚
    • 升级
  • 账户 [0]
  • API密钥 [0]
  • 证书 [0]
  • DNS服务 [0]
  • 外部服务 [0]
  • 身份 [0]
  • 机器 [0]
  • 挂载 [0]
  • 项目成员 [0]
  • 存储池 [0]
  • [0]

许可证

MIT许可证(MIT)。请参阅许可证文件以获取更多信息。