我是新的木偶和ruby,只是试图写自定义事实,但…出现以下问题
Facter.add("vsphere_installed") do
confine :operatingsystem => :windows
setcode do
if Facter::Util::Resolution.exec('c:windowssystem32WindowsPowerShellv1.0powershell.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
我不知道该怎么做,我想列出已安装的程序并搜索一个,如果为真(find)返回它已安装。这个例子目前只返回false ....
Puppet是关于期望状态的,而不是程序性的
感觉就像你现在把Puppet当作过程的,Puppet更多的是关于期望的状态。你决定安装什么,你不必问。
所以对于某些服务器角色,你会说最终状态是你需要vSphere和其他软件。
你可以做这些决定,你不应该使用Puppet来发现状态,而应该告诉它状态,让它做它最擅长的事情。
发现是你可以用工具探索机器做的事情,试试puppet resource package
,你会明白我的意思。
但是要回答你的问题,你可能应该使用一个自定义的可执行事实,直接使用PowerShell,因为命令字符串仍然需要在双引号中转义(也可能需要以你使用撇号然后双引号的方式转义)-文档还指出使用Facter::Core::Execution.exec
而不是Facter::Util::Resolution.exec
。
使用自定义可执行事实。
也不要使用Win32_Product - Win32_Product类可以触发Windows Installer对所有MSI安装的软件进行修复,作为一致性检查。它确实会导致机器做很多不必要的工作——使用它不是一个好主意。我建议直接查询卸载程序注册表项