デプロイメントへのESBインターフェースの書き込み(ESBチャネルドキュメントコードを含む)

コンテンツ1:ESBインターフェースのコンパイルディレクトリ構造

testxwパッケージの下:
clone_vmware.py:ESBカスタムインターフェイス書き込みファイル(コンポーネントモジュール)
ツールキットフォルダー:システムツールキットの場合、ストレージシステム構成および共通メソッド
ツールキットフォルダー:
configs.py:システム構成モジュールの場合、システム名を構成します。システムドメイン名アドレスなど
tools.py:システム共有メソッドモジュール用
ここに写真の説明を挿入

注意:1.SYSTEM_NAME代表系统名,ESB包名称也就是ESB的系统名的小写形式。
	 2.HOST代表系统环境的域名地址,也可以是环境所在的机器IP地址
コンテンツ2:ESBパッケージによって参照される依存パッケージ

xshellを介してESBインターフェイスプラットフォームが配置されているマシンを入力し、esb仮想環境を入力すると、図に示すように、プラットフォームESBインターフェイスによって参照される依存パッケージが表示されます。
ここに写真の説明を挿入
新しい依存関係が参照される場合、依存パッケージは次のようになります。 esb仮想環境では使用されないため、「pip install + dependent package and version」を渡して、インターフェース依存パッケージをインストールできます。依存パッケージ
があります。
ここに写真の説明を挿入
例:pip install pyvim == 0.0.21
ここに写真の説明を挿入
pip listを使用して
ここに写真の説明を挿入
、依存関係を表示します。 esb仮想環境のESBパッケージで導入された、ESBパッケージのインターフェースは通常この依存関係を使用できます。

コンテンツ3:ESBがシステムと登録チャネルを確立する

これを実現するには、次の2つの方法があります。

①:手动在平台建立系统和注册系统通道
②:通过py文件进行建立系统和注册通道

最初の方法:手動でシステムを確立し、プラットフォームにシステムチャネルを登録します①システムを
確立
ここに写真の説明を挿入
し、チャネルの確立完了します
ここに写真の説明を挿入
②チャネルを
ここに写真の説明を挿入
登録しますチャネルを登録します完了:
ここに写真の説明を挿入
2番目の方法:pyファイルを使用してシステムを確立し、チャネルを登録します
ここに写真の説明を挿入
①書き込みconfig.pyの内容:

# 文档分类
SYSTEM_DOC_CATEGORY = [
    {
        'label': u'默认分类', # 分类
        'priority': 100,
        'systems': ['TESTXW']
    }
]

# 系统
SYSTEMS = [
    {
        # 系统名称
        'name': 'TESTXW',
        # 系统标签
        'label': u'虚拟机管理测试',
        # 系统接口负责人
        'interface_admin': 'admin',
        # 执行类超时时长
        'execute_timeout': 100,
        # 查询类超时时长
        'query_timeout': 100,
        # 备注
        'remark': u'虚拟机管理测试'
    }
]

# 组件通道
CHANNELS = [
    ('/testxw/clone_vmware/', {
        # 对应组件代码
        'comp_codename': 'generic.testxw.clone_vmware'   # 代号编码
    })
]

②config.pyと記述したESBパッケージコードを、プラットフォームESBが配置されているマシンの「/ data / bkee / open_paas / esb / components / generic / apis」ディレクトリにコピーします(各社のディレクトリ環境に応じて適切に変更してください)。

# INSTALL_PATH 表示项目安装基准目录
配置⽂件地址:[install*path]/open*paas/esb/components/generic/apis/conf.py

③プラットフォームESBが配置されているマシンに入り、esb仮想環境に入り、次のようにコマンドを実行します。

python manage.py sync_api_docs # 相当于编译读API文档
python manage.py sync_system_and_channel_data [--force]  # 如果系统和通道都已经存在, force强制替换做出改变

ここに写真の説明を挿入
プラットフォームの確立ステータスの表示
システムの確立
ここに写真の説明を挿入
登録チャネル:
ここに写真の説明を挿入
API実行タイプを指定します

注意: 指定API执行类型(POST/GET)
API_TYPE_OP  执行API
API_TYPE_Q   查询API

以内容一为例,在clone_vmware.py加入
from common.constants import API_TYPE_OP

再加入这个变量

# 组件所属系统的系统名
sys_name = configs.SYSTEM_NAME
# 自定义系统和通道
api_type = API_TYPE_OP

具体的な数値は次のとおりです。
ここに写真の説明を挿入

コンテンツ4:ESBドキュメントをコンパイルし、ESBインターフェイスを再起動します

ESBドキュメントをコンパイルします。
プラットフォームESBが配置されているマシンを入力し、esb仮想環境を入力して、次のようにコマンドを実行します。

python manage.py sync_api_docs

ここに写真の説明を挿入
ESBインターフェースを再起動します。
プラットフォームESBが配置されているマシンに入り、open_paas仮想環境に入り、次のようにコマンドを実行します。

