【问题标题】:Check Puppet module files source exists before copy在复制之前检查 Puppet 模块文件源是否存在
【发布时间】:2016-09-19 22:55:03
【问题描述】:

我正在使用 Puppet 将证书从 Puppet 服务器传输到 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',
  }

【问题讨论】:

  • 这与最佳实践相去甚远。你这样做是有原因的吗?
  • 嗯,是的,实施这种奇怪的解决方案是有原因的。
  • 您所询问的内容与您提供的(语法不正确的)代码有何关系?

标签: puppet


【解决方案1】:

如何在我尝试复制之前检查模块文件目录 (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() 函数访问它。

但是,您是否考虑过不设置任何条件,而只是在证书文件不可用的情况下让资源应用程序失败?如果实际上您关心是否安装了证书,那么资源应用程序失败会为您提供重要信息。我想你确实在乎,因为如果你不关心,那么根本不用担心证书会更容易。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-20
    • 2015-11-22
    • 2015-04-19
    • 2019-03-07
    • 1970-01-01
    • 2015-02-21
    • 1970-01-01
    • 2017-09-15
    相关资源
    最近更新 更多