You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 03:21:30