# INSTALL_PATH 表示项目安装基准目录
# 重启指令
workon open_paas
supervisorctl -c $INSTALL_PATH/etc/supervisor-open_paas.conf restart esb

例:supervisorctl -c /data/bkee/etc/supervisor-open_paas.conf restart esb
ここに写真の説明を挿入

注意:
① 平台ESB所在的机器都需要作此操作,ESB接口才能使用。
② 自定义通道,需要把conf.pyc文件删除掉,防止命令运行后,平台esb信息不生效,其实是运行了pyc文件信息。
内容5:注意点
① esb安装依赖包可以自己创建一个类似于requirements.txt的文件,存放要安装的依赖包信息,方便管理。
② 自定义系统和通道,生成系统和通道后,不要在平台进行修改系统和通道的任何相关信息,需要在conf.py文件内进行修改,
用命令进行变更,防止以后用命令自定义系统和通道时,把平台修改的信息覆盖掉。
conf.py 目录所在:
# INSTALL_PATH 表示项目安装基准目录
配置⽂件地址:[install*path]/open*paas/esb/components/generic/apis/conf.py
③ 如果paas所在的机器环境有多台,都需要进行包上传,再esb重启,不要之重启一部分机器,防止访问平台esb接口时成功时不成功。
④ ESB组件编写代码样例
# -*- coding: utf-8 -*-
import sys
from django import forms
from common.forms import BaseComponentForm, TypeCheckField
from components.component import Component
from common.constants import API_TYPE_Q
from toolkit.tools import VmManage
from .toolkit import configs

reload(sys)
sys.setdefaultencoding('utf8')


# API_TYPE_OP  执行API
# API_TYPE_Q   查询API

