我正在尝试使用 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 未找到该文件)