我正在尝试使用 Puppet 在 CentOS 主机上的 CA 证书文件中插入一段文本。之前问过这个,好像CentOS 是很缺乏证书管理的功能。。。
我需要做的是将代表我的 CA 证书的相当大的文本块(openssl
出于任何愚蠢的原因通过 的信息命令传递)到我的/etc/ssl/certs/ca-bundle.crt
文件中并确保它始终存在,即使主机稍后从 repo 更新其 CA 文件也是如此。
我不想用 Puppet 管理整个 ca-bundle 文件。这已经由服务器指向的 yum 存储库处理。
困难:Puppet 没有正式的方法来管理文本块,只有行,使用file_line
资源。不过,我试图变得聪明,认为您可以使用换行符转义的文本“行”并进行管理。
好吧,有点。它有效,因为文本最终出现在文件中,但问题是它在每次人偶运行后不断被重新添加,就像代码无法判断它已经存在一样。
对于细节,文本块看起来很像这样(由于显而易见的原因被截断: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
(包括使用 aninline_template
将匹配正则表达式设置为$cacert
变量的全部内容,这在 IRB 中完美运行,但在 Puppet 中却不行)试图让它识别文本块已经存在但它每次都会重新添加并且只是堆叠在自身之上..
我可能在这里咆哮错误的树......但无论如何,这是问题的一部分。
- 有没有更好的方法来实现这个目标?
- 如果没有,我如何让 Puppet 意识到文本块已经存在?
谢谢!
我最终用
exec
一行解决了这个问题:是的,它使用的是 exec,虽然官方不鼓励这样做,但它工作可靠,并且使用了任何 CentOS 机器都会拥有的绝对基本的东西。
感谢大家!
通常我会看到使用 erb 模板对文件进行整体管理。如果您不这样做,您可以让脚本执行 sed 命令。 https://puppetlabs.com/blog/why-puppet-isnt-a-file-management-tool/
我想你想要 puppet concat 模块,它从片段构建文件。或者只是管理一个单独的文件并让一个 exec 资源 sed 将它插入到文件中,如果没有用 grep 找到
另见 augeas。
http://augeas.net/
它旨在完全按照您的要求进行操作。