傀儡事实上,列出软件Windows

时间:2015-05-19 09:18:10

标签: windows puppet facter

我是傀儡和红宝石的新手,只是试图写出自定义的事实,但......有以下问题

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(查找)则返回它已安装的程序。 到目前为止,此示例仅返回false ....

1 个答案:

答案 0 :(得分:3)

Puppet是关于Desired State - not procedural

感觉就像你现在正在将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。它确实会导致机器做很多不必要的工作 - 使用它并不是一个好主意。我建议直接查询卸载程序注册表项。