复制前检查Puppet模块文件源是否存在

时间:2016-09-19 11:21:53

标签: puppet

我正在使用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',
  }

1 个答案:

答案 0 :(得分:0)

  

在尝试复制之前,如何检查模块文件目录(puppet:/// modules / modulename /)中的证书存在?

您可以编写一个custom function来检查模块目录中的文件,并使用它来启用或禁止FileExec资源的声明。使用该函数的清单可能如下所示:

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

或者做同样事情的快速而肮脏的方法是通过ERB模板中的Ruby scriptlet代码实现它,您可以通过inline_template()(或template())运行。

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

但是,您是否考虑过不做任何条件限制,而只是在证书文件不可用的情况下让资源的应用程序失败?如果您确实关心是否安装了证书,那么资源应用程序故障会为您提供重要信息。我认为你关心,因为如果你不这样做,那么只要不打扰证书就更容易了。