使用 Puppet 管理文本块

使用 Puppet 管理文本块

我正在尝试使用 Puppet 将一段文本插入到 CentOS 主机上的 CA 证书文件中。我之前问过这个问题,看来 CentOS 非常缺乏证书管理功能。

我需要做的是将代表我的 CA 证书的一大段文本(openssl由于某种愚蠢的原因通过的 info 命令传递)放入我的/etc/ssl/certs/ca-bundle.crt文件中并确保它始终存在,即使主机稍后从 repo 更新其 CA 文件。

不要想要使用 Puppet 管理整个 ca-bundle 文件。这已由服务器指向的 yum 存储库处理。

难度:Puppet 没有正式的方法来使用资源管理文本块,只有行file_line。不过,我试图耍小聪明,认为您可以使用换行符转义的文本“行”来管理它。

嗯,有点儿像。它确实能工作,因为文本最终会保存在文件中,但问题是每次运行 puppet 后它都会被重新添加,就好像代码无法分辨它已经存在一样。

详细来说,这段文字看起来很像这样(由于显而易见的原因而被截断:3)

$cacert = "Certificate:\n    Data:\n        Version: 3 (0x2)\n        Serial Number:\n            10:d8:83:91:-redacted-"

我的 Puppet 模块中的行如下所示:

class em_cacerts::centos inherits em_cacerts{
    file_line { 'ca-certificate':
            path => '/etc/ssl/certs/ca-bundle.crt',
            line => $cacert,
            #match => "(see below)",
            ensure => present,
    }

我尝试了各种各样的方法来处理这一match行(包括使用将inline_template匹配正则表达式设置为$cacert变量的全部内容,这在 IRB 中可以完美运行,但在 Puppet 中却不行),试图让它识别出文本块已经存在,但它每次都会被重新添加,并且只是堆积在自身之上。

我可能在这里问错了问题...但无论如何,这是问题的一部分。

  • 有没有更好的方法来实现这个目标?
  • 如果没有,我该如何让 Puppet 意识到文本块已经存在?

谢谢!

答案1

我最终用一行解决了这个问题exec

class em_cacerts::centos inherits em_cacerts{
        exec { 'cent-ca-certificate':
                command => "/bin/echo '$centcacert' >> '$cabundlepath'",
                onlyif => "test ! `grep (redacted CA name) $cabundlepath`", 
                provider => 'shell',
        }
}

是的,它使用了 exec,这是官方不鼓励的,但它可靠地运行并使用任何 CentOS 机器都会有的绝对基本的东西。

感谢大家!

答案2

通常,我看到文件全部使用 erb 模板进行管理。如果您不愿意这样做,您可以让脚本执行 sed 命令。 https://puppetlabs.com/blog/why-puppet-isnt-a-file-management-tool/

答案3

我认为您需要 puppet concat 模块,它可以从片段构建文件。或者只需管理一个单独的文件,然后使用 exec resource sed 将其插入到文件中(如果使用 grep 未找到该文件)

答案4

另请参阅 augeas。

http://augeas.net/

其目的正是完成您所要求的事情。

相关内容