Using package
on
Windows
The built-in package
resource type handles many different packaging systems on many
operating systems, so not all features are relevant everywhere. This page offers guidance and
tips for working with package
on Windows.
package { 'mysql':
ensure => '5.5.16',
source => 'N:\packages\mysql-5.5.16-winx64.msi',
install_options => ['INSTALLDIR=C:\mysql-5.5'],
}
package { "Git version 1.8.4-preview20130916":
ensure => present,
source => 'C:\code\puppetlabs\temp\windowsexample\Git-1.8.4-preview20130916.exe',
install_options => ['/VERYSILENT']
}
Supported package types: MSI and EXE
Puppet can install and remove MSI packages and executable
installers on Windows. Both package types use the default
windows
package provider.
Alternatively, a Chocolatey package provider is available on the Forge.
The source
attribute is required
When managing packages using the windows
package provider, you must
specify a package file using the source
attribute.
The source can be a local file or a file on a mapped network drive. For MSI installers, you
can use a UNC path. Puppet URLs are not supported for the
package
type’s source
attribute, but you can use
file
resources to copy packages to the local system. The
source
attribute accepts both forward- and backslashes.
The package name must be the DisplayName
The title (or name
) of the package must match the value of the package’s
DisplayName
property in the registry, which is also the value displayed
in the Add/Remove Programs or Programs and
Features control panels.
If the provided name and the installed name don’t match, Puppet assumes the package is not installed and tries to install it again.
DisplayName
: -
Install the package on an example system.
-
Run
puppet resource package
to see a list of installed packages. -
Copy the name of the package from the list.
Some packages (Git is a notable example) change their display names with every newly released version. See the section below on handling package versions and upgrades.
Install and uninstall options
The Windows package provider also supports package-specific
install_options
(such as install directory) and
uninstall_options
. These options vary across packages, so see the
documentation for the specific package you’re installing. Options are specified as an array
of strings or hashes.
MSI properties can be specified as an array of strings following the
property=key
pattern; use one string per property. Command line flags to
executable installers can be specified as an array of strings, with one string per flag.
For file path arguments within the install_options
attribute (such as
INSTALLDIR
), use backslashes (\
), not
forward slashes. Escape your backslashes appropriately. For more info, see Handling
file paths on Windows.
install_options
attribute, you must split the string on every space. For example, to make Puppet install a self-extracting executable package as:
./installer.exe /s /v"MANAGEMENT_SERVER=1.1.1.1 /l*v! c:\temp\log.txt /qn"
the proper syntax would be: install_options => [ '/s',
"/v\"MANAGEMENT_SERVER=${management_server}",
'/l*v!',
"${install_log}",
'/qn',
'"'
],
For more information, visit Install options with quotes or spaces.install_options => [ { 'INSTALLDIR' => ${packagedir} } ]
Handling versions and upgrades
Setting ensure =>
latest
(which requires the upgradeable
feature) doesn’t work on Windows, because
Windows doesn’t have central package repositories like on most
*nix systems.
There are two ways to handle package versions and upgrades on Windows.
Packages with real versions
Many packages on Windows have version metadata. To tell whether a package has usable
version metadata, install it on a test system and use puppet resource
package
to inspect it.
source
file and set ensure
=> '<VERSION>'
. For
example:package { 'mysql':
ensure => '5.5.16',
source => 'N:\packages\mysql-5.5.16-winx64.msi',
install_options => ['INSTALLDIR=C:\mysql-5.5'],
}
The next time Puppet runs, it will notice that the versions don’t match and will install the new package. This makes the installed version match the new version, so Puppet won’t attempt to re-install the package until you change the version in the manifest again.
The version you use in ensure
must exactly match the version string that
the package reports when you inspect it with puppet
resource
. If it doesn’t match, Puppet will repeatedly try to install it.
Packages that include version info in their
DisplayName
Some packages don’t embed version metadata; instead, they change their
DisplayName
property with each release. The Git packages are a notable example.
source
file and update
the resource’s title or name
to the new
DisplayName
. For
example:package { "Git version 1.8.4-preview20130916":
ensure => installed,
source => 'C:\code\puppetlabs\temp\windowsexample\Git-1.8.4-preview20130916.exe',
install_options => ['/VERYSILENT']
}
The next time Puppet runs, it will notice that
the names don’t match and will install the new package. This makes the installed name match
the new name, so Puppet won’t attempt to re-install the
package until you change the name in the manifest again.The name you use in the title must exactly match the name that the package reports when you
inspect it with puppet resource
. If it doesn’t match, Puppet will repeatedly try to install it.