我是傀儡和红宝石的新手,只是试图写出自定义的事实,但......有以下问题
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 ....
答案 0 :(得分:3)
感觉就像你现在正在将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
。
也不要使用Win32_Product - Win32_Product class can trigger Windows Installer to do a repair on all MSI installed software as a consistency check。它确实会导致机器做很多不必要的工作 - 使用它并不是一个好主意。我建议直接查询卸载程序注册表项。