我使用 Puppet 来生成/etc/exim4.conf
,并且我想确保在生产系统上安装文件之前配置有效。
我考虑过——
使用 git hook 来调用
exim4 -bV -C filename
... 但这行不通,因为我使用 ERB 模板来生成文件,所以直到 Puppet 代理运行后才会真正生成最终结果。我已经有一个 git hook 来测试 ERB 语法。让 init 脚本检查配置文件... 但这还不够好,因为虽然如果配置无效,脚本将拒绝重新加载 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 生成的,但是前安装成功了吗?
我在 Debian Wheezy 系统上使用 Exim 4.80 和 Puppet 2.7.26。
答案1
听起来你正在validate_cmd
准确描述该参数。从傀儡类型参考file
:
在替换文件之前验证文件语法的命令。如果 Puppet 需要因为新来源或内容而重写文件,它会先检查新内容的有效性。如果验证失败,文件资源将失败。
此命令必须具有完全限定路径,并且应在预期输入文件的位置包含百分号 (%) 标记。如果语法正确,则必须退出 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 %',
}
答案2
您可以使用 git hook 启动虚拟机/容器(Docker 是理想的选择)并在该环境中应用清单来测试生成的配置。
如果你经常这样做,你可以考虑实施 CI 系统(例如詹金斯) 将您的更改推送到其中,让 CI 运行一套测试,并在成功后将更改推送到生产环境。
答案3
我可能会创建三个相互依赖的任务:-
- 在 /tmp 中生成模板化的 .conf
- 测试生成的.conf
- 移动 .conf 并通知服务
在这种情况下这不起作用有什么原因吗?