我在 Windows 上运行 Puppet,我想升级使用 msi 安装的包 (java)。我使用以下方式安装了该包
package { 'java':
ensure => installed,
provider => 'msi',
source => 'S:\jdk1.6.0_30.msi',
install_options => { 'INSTALLDIR' => 'C:\tools\java' },
}
现在我想升级到版本 31,因此我尝试运行
package { 'java':
ensure => installed,
provider => 'msi',
source => 'S:\jdk1.6.0_31.msi',
install_options => { 'INSTALLDIR' => 'C:\tools\java' },
}
这实际上并没有升级,因为包“java”已经安装。当我尝试将“ensure”值更改为最新时,puppet 说提供程序类型必须具有“可升级”功能。
这仅仅是 Windows 的限制吗?有没有办法使用 msi 包升级现有的 Java 安装?
答案1
这仅仅是 Windows 的限制吗?
这MSI 提供商与其他软件包提供商相比,功能似乎相当有限。这当然不是 Windows/MSI 的限制。我相信 Windows 提供了使这些选项发挥作用所需的一切。
有没有办法使用 msi 包升级现有的 Java 安装?
一个选项可能是放弃包 msi 提供程序,而只需使用 Exec 语句即可完成所有操作。该msiexec
命令有很多选项。
您可能还会想出一种安排方法,以便如果需要进行升级,则先清除旧版本。然后安装新版本,您可能必须在某个文件或注册表中跟踪该版本,因为 MSI 提供商不会向您提供有关该版本的任何信息。
答案2
Puppet 的 Windows MSI 插件无法理解版本。与 Linux 包管理系统不同,Puppet 无需查看元数据目录参考即可了解可用的版本。
以下内容是临时起意,未经测试,但可以为您提供一种启用升级的方法。每当您获得新版本时,请将其链接起来。当您确定所有内容都已升级时,可以从列表中删除旧版本。
package { 'java':
ensure => absent,
provider => 'msi',
source => 'S:\jdk1.6.0_30.msi',
install_options => { 'INSTALLDIR' => 'C:\tools\java' },
}
-> #chaining operator forces uninstall before install
package { 'java-1.6.0_31':
ensure => installed,
provider => 'msi',
source => 'S:\jdk1.6.0_31.msi',
install_options => { 'INSTALLDIR' => 'C:\tools\java' },
}
答案3
更新:该msi
提供商已被取代视窗提供商,即versionable
。现在应该可以按预期工作。