在Python中编写声明性配置检查?

时间:2013-03-18 06:00:52

标签: python xml configuration-files

我们有一组手工编写的Python脚本,用于验证生产环境/配置中的各种内容。

其中许多都是简单的XML检查(即验证此XML标记的值在此处等于该文件中的值)。其他可能是检查主机是否已启动,或者此应用程序的crontab启动时间是否在X的20分钟内,或者服务器上的日志文件是否包含某一行。

在每次生产推送之前自动执行检查。

脚本是强制性的。 E.g:

  1. SSH到服务器
  2. 打开文件
  3. 解析XML
  4. 搜索XML标记
  5. 将值存储在变量
  6. 将其与其他地方的其他值进行比较。
  7. 我想看看编写一个框架来以稍微更具声明性的方式进行这些验证 - 即不是定义服务器应该如何检查某些内容,而是应该能够说出<tag>value</tag> should equal foobar - 并让框架处理如何。

    我以为我们可以安排检查并将作业推到像Celery这样的队列上。

    阻止我重新发明轮子 - 是否有任何现有项目已经做过这样的事情?

    或者这里有人做过类似的事,或者能提出任何建议吗?

    (我知道像Puppet或Chef这样的东西 - 甚至是盐栈 - 然而,这些是用于管理部署或实际推出配置。这些验证脚本更多是为了确保手动完成的配置更改是理智的,或者不要违反某些基本规则。)

    干杯, 维克多

1 个答案:

答案 0 :(得分:0)

在过去,我使用了类似于我建议的方法,以声明方式将补丁应用于数据。

每个声明性验证文件都是一个python-snippet,使用预定义的函数,变量等。每个检查都是一个python函数。运行验证是使用驱动程序脚本完成的,该脚本包含execfile调用以运行检查文件。

E.g。你可以有一个验证文件,如:

tag_equals('value', 'foobar')
attribute_exists('value', 'value_attr')

你的驱动程序脚本基本上是:

def main():
    for filename in sys.argv[1:]:
        run_validation(filename)

def run_validation(filename):
    # import all "built-in" names for validations
    from mychecks import tag_equals, etc
    execfile(filename, locals())

if __name__ == '__main__':
    main()

优点:

  1. 使用execfile
  2. 轻松解析/解释
  3. 易于扩展的功能(例如 写一个新的xpath_equals函数)
  4. 灵活 - 在您希望执行涉及专用逻辑的验证的情况下,您可以在验证文件中实现它,而无需扩展声明性语言的定义。例如。 for i in range(10): tag_equals('address%d' % i, 'N/A')
  5. 为防止意外execfile任意python文件,您应该添加一个检查,以便只运行execfile 文件中的行等于某些预定义的标题。