1

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

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

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

脚本是命令式编写的。例如:

  1. 通过 SSH 连接到服务器
  2. 打开一个文件
  3. 解析 XML
  4. 搜索 XML 标记
  5. 将值存储在变量中
  6. 将其与其他地方的另一个值进行比较。

我想看看编写一个框架来以稍微更具声明性的方式进行这些验证 - 即,而不是定义服务器应该如何检查某些东西,我们应该能够说<tag>value</tag> should equal foobar- 并让框架处理如何。

我在想我们可以安排检查并将工作推到像 Celery 这样的队列中。

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

或者这里有没有人做过类似的事情,或者可以提供任何建议?

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

干杯,维克多

4

1 回答 1

0

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

每个声明性验证文件都是一个 python 片段,使用预定义的函数、变量等。每个检查都是一个 python 函数。运行验证是使用驱动程序脚本完成的,其中包括execfile运行检查文件的调用。

例如,您可以有一个验证文件,例如:

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. 易于扩展功能(例如编写新xpath_equals功能)
  3. 灵活——在您想要执行涉及专门逻辑的验证的情况下,您可以在您的验证文件中实现它,而无需扩展您的声明性语言的定义。例如for i in range(10): tag_equals('address%d' % i, 'N/A')

To protect against accidentally execfileing an arbitrary python file, you should add a check to only run execfile if the first line in the file equals some predefined header.

于 2013-03-18T06:34:33.477 回答