I recently received a customer question regarding how they best could control which packages and which versions were used on their production Solaris 11 servers. They had considered pointing each server at its own software repository - a common initial approach. A simpler method leverages one of dependency mechanisms we introduced with Solaris 11, but is not immediately obvious to most people.
Typically, most internal IT departments qualify particular versions for production use. What this customer wanted to do was insure that their operations staff only installed internally qualified versions of Solaris on their servers.
The easiest way of doing this is to leverage
the 'incorporate' type of dependency in a small package defined for each server type. From
the reference " Packaging and Delivering Software With
the Image Packaging System in Oracle® Solaris 11.1":
The incorporate dependency specifies that if
the given package is installed, it must be at
the given version, to
the given version accuracy. For example, if
the dependent FMRI has a version of 1.4.3, then no version less than 1.4.3 or greater than or equal to 1.4.4 satisfies
the dependency. Version 1.4.3.7 does satisfy this example dependency.
The common way to use incorporate dependencies is to put many of them in
the same package to define a surface in
the package version space that is compatible. Packages that contain such sets of incorporate dependencies are often called incorporations. Incorporations are typically used to define sets of software packages that are built together and are not separately versioned.
The incorporate dependency is heavily used in Oracle Solaris to ensurethat compatible versions of software are installed together. An example incorporate dependency is:
depend type=incorporate fmri=pkg:/driver/network/ethernet/
[email protected],5.11-0.175.0.0.0.2.1
So, to make sure only qualified versions are installed on a server, create a package that will be installed on
the machines to be controlled. This package will contain an incorporate dependency on
the "entire" package, which
controls the various components used to be build Solaris. Every time a new version of Solaris has been qualified for production use, create a new version of this package specifying
the new version of "entire" that was qualified. Once this new control package is available in
the repositories configured on
the production server,
the pkg update command will update that system to
the specified version. Unless a new version of
the control package is made available, pkg update will report that no updates are available since no version of
the control package can be installed that satisfies
the incorporate constraint.
Note that if desired,
the same package can be used to specify which packages must be present on
the system by adding either "require" or "group" dependencies;
the latter permits removal of some of
the packages,
the former does not. More details on this can be found in either
the section 5 pkg man page or
the previously mentioned reference document.
This technique of using package dependencies to constrain system configuration leverages
the SAT solver which is at
the heart of IPS, and is basic to how we package Solaris itself.