部署前检查 puppet 生成的 exim 配置

部署前检查 puppet 生成的 exim 配置

我使用 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 并通知服务

在这种情况下这不起作用有什么原因吗?

相关内容