Contenido 1: estructura del directorio de compilación de la interfaz ESB
En el paquete testxw:
clone_vmware.py: archivo de escritura de la interfaz personalizada ESB (módulo de componente)
Carpeta del kit de herramientas: para el kit de herramientas del sistema, carpeta del kit de herramientas de configuración del sistema de almacenamiento y método común
:
configs.py: para el módulo de configuración del sistema, configure el nombre del sistema, Dirección de nombre de dominio del sistema, etc.
tools.py: para el módulo de método compartido del sistema
注意:1.SYSTEM_NAME代表系统名,ESB包名称也就是ESB的系统名的小写形式。
2.HOST代表系统环境的域名地址,也可以是环境所在的机器IP地址
Contenido dos: paquetes dependientes referenciados por paquetes ESB
Ingrese a la máquina donde se encuentra la plataforma de la interfaz ESB a través de xshell, ingrese al entorno virtual esb y podrá ver el paquete dependiente al que hace referencia la interfaz de la plataforma ESB, como se muestra en la figura:
Si se hace referencia a una nueva dependencia, el paquete dependiente es no se utiliza en el entorno virtual esb, puede pasar " pip install + paquete y versión dependientes " para instalar el paquete dependiente de la interfaz.
Ahora hay paquetes dependientes: Por
ejemplo: pip install pyvim == 0.0.21
pip list para ver
las dependencias introducida en el paquete ESB en el entorno virtual esb, la interfaz en el paquete ESB se puede Utilizar esta dependencia normalmente.
Contenido 3: ESB establece el sistema y el canal de registro
Hay dos formas de lograrlo:
①:手动在平台建立系统和注册系统通道
②:通过py文件进行建立系统和注册通道
El primer método: establecer manualmente el sistema y registrar el canal del sistema en la plataforma ①Establecer el sistema y completar el
establecimiento
del canal :
②Registrar el canal
Registrar el canal completo:
El segundo método: usar el archivo py para establecer el sistema y registrar el canal
①Escribir el contenido de 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' # 代号编码
})
]
② Copiar config.py y el código del paquete ESB escrito en el directorio " / data / bkee / open_paas / esb / components / generic / apis " de la máquina donde se encuentra la plataforma ESB (modificar adecuadamente según el entorno de directorio de cada empresa)
# INSTALL_PATH 表示项目安装基准目录
配置⽂件地址:[install*path]/open*paas/esb/components/generic/apis/conf.py
③ Ingrese a la máquina donde se encuentra la plataforma ESB, ingrese al entorno virtual esb y ejecute el comando de la siguiente manera:
python manage.py sync_api_docs # 相当于编译读API文档
python manage.py sync_system_and_channel_data [--force] # 如果系统和通道都已经存在, force强制替换做出改变
Ver el estado de establecimiento de la plataforma
Establecer el sistema:
Canal de registro:
especificar el tipo de ejecución de 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
La figura específica es la siguiente:
Contenido 4: compile el documento ESB y reinicie la interfaz ESB
Compile el documento ESB:
ingrese a la máquina donde se encuentra la plataforma ESB, ingrese al entorno virtual esb y ejecute el comando de la siguiente manera:
python manage.py sync_api_docs
Reinicie la interfaz ESB:
ingrese a la máquina donde se encuentra la plataforma ESB, ingrese al entorno virtual open_paas y ejecute el comando de la siguiente manera:
# INSTALL_PATH 表示项目安装基准目录
# 重启指令
workon open_paas
supervisorctl -c $INSTALL_PATH/etc/supervisor-open_paas.conf restart esb
Por ejemplo: supervisorctl -c /data/bkee/etc/supervisor-open_paas.conf restart esb
注意:
① 平台ESB所在的机器都需要作此操作,ESB接口才能使用。
② 自定义通道,需要把conf.pyc文件删除掉,防止命令运行后,平台esb信息不生效,其实是运行了pyc文件信息。
Contenido 5: Puntos a tener en cuenta
① 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
Contenido 6: Ingrese al entorno de la máquina PAAS a través de la máquina de control central
Primero conéctese a la máquina de control central e
ingrese la primera máquina con paas
注意:
① PAAS_IP 有多台paas时,从PAAS_IP0开始 代表机器台数从第一台开始 ,第二台就是PAAS_IP1,类似于数组。
② 进入到paas机器后,如果要切换到其他的中控机下的机器,一定要exit退出当前所在的paas环境