2016-09-19 34 views
0

我正在使用Puppet将证书从Puppet Server传输到Windows节点。 Puppet Server有一个文件夹,其中新的证书正从我的CA(另一台服务器)复制。因此,有时Puppet可能找不到节点的证书(它不从CA转移到源目录),这就是为什么我需要额外检查源文件夹中的证书状态。代码必须检查主机名,找到适当的证书并将其传输到节点。在我试图复制它之前,我怎样才能在模块文件目录(puppet:/// modules/modulename /)中检查证书的存在?在复制之前检查木偶模块文件源

file { "D:\$hostname.pfx": 
    ensure => present, 
    source => all, 
exec { 'Import certificate': 
    command => "if((Get-ChildItem -Path Cert:\LocalMachine\My\ | ? {$_.Issuer -like "*CN=example*"}).HasPrivateKey | select-string -pattern "True") -or()\ 
       {\$pwd = ConvertTo-SecureString -String "Password" -Force –AsPlainText; Import-PfxCertificate –FilePath ${cert_path}\$hostname.pfx cert:\localMachine\my -Password \$pwd}", 
    path  => $::path, 
    onlyif => "Test-Path ${cert_path}\${hostname}.pfx", 
    provider => 'powershell', 
    } 
+0

这与最佳实践相去甚远。你有这样做的理由吗? –

+0

嗯,是的,有一个实施这样一个奇怪的解决方案的原因。 –

+0

您所提问的内容与您提供的(语法错误)代码有何关系? –

回答

0

我怎样才能使它检查模块文件目录证书存在(木偶:///模块/模块名/)之前,我尝试复制呢?

你可以写一个custom function,检查在模块目录中的文件,并用它来启用或抑制FileExec资源的声明。使用该功能的清单可能是这个样子:

if module_file_exists("${hostname}.pfx") { 
    file { "D:\$hostname.pfx": 
    # ... 
    } 
    --> 
    exec { 'Import certificate': 
    # ... 
    } 
} 

或做同样的事情会通过Ruby的小脚本在ERB模板代码,您通过inline_template()运行来实现它的快速和肮脏的方式(或template())。

或者稍微更深奥的解决问题的方法是编写一个自定义的Hiera后端,提供有关本地(到目录编译器)文件系统的信息,并通过hiera()函数访问它。

但是,您是否认为没有做任何有条件的事情,而只是在证书文件不可用的情况下让资源的应用失败?如果实际上您关心证书是否已安装,那么资源应用程序失败会为您提供重要信息。我想你照顾,因为如果你没有,那么它会更容易四处简单地不打扰证书。