Django实现自动发布(4配置文件管理)

新部署一个服务时,除了服务本身,还有它启动依赖的配置文件也要一并发布到目标主机。配置文件从哪里来?如何发送到目标主机?修改后如何同步?

我们可以在页面提供上传或新增功能,为每个服务保存一份默认的配置文件包,新部署时将此包的内容写入etcd,由主机上的守护进程去同步,后续的修改也只是更新etcd里的内容,原理请见 配置文件那些事

实际上服务的配置文件不只有默认包,每次修改内容都会创建一个新的包,这个包里的所有版本号都应可应用到该服务的每个实例,因此需要记录服务有哪些配置文件版本号、实例当前关联的版本号,就是一对多的关系。我们要修改一下模型:

class ConfRevision(models.Model):
    # ...
    service = models.ForeignKey(MicroService, on_delete=models.DO_NOTHING) # 1个服务可以有多个配置文件版本号


class MicroServiceInstance(models.Model):
    # ...
    conf_revision = models.ForeignKey(ConfRevision, null=True, blank=True, on_delete=models.DO_NOTHING) # 1个配置文件可以对应多个实例

页面设计与实现

为了方便录入文件,希望能实现以下功能:

  • 除了手动填写,最好有个从文件上传的功能
  • 页面支持增加、修改、删除某个配置包的文件
  • 内容预览
  • 文件对比,查看修改历史

为了更方便的实现功能,引入vue 和 ui组件 elementui 我们就从DOM中脱离出来,只需要操作数据就好。

前端最后提交到后端的是1个或多个文件,由于配置文件是纯文本格式,所以很方便的用数组来保存内容,使用json传输到后端。

服务的配置文件列表:
服务的配置文件

支持以下操作:

  • 关联实例
  • 设置为默认配置
  • 修改内容
  • 修改描述

某个具体的配置文件:
配置文件详情

  • 支持手动添加文件
  • 支持从文件导入
  • 格式校验

文件对比:
配置文件对比

同步到etcd

目前的代码已经在本地数据库实现了一个完整的配置版本管理功能:

  • 浏览器作为统一的修改入口
  • 后端保存文件的修改历史,每一次修改都生成一个新的修订号
  • 简单文件对比,方便查看修改了哪些内容

之后的内容下发就是将内容写入etcd,相对来说比较容易。

相关的页面和代码比以往要多,放到 这里

posted @ 2019-12-28 17:38  葡萄不吐皮  阅读(708)  评论(0编辑  收藏  举报