全部产品
云市场

xDeploy 框架详细说明

更新时间:2019-09-18 19:16:55

lib/custom/xxx_steps.py 文件所要实现接口详细说明

在 xDeploy 快速开始 例子中 mybuildpack_steps.py 是用户重点要关注的文件,用户主要实现其中的接口来完成自定义的部署过程。

举例来说,在蚂蚁金服金融科技(简称“金融科技”)平台发布部署的过程中有一个步骤是应用部署,这个步骤会依次调用 validate_env->pre_deploy->deploy->post_deploy 这四个接口,因此用户可以在这些接口里面实现真正的应用部署逻辑。

各接口详细说明如下:

接口名 参数说明 接口说明
init_env context 初始化工作空间,对部署时所要求的工作空间进行初始化
validate_env context 检查工作空间
pre_deploy context 部署前置操作
deploy context 部署应用
post_deploy context 部署后置操作
check_service context 服务检查,检查部署是否成功
shutdown context 应用关闭
pre_setup context 软件安装前置操作
post_setup context 软件安装后置操作

说明: context 是类 Context 的对象(Context 可以通过from xdeploy.base.base_executor import * 引入),用户指定的参数放置到了 context.params_dict (此类型为 dict)。

例如:在部署时我们填写的 key1=value1 (在部署脚本测试中对应于 -P key1=value1)。

dict 变量

在脚本中可以通过 context.params_dict["key1"] 来得到 value1。

接口调用顺序

页面触发的整体流程如下图所示(红色框内为脚本的调用范围):发布部署步骤

以上每个接口被调用都是在各自的进程中被调用,所以各个接口间无法进行交互。

对应的脚本接口调用如下:

调用入口(对应 bin 目录中脚本) 接口流程 可用参数
下载脚本包(无) 框架实现,用户不用关心
工作空间安装(software_setup.py) 1. pre_setup
2. setup
3. post_setup
setup_json_parameter{name,version,targetPath}:Json 格式的软件安装信息{软件名,软件版本,软件安装路径}
注意:setup 是框架用来安装应用的实现
配置工作空间(common_config) init_env 可用参数
下载应用(download_app.py) 框架实现,用户不用关心
部署应用
(deploy.py)
1. validate_env
2. pre_deploy
3. deploy
4. post_deploy
app_path:应用安装路径
version:应用安装版本
服务检测(checkapp.py) check_service 可用参数
应用停止(stopapp.py) shutdown 暂无
应用重启(reboot.py) 1. shutdown
2. validate_env
3. pre_deploy
4. deploy
5. post_deploy
可用参数

xDeploy 核心目录说明

进入 /xdeploy_install/xdeploy/ 目录后会发现如下图所示目录。

xDeploy 核心目录

其中,

  • base 是 xDeploy 的核心目录;
  • exception 中定义了 xDeploy 的异常;
  • util 目录中包括了 logutilfunction_uitl 等工具。

base 目录

  • base_executor.py
  1. #引入方法:
  2. from xdeploy.base impoort base_executor
  3. class Context:
  4. def __init__(self):
  5. self.params_dict=dict()
  6. class BaseExecutor:
  7. #参数检查
  8. def validate_params(self, argvs)
  9. #构造参数
  10. def build_params(self,argvs)
  11. #执行步骤
  12. def run_steps(self, argvs)
  13. #执行
  14. def execute(self, argvs = ""):
  15. validate_params
  16. build_params
  17. run_steps
  • base_step.py
  1. class BaseStep:
  2. #安装前置
  3. def pre_setup(self,context)
  4. #安装后置
  5. def post_setup(self,context)
  6. #工作空间初始化
  7. def init_env(self,context)
  8. #工作空间检查
  9. def validate_env(self, context)
  10. #部署前置
  11. def pre_deploy(self, context)
  12. #部署
  13. def deploy(self, context)
  14. #部署后置
  15. def post_deploy(self, context)
  16. #健康检查
  17. def check_service(self, context)
  18. #停止应用
  19. def shutdown(self, context)
  20. #得到下载应用的用户(默认为 admin 用户下载)
  21. def get_download_app_user(self)
  • flow_engine.py

    此文件主要用于编排实现的调用顺序

exception 目录

xdeploy_exception.py 中定义 xDeploy 的专用异常类。

  1. class BaseError(Exception):
  2. def __init__(self,errMsg,errLine,scriptName):

定义的其他异常类都继承 BaseError,举例如下:

  1. #引入方法
  2. from xdeploy.exception import xdeploy_exception
  3. #未找到文件错误
  4. class NoFileError(BaseError)
  5. #没有关键值错误
  6. class NoKeyValueError(BaseError)
  7. #调用方法出错
  8. class CallFuncError(BaseError)

详细请参考 xdeploy_exception.py 文件。

