コンテンツ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环境