benmag/laravel-rancher

此包已被废弃,不再维护。未建议替代包。

Laravel 的 Rancher API 封装器

1.0.2 2017-12-13 02:11 UTC

This package is auto-updated.

Last update: 2023-12-11 19:14:03 UTC


README

Laravel 的 Rancher API 封装器。此包提供了一个简单的接口来访问 Rancher 的(出色的)API。使用简洁的 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");

在栈中停用服务

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

删除一个栈

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端点覆盖

Rancher API非常广泛。我已经尝试覆盖所有关键端点,但有几个端点目前尚未实现。

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

许可证

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