util 目录

  • logutil.py(日志工具)
  1. #引入方法:
  2. from xdeploy.util import logutil
  3. #ERROR 日志打印
  4. #file_name:出错的脚本名称
  5. #file_def:出错的函数名称
  6. #def_num:日志打印的行号
  7. #message:错误信息
  8. #exception_info:异常信息,默认为空
  9. #console:是否打印到终端,默认为 True
  10. #log_path:日志路径,默认路径为 /usr/alisys/dragoon/libexec/opsware/logs/
  11. #prominent:是否突出显示,默认为 True;
  12. # 突出显示结果为:
  13. ************ERROR-BEGIN*************
  14. message
  15. ************ERROR---END**************
  16. def LOG_ERROR(file_name, file_def, def_num, message, exception_info = "",console=True,log_path=default_log_path,prominent=True)
  17. #INFO 日志打印
  18. #参数解释同上
  19. def LOG_INFO(file_name, file_def, def_num, message, exception_info = "",console=True,log_path=default_log_path)
  • function_util.py(工具函数)
  1. #引入方法
  2. from xdeploy.util import function_util
  3. #把 key=value 的 list 构建成 dict
  4. def build_dict(list)
  5. return dict
  6. #改变当前的执行用户
  7. def change_user(user_name)
  8. #从文件中得到 key 对应的值(文件中每一样为一个 key=value 的键值对)
  9. def get_value_from_file(key,file_name)
  10. return string
  11. #存储"key=value"值到文件中,如果文件中已经存在 key 值,则会替换原来的值
  12. def save_kv_to_filefile,kv
  13. #把 key=value 字符串 转换为 dict;多个 k=v 之间的分隔符为 sep,默认 sep 为" "
  14. def kvstr_convert_dict(kvstr,sep=" ")
  15. return dict
  16. #把 source_dir 下的文件拷贝到 target_dir 下
  17. def copy_files(source_dir, target_dir)
  18. #把 source_file 拷贝为 target_file
  19. def copy_file(source_file,target_file)
  20. #把 source_file_path 下的文件压缩为 target_file_name(zip)
  21. def zip_files(source_file_path,target_file_name)
  22. #把 target_dir 目录下的文件删除
  23. def remove_files(target_dir)
  24. #把 source_file_path 下的文件压缩为 target_file_name(tar)
  25. def tar_files(source_file_path,target_file_name)
  26. #从文件读取内容
  27. def read_from_file(file)
  28. return string
  29. #执行 shell 命令
  30. def popen(command)
  31. return (recode,stdout,stderr)
  32. recode shell 命令的退出码,stdout shell 命令的标准输出,stderr shell 命令的错误输出
  33. #创建一个进程执行任务,阻塞型
  34. def process_wait(target,args=None,kwargs=None)
  35. return ret
  36. ret 为子进程结束的退出码
  37. #得到一个文件夹下的所有文件名称(不包括文件夹)
  38. def get_files_name_in_dir(dirname=None)
  39. return list
  40. 返回文件 list
  41. #删除字符串 str_obj 中多余的空格,比如:“ aa bb”->"aa bb"
  42. def remove_more_space(str_obj)
  43. #返回当前的时间的字符串,默认格式为"%Y-%m-%d %H:%M:%S"
  44. def get_now_time_str(patter="%Y-%m-%d %H:%M:%S")
  45. #替换 source_str 中符合 matched_pattern 的字符串为 replace_str
  46. def replace_str_by_pattern(source_str,matched_pattern,replace_str)

更多工具函数请参看 function_util.py 文件。

  • system_value_util.py

    此文件用于得到 /etc/metafile 中的值。

  1. #引入方法
  2. from xdeploy.util import system_value_util
  3. #得到工作空间变量中 key 的 value 值
  4. def get_value(key)
  5. #得到文件中所有的 key 值
  6. def get_all_key_list()
  7. #得到文件中 k,v 的 dict
  8. def get_all_kv_dict()
  • /etc/metafile 文件说明

    在 ECS 上,对经典应用服务进行初始化时,生成 /etc/metafile 文件。该文件包含 ECS 的元数据信息,格式为“key=value”。以 SOFA4 为例:

说明:此文件一旦生成不会被改变,除非 ECS 被重新初始化。

  1. datacenter_name=hzzmf01
  2. datacenter_id=0000000001
  3. workspace_id=0000010063
  4. customer_name=myjf
  5. tenant_id=0000000001
  6. instance_name=dev01
  7. paas_id=0000021818
  8. workspace_name=TEST058
  9. outer_ecs=0
  10. appname=sofa4Test
  11. domain=alipay.net
  12. iaas_id=i-31gypurss
  13. tenant_name=xxx
  14. customer_id=0000000001
  15. datacenter_iaas_id=cn-hangzhou-number1-a

参数说明:

