Server Fault is a question and answer site for system and network administrators. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

Using puppet I want to update packages on my (CentOS 5 & 6 servers) in a controlled way. Therefore I don't want to use ensure=>latest but rather ensure=>3.0.1-1.


class puppet::installation inherits puppet {
        package { "puppet":
            ensure => "3.0.1-1",

The update works alright but puppet agent keeps complaining that there is a difference:

/Stage[main]/Puppet::Installation/Package[puppet]/ensure: current_value 3.0.1-1.el6, should be 3.0.1-1 (noop)

I can solve this by changing the ensure rule to 3.0.1-1.el6 but than that won't work on CentOS 5.

Is there a short/clean way to solve this or do I have to write to seperate, os-releaseversion dependant rules.

I have been googling for a solution but didn't find anything pertaining to this particular question.

Any suggestion or reference to a relevant example would be appreciated.

share|improve this question
personally i use ensure => installed, and mirror the repos. That way you control what "latest" is, and when to update to it. – Sirex Nov 24 '12 at 19:09

You would have to set a variable with a case statement, sort of like this:

class puppet::installation inherits puppet {

        case $::operatingsystemrelease {
            '5':     { $puppet_ver = '3.0.1-1'}
            default: { $puppet_ver = '3.0.1-1.el6'}

        package { 'puppet':
            ensure => $puppet_ver,

However, it's a better design to use a params.pp file for this sort of logic. Read about params.pp here:

share|improve this answer

Puppet really doesn't have any functionality for this yet (though they really need it).

You can use the yum-versionlock yum plugin to lock specific RPM packages at specific versions, and then use puppet to control the versionlock configuration.

For some other workarounds, see this related question.

share|improve this answer

Actually, I was able to use the wildcard character to install a specific version of Python regardless of operating system. My package code for python is as follows.

package {
    "python-dev": ensure => "2.7.3*";
    "python-setuptools": ensure => installed;
    "python-pip": ensure => installed;
    "libxml2-dev": ensure => installed;
    "libxslt-dev": ensure => installed;

By using the 2.7.3* as the ensure version, it installed python 2.7.3-0ubuntu2.2 on my vagrant VM. I'm using Puppet version 2.7.19.

share|improve this answer
Check out the puppet style guide: – robbyt Dec 20 '14 at 2:54

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.