我使用Puppet来生成/etc/exim4.conf并且在生产系统上安装文件之前,我想确保configuration是有效的。
我考虑过 –
使用git钩子来调用exim4 -bV -C filename …但是这不起作用,因为我使用ERB模板来生成文件,所以最终的结果直到Puppet代理运行才会生成。 我已经有一个git挂钩来testingERB语法。
让init脚本检查configuration文件 …但这不够好,因为如果configuration无效,脚本将拒绝重新加载Exim,那么文件已经被安装并直接调用Exim(发送邮件从应用程序,例如)将失败。
理想情况是我想要的是某种Puppet指令,看起来像
file { '/etc/exim4/exim4.conf': content => template("exim/etc/exim4/exim4.conf.erb"), notify => Service[exim4], but_before_we_install_check_syntax_with => '/usr/bin/exim4 -bV -C', }
如何在 Puppet生成之后但在安装之前检查configuration文件的语法?
我在Debian Wheezy系统上使用Exim 4.80和Puppet 2.7.26。
这听起来像你正在描述validate_cmd参数。 从file的Puppettypes引用 :
replace之前用于validation文件语法的命令。 如果Puppet由于新的来源或内容需要重写文件,它将首先检查新内容的有效性。 如果validation失败,则文件资源将失败。
这个命令必须有一个完全限定的path,并且应该包含一个百分比(%)的令牌,在这个令牌中会有一个input文件。 如果语法正确,它必须退出0,否则不为零。 该命令将在目标系统上运行,而不是在puppet master上。
在你的例子中,我想你会这样做:
file { '/etc/exim4/exim4.conf': content => template("exim/etc/exim4/exim4.conf.erb"), notify => Service[exim4], validate_cmd => '/usr/bin/exim4 -bV -C %', }
你可以通过使用一个git钩子来启动一个虚拟机/容器(Docker将是理想的),并在这个环境中应用清单来testing结果configuration。
如果你经常这样做,你可能会考虑实施一个CI系统(比如Jenkins ),你可以把你的改变推向CI,让CI运行一套testing,并在成功的时候将改变推向生产。
我可能只是创build三个相互依赖的任务:
在这种情况下,有没有这个原因呢?