值名称 解释 备注
paas_id ECS 在金融科技平台中的 ID
iaas_id ECS 在阿里云平台中对应的 InstanceId 例如: i-3143a6ial
datacenter_id ECS 所属数据中心的 ID,用于标示机房
datacenter_name ECS 所属数据中心的工作空间标识,用于标示机房 非页面展示值
workspace_id ECS 所属工作工作空间的 ID
workspace_name ECS 所属工作工作空间的工作空间标识 配额管理中可以查询工作工作空间的工作空间标识
tenant_id ECS 所属的租户 ID
tenant_name ECS 所属的租户名称
customer_id ECS 所属的客户 ID
instance_name ECS 所属的金融科技平台的唯一标识

说明:SOFA3、SOFA4、msgbroker、confreg 等技术栈中 /home/admin/conf/server.conf 文件中的一些值是从此文件中直接或间接得到,规则如下:

  • 在 SOFA4 和 SOFA3 中:
server.conf 中的值 根据 /ect/metafile 生成的规则 备注
domainname datacenter_name-workspace_name-tenant_name.[instance_name.]domain
dbmode workspace_name 可能不存在
zone datacenter_iaas_id 可能不存在
appname appname 必定存在,否则发布失败
confregurl 由 /etc/metafile 文件中的值组装而成,一般拼接规则为: confreg.${datacenter_name}-${workspace_name}-${tenant_name}.${instance_name}.${domain} 必定存在,生成规则详见 更新说明:20150815 发布版本说明

版本更新说明

更新说明: 20150625 发布版本

  • 修改 logutil 中向控制台打印输出 bug
  • 去除 base_step.BaseStep 的接口 enable_traffic()和 disable_traffic()
  • flow_engine.DeployFlow 的 run_steps 去除 check_service()接口的调用,只在健康检查中调用
  • 增加 LOG_ERROR/LOG_INFO 功能来设置日志打印路径。例如: LOG_ERROR(…,log_path=”/home/admin/logs/“)
  • 增加从/etc/metafile 中获得 key=value 的接口类 system_value_util.SysValueUtil使用方法: sys_util=SysValueUtil() sys_util.get_value(“appname”)
  • 增加装饰器函数 log_time_deco()和 caculate_time_deco()

更新说明: 20150709 发布版本

  • 增加 function_util 中的工具函数: remove_item_in_list(),replace_str_by_pattern(),remove_more_space()
  • 修复 download_env.py xDeploy 安装,无法覆盖的之前安装的 bug
  • bin 目录新增脚本 download_file.py;框架新增运维功能:下载并解压 tar.gz 文件包脚本到用户指定的地点

更新说明: 20150815 发布版本

  • logutil.LOG_ERROR()增加一个参数 prominent:def LOG_ERROR(file_name, file_def, def_num, message, exception_info = “”,console=True,log_path=default_log_path,prominent=True):如果prominent 为 True,则打印的错误信息message 会最终显示为
    1. *********************ERROR********************
    2. message
    3. *********************ERROR********************
  • xDeploy 框架捕获异常后处理方式更改:

    各个 buildpack 实现方,在所实现的接口中主动抛出或者发生异常后,xDeploy 框架捕获到异常后不再以异常形式向上抛出来终止脚本,改为:

    捕获异常后打印一条错误日志(日志和终端同时输出)并直接退出脚本

  • confregurl 生成规则更改:

confregurl 不再是 ECS 的默认固有属性,而是由 buildpack 按需生成。sofa4, sofa3, msgbroker, sofa-lite, sofa-lite-core 这些技术栈的生成方式如下:优先判断,在创建发布单时是否指定了 confregurl.{datacenter_name} 的 key 值,如果指定了则优先使用此值,否则从/etc/metafile 里获取相关元素并组装,拼接方式为:

  1. confreg.${datacenter_name}-${workspace_name}-${tenant_name}.${instance_name}.${domain}

更新说明: 20150924 发布版本

  • 完善 software_setup.py 中应用安装的逻辑(不再依赖 salt-base)
  • 修正日志打印中多余打印的 bug
  • confregurl 的生成规则变更: 直接从脚本参数中获得 context.params_dict[confregurl.{datacenter_name}]
  • sofa4 增加 nginx 启动失败的检查逻辑

更新说明: 20151112 发布版本

  • 重启过程 reboot 加入 MD5 校验
  • function_util 增加 get_md5_value(filename)
  • 脚本解压在 /home/admin/ 目录下后,相应压缩包中的 conf,bin,lib,xdeploy_install 目录下的文件被置成 admin:admin

更新说明:20151126 发布版本

  • 重要更新:xDeploy 框架的更新(bin,xdeploy_install目录)由金融科技维护,自定义技术栈的使用者不再需要感知框架更新,每次部署框架时目录都会被替换成最新的。用户只需要维护 conf、lib 目录即可,上传的脚本包也只需要只包含 conf、lib 即可(金融科技做了兼容,老脚本包也是可以正常使用的)

  • 添加版本目录清理功能:在每次部署时,会清理版本目录 /home/admin/release/ 下的文件,只会保留最近部署的5个版本目录


更新说明: 20160107 发布版本

  • 增加 sdk xdeploy 工具