仅当未安装Windows MSI软件包时,才需要通过puppet复制文件

仅当未安装Windows MSI软件包时,才需要通过puppet复制文件,windows,windows-installer,puppet,Windows,Windows Installer,Puppet,我刚在Windows上使用puppet。 我正在尝试从网络上的共享文件夹安装MSI软件包,但请不要更改权限,共享文件夹是“只读”的,它没有“执行”权限,因此当puppet代理运行并尝试安装MS时,它会失败 我想做的是仅当需要安装包时才将MSI安装程序复制到本地目录 这就是我安装包并复制到本地目录的方式: class app_install { package { '7-Zip 9.38 (x64 edition)': provider => windows,

我刚在Windows上使用puppet。 我正在尝试从网络上的共享文件夹安装MSI软件包,但请不要更改权限,共享文件夹是“只读”的,它没有“执行”权限,因此当puppet代理运行并尝试安装MS时,它会失败

我想做的是仅当需要安装包时才将MSI安装程序复制到本地目录

这就是我安装包并复制到本地目录的方式:

class app_install {
    package { '7-Zip 9.38 (x64 edition)':
        provider => windows,
        ensure   => installed,
        source => 'c:\\temp\7zip_testInstall.msi',
        install_options => ['INSTALLDIR=C:\apps64\7-Zip'],
    }
    file { 'c:/temp/7zip_testInstall.msi':
        ensure => 'file',
        mode   => '0660',
        group  => 'Domain Users',
        source => 'c:\\temp\7zip_testInstall.msi',
     }
} 当我运行puppet时,它发现包没有安装,它将文件复制到c:\temp,然后继续安装包。这是预期的行为。 在后续运行puppet代理时,它会发现包已经安装,因此会跳过安装,但如果c:\temp中缺少安装程序,则会继续将安装程序复制到c:\temp-鉴于这是一个临时文件夹,它会经常被清除

我试图避免的是在软件包已经安装的情况下复制安装程序

我不知道该怎么办

请指教,谢谢


Fr3edom21。

我能够回答我的问题

我没有使用“文件资源”将MSI从网络共享复制到c:\temp,而是在缺少所述程序的卸载注册表项版本值时,通过“exec资源”执行文件复制。 像这样:

exec { 'copy MSI to c:\temp':
command => 'C:\\windows\system32\cmd.exe /c "copy \\server\repo\7zip_testinstall.msi c:\\temp"',
unless => 'C:\Windows\System32\reg.exe query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{23170F69-40C1-2702-0938-00000100000 /f 9.38.00.0',
}

我希望这能帮助任何有类似问题的人

如果你走这条路,需要考虑两件事:

  • 如果您在64位计算机上使用32位版本的Puppet,
    C:\Windows\System32
    实际上被(Windows)重定向到32位System32二进制文件所在的
    C:\Windows\SystemWOW64
    。如果您想要64位Stase32二进制文件,则应该考虑使用<代码> C:\Windows \ SySnistic < /代码>。如果您使用的是64位版本的Puppet,则不会受到此问题的影响,不应使用sysnative,因为它不存在。如果您使用的是Puppet 3.7.3+,则可以使用来处理混合环境。有关更多信息,请参阅
  • HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
    是四个不同的可能位置之一。同样,使用32位Puppet时,除非您使用的是注册表模块,否则您将受制于注册表重定向。如果该软件可以32位安装,您可能需要检查它是否也存在于
    HKEY\U LOCAL\U MACHINE\software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
    ,如果您运行的是64位Puppet或不受注册表重定向程序的约束

Fr3edom21。

木偶的常见问题。最简单的解决方法是将安装程序存储在非临时位置。谢谢Felix,我考虑过这样做,但不想在本地计算机上保留两个包的副本。一个副本作为已安装的应用程序,另一个副本作为安装程序本身。您可以尝试使用WiP模块构建此副本。请让我们知道这是否适用于您,以及如何适用于您。如果您觉得这回答了您的问题,您应该接受它作为您的答案,这通常会起作用,但是有几件事需要注意。我将编辑答案,以便您看到这些答案。这样就可以了。:)