1

我是 puppet 和 ruby​​ 的新手,只是尝试编写自定义事实,但是......遇到以下问题

Facter.add("vsphere_installed") do
  confine :operatingsystem => :windows
  setcode do
  if  Facter::Util::Resolution.exec('c:\windows\system32\WindowsPowerShell\v1.0\powershell.exe -NonInteractive -NoProfile -ExecutionPolicy Bypass -Command "Get-WmiObject -Class Win32_Product | Select-Object -DisplayName | ? {$_.DisplayName -Match "vsphere"}"') = true
        result = "vSphere installed"
        else
                result = "false"

        end
  end
end

我不知道该怎么做,我想列出已安装的程序并搜索一个,如果为 true(find) 则返回它已安装。到目前为止,此示例仅返回 false ....

4

1 回答 1

3

Puppet 是关于理想状态 - 而不是程序

感觉就像您现在将 Puppet 视为程序性的,而 Puppet 更多的是关于期望的状态。你确定安装了什么,你不一定要问。

因此,对于某些服务器角色,您会说最终状态是您需要 vSphere 以及其他软件。

你要做出这些决定,你不应该使用 Puppet 来发现状态,而是告诉它状态并让它做它最擅长的事情。

发现是你可以用探索机器的工具在带外做的事情,尝试一下puppet resource package,你就会明白我的意思。

自定义事实

但是要回答您的问题,您可能应该使用自定义可执行事实并直接使用 PowerShell,因为命令字符串仍然需要在双引号中转义(并且可能还需要以使用撇号然后加倍的方式进行转义引号) - 文档还指向 usingFacter::Core::Execution.exec和 not Facter::Util::Resolution.exec

请改用自定义可执行事实

也不要使用 Win32_Product - Win32_Product 类可以触发 Windows Installer 对所有 MSI 安装的软件进行修复作为一致性检查。它确实会导致机器做很多不必要的工作——使用它并不是一个好主意。我建议直接查询卸载程序注册表项。

于 2015-05-19T21:55:01.543 回答