我试图在CentOS主机上用Puppet插入一段文本到我的CA证书文件中。 之前我问过这个问题,看来CentOS在证书pipe理function方面非常缺乏 。
我需要做的是将相当大的文本代表我的CA证书(通过openssl的info命令通过无论何种原因传递)到我的/etc/ssl/certs/ca-bundle.crt文件中,并确保它始终存在即使主机稍后从回购站更新其CA文件。
我不想用Puppetpipe理整个ca-bundle文件。 这已经被服务器所指向的yum库所处理。
难度:Puppet没有正式的方法来pipe理文本块,只有行,使用file_line资源。 不过,我试图变得聪明,认为你可以使用一个换行符的“文本行”并对其进行pipe理。
那么,有点。 它的工作原理是,文本在文件中结束,但是问题在于,在每个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, }
我已经尝试了所有types的match线(包括使用inline_template将匹配正则expression式设置为$cacertvariables的完整内容,在IRB中完美地工作,但在Puppet中却不行),试图使认识到文本块已经存在,但它不断重新添加,每次只是堆叠在自己的顶部..
我可能在这里咆哮错误的树,但无论如何,这是问题的一部分。
谢谢!
我最终用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的盒子将有。
感谢大家!
通常我会看到使用erb模板完整pipe理的文件。 如果你不这样做,你可以让一个脚本执行一个sed命令。 https://puppetlabs.com/blog/why-puppet-isnt-a-file-management-tool/
我想你想要的木偶concat模块,从碎片build立文件。 或者只是pipe理一个单独的文件,并有一个EXEC资源sed插入到文件,如果没有find与grep