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

时间:2015-03-17 17:21:36

标签: windows windows-installer puppet

我是在Windows上使用puppet的新手。 我尝试从我们网络上的共享文件夹安装MSI软件包,但是对权限这样做,共享文件夹是" read"只是,它没有"执行"权限因此,当木偶代理运行并尝试安装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。

1 个答案:

答案 0 :(得分:3)

我能够回答我的问题。

我没有使用“文件资源”将MSI从网络共享复制到c:\ temp,而是只有在所述程序的Uninstall注册表项版本值为的情况下才通过“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“File System Redirector”到C:\Windows\SystemWOW64 32位system32二进制文件直播。如果需要64位system32二进制文件,则应考虑使用c:\Windows\sysnative。如果您使用的是64位版本的Puppet,则不会遇到此问题,并且不应使用sysnative,因为它不存在。如果您使用的是Puppet 3.7.3+,则可以使用$system32 fact来处理混合环境。有关详细信息,请参阅Handling File Paths on Windows
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall是四个不同位置之一。再次使用32位Puppet,除非使用注册表模块,否则您将受到注册表重定向的限制。如果软件可以安装为32位,则可能需要检查它是否也存在于HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall,如果您运行的是64位Puppet,或者不受注册表重定向器的约束。

Fr3edom21。