傀儡事实,列出软件Windows

Puppet fact, list software Windows

我是 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

我不知道具体怎么做,我想列出已安装的程序并搜索一个程序,如果 return 为真(找到),则表明它已安装。 这个例子到目前为止 returns 只有 false ....

Puppet 是关于期望状态 - 不是程序

感觉你现在把 Puppet 当作程序来处理,而 Puppet 更多的是关于期望的状态。你确定安装了什么,你不一定要问。

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

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

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

自定义事实

但要回答您的问题,您可能应该使用自定义可执行文件并直接使用 PowerShell,because the command string still needs to be escaped in the double quotes(并且可能还需要以使用撇号和双引号的方式进行转义)-文档还指向使用 Facter::Core::Execution.exec 而不是 Facter::Util::Resolution.exec.

改用Custom Executable Facts

也不要使用 Win32_Product - Win32_Product class can trigger Windows Installer to do a repair on all MSI installed software as a consistency check。它确实会导致机器做很多不必要的工作——使用它并不是一个好主意。我建议直接查询卸载程序注册表项。