Puppet中实现前置检查避免重复下载已安装软件的MSI包
解决Puppet在Windows上重复下载Chrome安装包的问题
你当前的Puppet清单会无条件下载ChromeSetup.msi,无论Google Chrome是否已安装。要实现条件判断,核心是仅当Chrome未安装时才触发MSI文件的下载/创建,以下是优化后的代码和逻辑说明:
优化后的Puppet清单
class googlechrome_2 { # 查询Chrome是否已安装的PowerShell命令(注册表方式,性能优于WMI) $chrome_installed_command = @(END) Get-ItemProperty -Path 'HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*', 'HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*' | Where-Object {$_.DisplayName -like "*Google Chrome*"} END package { 'GoogleChrome': ensure => installed, source => 'C:\Soft\ChromeSetup.msi', install_options => ['/qn'], require => File['GoogleChromeMsi'], } file { 'GoogleChromeMsi': ensure => file, path => 'C:\Soft\ChromeSetup.msi', source => 'puppet:///files/production/ChromeSetup.msi', # 仅当Chrome未安装时,才执行该文件资源的操作 unless => "powershell.exe -Command \"${chrome_installed_command}\"", } exec { 'msi_removing': command => 'C:\Windows\System32\cmd.exe /c del C:\Soft\ChromeSetup.msi', # 仅当文件存在时执行删除 onlyif => 'if exist C:\Soft\ChromeSetup.msi exit 0 else exit 1', # 仅当Chrome安装完成后才触发删除 subscribe => Package['GoogleChrome'], refreshonly => true, } }
关键逻辑说明
- 条件判断MSI下载:
file资源的unless参数会执行指定的PowerShell命令,若命令返回成功(即检测到Chrome已安装),Puppet会跳过该file资源的所有操作,避免重复下载MSI包;只有当Chrome未安装时,才会确保MSI文件存在。 - 优化删除操作:
exec资源通过subscribe和refreshonly => true确保仅在Chrome安装完成后触发删除,onlyif则避免因文件不存在而执行删除命令导致报错。 - 高效的安装检测:使用注册表查询替代WMI的
Win32_Product,前者性能更优,且不会触发意外的MSI修复操作(Win32_Product可能存在这个问题)。
内容的提问来源于stack exchange,提问作者Tema Shaposhnikov
相关产品推荐
相关产品推荐