# class类名 是py文件名的大写驼峰
# 文件名字 clone_vmware.py  类名 CloneVmware
# 如果自定义系统和通道,apiLabel代表通道名称
class CloneVmware(Component):
    """
       apiLabel 克隆虚拟机测试 
       apiMethod  GET

       ### 功能描述

       克隆虚拟机测试

       ### 请求参数

       {
   
   { common_args_desc }}

       #### 接口参数

       | 字段  |  类型 | 必选   |  描述     |
       |-----------|------------|--------|------------|
       | ip  |  str    | 是  | vcenter主机ip  |
       | user |  str  | 是  | vcenter用户名  |
       | password |  str  | 是  | vcenter密码  |
       | port |  int | 是  | vcenter端口  |
       | datacenter_name |  str | 是  | 数据中心名称  |
       | vm_exi_ip |  str | 否  | 宿主机IP  |
       | vm_name |  str | 是  | 虚拟机名称  |
       | template_name |  str | 是  | 模版名称  |
       | datastore_name |  str | 否  | 存储名称  |
       | vm_folder |  str | 否  | 虚拟机文件夹名称  |
       | cpu_num |  int | 否  | cpu大小  |
       | memory |  int | 否  | 内存大小(单位:G)  |
       | vm_disk |  int | 否  | 追加硬盘大小(单位:G)  |
       | ip_data |  dict | 否  | 虚拟机指定ip参数  |

       ### ip_data

       | 字段  |  类型 | 必选   |  描述     |
       |-----------|------------|--------|------------|
       | vm_hostname |  str | 是  | 虚拟机主机名  |
       | vm_ip |  str | 是  | 虚拟机ip  |
       | vm_subnetmask |  str | 是  | 子网掩码  |
       | vm_gateway |  str | 是  | 网关  |
       | vm_dns |  str | 否  | DNS  |
       | vm_domain |  str | 否  | 域名  |


       ### 请求参数示例

       ```python
       {
           "bk_app_code": "esb_test",
           "bk_app_secret": "xxx",
           "bk_token": "xxx-xxx-xxx-xxx-xxx",
           "ip": '192.169.10.1',
           "user": '[email protected]',
           "password": '123456',
           "port": 443,
           "datacenter_name": 'xxxx',
           "vm_exi_ip": '192.169.1.10',
           "vm_name": 'xxxx',
           "template_name": 'xxxx',
           "datastore_name": 'xxxx',
           "vm_folder": 'xxxx',
           "cpu_num": 1,
           "memory": 1024,
           "vm_disk": 100,
           "ip_data": {
               "vm_ip": '192.168.1.1',
               "vm_subnetmask": '255.255.255.0',
               "vm_gateway": '192.168.1.0',
               "vm_dns": 'xxx',
               "vm_domain": 'xxx',
               "vm_hostname": 'xxx'
           }
       }
       ```

       ### 返回结果示例

       ```python
       {
           "result": true,
           "code": 0,
           "message": "克隆虚拟机成功",
           "data": {}
       }
       ```
    """
    # 组件所属系统的系统名
    sys_name = configs.SYSTEM_NAME
    # 自定义系统和通道
    api_type = API_TYPE_Q

    class Form(BaseComponentForm):
		# form验证 required 的值是false代表不必传或者true代表必穿
		# form的类型  CharField、IntegerField、TypeCheckField(promise_type=dict、或者promise_type=list)、
		# DefaultBooleanField、ListField,也可以用Django的form其他的类型
        ip = forms.CharField(label=u'vcenter主机ip', required=True)
        user = forms.CharField(label=u'vcenter用户名', required=True)
        password = forms.CharField(label=u'vcenter密码', required=True)
        port = forms.IntegerField(label=u'vcenter端口', required=True)
        datacenter_name = forms.CharField(label=u'数据中心名称', required=True)
        vm_name = forms.CharField(label=u'虚拟机名称', required=True)
        vm_exi_ip = forms.CharField(label=u'宿主机IP', required=True)
        template_name = forms.CharField(label=u'模版名称', required=True)
        datastore_name = forms.CharField(label=u'存储名称', required=False)
        vm_folder = forms.CharField(label=u'虚拟机文件夹名称', required=False)
        cpu_num = forms.IntegerField(label=u'cpu大小', required=False)
        memory = forms.IntegerField(label=u'内存大小', required=False)
        vm_disk = forms.IntegerField(label=u'追加硬盘大小', required=False)
        ip_data = TypeCheckField(label=u'虚拟机指定ip数据', promise_type=dict, required=False)

        # clean方法返回的数据可通过组件的form_data属性获取
        # 进行数据清洗
        def clean(self):
            return self.get_cleaned_data_when_exist(
                keys=['ip', 'user', 'password', 'port',
                      'datacenter_name', 'vm_name',
                      'template_name', 'datastore_name', 'vm_folder', 'vm_exi_ip',
                      'cpu_num', 'memory', 'vm_disk', 'ip_data'])

    # 组件处理入口,
    def handle(self):
        data = self.form_data # 获取form表单的数据
		# 必传取值方式
        ip = data['ip']
        user = data['user']
        password = data['password']
        port = data['port']
        datacenter_name = data['datacenter_name']
        vm_name = data['vm_name']
        template_name = data['template_name']
        # 不必传取值方式
        datastore_name = data.get('datastore_name')
        vm_folder = data.get('vm_folder')
        vm_exi_ip = data.get('vm_exi_ip')
        cpu_num = data.get('cpu_num')
        memory = data.get('memory')
        vm_disk = data.get('vm_disk')
        ip_data = data.get('ip_data')
        vm_ip = None
        vm_subnetmask = None
        vm_gateway = None
        vm_dns = None
        vm_domain = None
        vm_hostname = None
        ip_result = True

        response = {}
        try:
            vm = VmManage(host=ip,
                          user=user,
                          password=password,
                          port=port, ssl=None)

            if ip_data:
                vm_ip = ip_data.get('vm_ip', None)
                vm_subnetmask = ip_data.get('vm_subnetmask', None)
                vm_gateway = ip_data.get('vm_gateway', None)
                vm_dns = ip_data.get('vm_gateway', None)
                vm_domain = ip_data.get('vm_domain', None)
                vm_hostname = ip_data.get('vm_hostname', None)
                if vm_ip is None or vm_ip == '':
                    response['message'] = '虚拟机IP [vm_ip] This field is required.'
                    ip_result = False
                elif vm_subnetmask is None or vm_subnetmask == '':
                    response['message'] = '子网掩码 [vm_subnetmask] This field is required.'
                    ip_result = False
                elif vm_gateway is None or vm_gateway is '':
                    response['message'] = '网关 [vm_gateway] This field is required.'
                    ip_result = False
                elif vm_hostname is None or vm_hostname is '':
                    response['message'] = '虚拟机主机名 [vm_hostname] This field is required.'
                    ip_result = False
                else:
                    ip_result = True
            if ip_result:
                data = vm.clone(
                    template_name=template_name,
                    vm_name=vm_name,
                    datacenter_name=datacenter_name,
                    datastore_name=datastore_name,
                    vm_folder=vm_folder,
                    vm_exi_ip=vm_exi_ip,
                    cup_num=cpu_num,
                    memory=memory,
                    vm_disk=vm_disk,
                    vm_ip=vm_ip,
                    vm_subnetmask=vm_subnetmask,
                    vm_gateway=vm_gateway,
                    vm_dns=vm_dns,
                    vm_domain=vm_domain,
                    vm_hostname=vm_hostname
                )
                response = data
                if data['result']:
                    response['code'] = 0
            else:
                response['code'] = 1
                response['result'] = False
        except Exception, e:
            response = {
                'code': 500,
                'message': e.message,
                'result': False,
                'data': {}
            }
        # 返回信息数据
        self.response.payload = response

コンテンツ6:中央制御マシンからPAASマシン環境に入る

最初に中央制御マシンに接続し、
ここに写真の説明を挿入
paasを使用して最初のマシンに入ります
ここに写真の説明を挿入

注意:
① PAAS_IP   有多台paas时,从PAAS_IP0开始 代表机器台数从第一台开始 ,第二台就是PAAS_IP1,类似于数组。
② 进入到paas机器后,如果要切换到其他的中控机下的机器,一定要exit退出当前所在的paas环境

ここに写真の説明を挿入

おすすめ

転載: blog.csdn.net/qq_42631707/article/details/100893551