仅当未安装 Windows MSI 软件包时才需要通过 puppet 复制文件
Need to copy a file via puppet only if a Windows MSI package is not installed
我是 Windows 上使用 puppet 的新手。
我正在尝试从我们网络上的共享文件夹安装 MSI 程序包,但是要执行权限,共享文件夹只有 "read",它没有 "execute" 权限,所以当人偶代理 运行s 并尝试安装 MS,但失败了。
我想做的是仅在需要安装软件包时将 MSI 安装程序复制到本地目录。
这就是我安装包并将其复制到本地目录的方式:
class app_install {
package { '7-Zip 9.38 (x64 edition)':
provider => windows,
ensure => installed,
source => 'c:\tempzip_testInstall.msi',
install_options => ['INSTALLDIR=C:\apps64-Zip'],
}
file { 'c:/temp/7zip_testInstall.msi':
ensure => 'file',
mode => '0660',
group => 'Domain Users',
source => 'c:\tempzip_testInstall.msi',
}
}
当我 运行 puppet 发现包未安装时,它会将文件复制到 c:\temp,然后继续安装包。这是预期的行为。
在 puppet 代理的后续 运行s 中,它发现该包已经安装,因此它跳过安装,但如果 c:\ 中缺少安装程序,则继续将安装程序再次复制到 c:\temp temp - 考虑到这是一个临时文件夹,它会经常被清除。
我试图避免的是在软件包已经安装的情况下复制安装程序。
我不知道该怎么做。
请指教,谢谢!
Fr3edom21.
我能够回答我的问题。
我没有使用 "file resource" 将 MSI 从网络共享复制到 c:\temp,而是仅在卸载注册表项版本值时通过 "exec resource" 执行文件复制因为缺少该程序。
像这样:
exec { 'copy MSI to c:\temp':
command => 'C:\windows\system32\cmd.exe /c "copy \server\repozip_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) to C:\Windows\SystemWOW64
where the 32-bit system32 binaries live. If you want the 64-bit system32 binaries, you should consider using c:\Windows\sysnative
. If you are on the 64-bit version of Puppet, you don't fall subject to this issue and should not use sysnative as it doesn't exist. If you are on Puppet 3.7.3+, you can use the $system32
fact to handle mixed environments. For more information see 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.
我是 Windows 上使用 puppet 的新手。 我正在尝试从我们网络上的共享文件夹安装 MSI 程序包,但是要执行权限,共享文件夹只有 "read",它没有 "execute" 权限,所以当人偶代理 运行s 并尝试安装 MS,但失败了。
我想做的是仅在需要安装软件包时将 MSI 安装程序复制到本地目录。
这就是我安装包并将其复制到本地目录的方式:
class app_install {
package { '7-Zip 9.38 (x64 edition)':
provider => windows,
ensure => installed,
source => 'c:\tempzip_testInstall.msi',
install_options => ['INSTALLDIR=C:\apps64-Zip'],
}
file { 'c:/temp/7zip_testInstall.msi':
ensure => 'file',
mode => '0660',
group => 'Domain Users',
source => 'c:\tempzip_testInstall.msi',
}
}
当我 运行 puppet 发现包未安装时,它会将文件复制到 c:\temp,然后继续安装包。这是预期的行为。 在 puppet 代理的后续 运行s 中,它发现该包已经安装,因此它跳过安装,但如果 c:\ 中缺少安装程序,则继续将安装程序再次复制到 c:\temp temp - 考虑到这是一个临时文件夹,它会经常被清除。
我试图避免的是在软件包已经安装的情况下复制安装程序。
我不知道该怎么做。
请指教,谢谢!
Fr3edom21.
我能够回答我的问题。
我没有使用 "file resource" 将 MSI 从网络共享复制到 c:\temp,而是仅在卸载注册表项版本值时通过 "exec resource" 执行文件复制因为缺少该程序。 像这样:
exec { 'copy MSI to c:\temp':
command => 'C:\windows\system32\cmd.exe /c "copy \server\repozip_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) toC:\Windows\SystemWOW64
where the 32-bit system32 binaries live. If you want the 64-bit system32 binaries, you should consider usingc:\Windows\sysnative
. If you are on the 64-bit version of Puppet, you don't fall subject to this issue and should not use sysnative as it doesn't exist. If you are on Puppet 3.7.3+, you can use the$system32
fact to handle mixed environments. For more information see 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.