As part of the long upgrade to become fully compatible with puppet 4 and drop puppet 3 support — version 4.13+ of the stdlib module introduced some breaking changes for other modules that I use. I recently upgrade some individual modules using the ‘puppet module upgrade’ method.
Upon upgrading, I received the following message:
Error: Evaluation Error: Error while evaluating a Function Call, undefined method `function_deprecation' ...
The solution, for now, until the modules that I use are upgraded to work with the newer version of stdlib, is to downgrade to version 4.12 of puppetlabs-stdlib.
Before downgrading, check to see if there are other modules which require a version greater than 4.12, ie:
> for file in $(find modules/ -type f -name metadata.json); do echo -n ${file}; echo -n ": "; egrep -i stdlib ${file} || echo ""; done modules//apt/metadata.json: {"name":"puppetlabs/stdlib","version_requirement":">= 4.5.0 < 5.0.0"} modules//archive/metadata.json: "name": "puppetlabs/stdlib", modules//concat/metadata.json: {"name":"puppetlabs/stdlib","version_requirement":">= 4.2.0 < 5.0.0"} modules//ec2tagfacts/metadata.json: {"name":"puppetlabs/stdlib","version_requirement":">= 3.2.0 < 5.0.0"}, modules//epel/metadata.json: {"name":"puppetlabs/stdlib","version_requirement":">= 3.0.0"} modules//gnupg/metadata.json: modules//inifile/metadata.json: modules//java/metadata.json: {"name":"puppetlabs/stdlib","version_requirement":">= 2.4.0 < 5.0.0"} modules//jenkins/metadata.json: {"name":"puppetlabs/stdlib","version_requirement":">= 4.6.0 < 5.0.0"}, modules//lvm/metadata.json: {"name":"puppetlabs/stdlib","version_requirement":">=4.1.0 < 5.0.0"} modules//mysql/metadata.json: {"name":"puppetlabs/stdlib","version_requirement":">= 3.2.0 < 5.0.0"}, modules//python/metadata.json: {"name":"puppetlabs/stdlib","version_requirement":">= 4.6.0 < 6.0.0"}, modules//rvm/metadata.json: {"name":"puppetlabs/stdlib","version_requirement":">=4.2.0"}, modules//staging/metadata.json: modules//vcsrepo/metadata.json: modules//zypprepo/metadata.json:
The following modules require a version of puppetlabs-stdlib greater than 4.12:
- apt – 4.5+
- concat – 4.2.0+
- jenkins- 4.6.0+
- python4.6.0+
- rvm – 4.2.0+
Sting with the apt module, the apt module is version 4.1.0. According to the puppetlabs-apt change log page, they recommend staying on version 2.3.0 unless you’re ready for the latest puppet 4 changes (they actually say any version 2 release but we’ll let that go after figuring it out…), so we need to downgrade that module first:
> puppet module upgrade puppetlabs-apt --version 2.3.0 --modulepath=modules/ Notice: Preparing to upgrade 'puppetlabs-apt' ... Notice: Found 'puppetlabs-apt' (v2.4.0) in .../puppet/modules ... Notice: Downloading from https://forgeapi.puppetlabs.com ... Error: Could not upgrade module 'puppetlabs-apt' (v2.4.0 -> v2.3.0) Downgrading is not allowed.
Ok, so you can’t use the upgrade command to downgrade modules, so I need to be a little more heavy handed. I removed the apt module manually:
> rm -rf modules/apt/
Next, install version 2.3.0 of puppetlabs-apt:
> puppet module install puppetlabs-apt --version 2.3.0 --modulepath=modules/ Notice: Preparing to install into .../puppet/modules ... Notice: Downloading from https://forgeapi.puppetlabs.com ... Notice: Installing -- do not interrupt ... .../puppet/modules └─┬ puppetlabs-apt (v2.3.0) └── puppetlabs-stdlib (v4.19.0)
Now that I’m deep into this problem, I see great value in using something like r10k or Code Manager (which uses r10k) to manage these modules and dependencies.
Another potentially useful tip – I removed the puppetlabs-stdlib module and ran a module list command, and it then told me which modules were dependent upon the missing module, and which versions:
> puppet module list --modulepath=modules/ Warning: Missing dependency 'puppetlabs-stdlib': 'puppetlabs-apt' (v2.3.0) requires 'puppetlabs-stdlib' (>= 4.5.0 < 5.0.0) 'puppet-archive' (v2.0.0) requires 'puppetlabs-stdlib' (>= 4.13.0 < 5.0.0) 'puppetlabs-concat' (v2.2.0) requires 'puppetlabs-stdlib' (>= 4.2.0 < 5.0.0) 'bryana-ec2tagfacts' (v0.2.0) requires 'puppetlabs-stdlib' (>= 3.2.0 < 5.0.0) 'stahnma-epel' (v1.2.2) requires 'puppetlabs-stdlib' (>= 3.0.0) 'puppetlabs-java' (v1.5.0) requires 'puppetlabs-stdlib' (>= 2.4.0 < 5.0.0) 'rtyler-jenkins' (v1.7.0) requires 'puppetlabs-stdlib' (>= 4.6.0 < 5.0.0) 'puppetlabs-lvm' (v0.7.0) requires 'puppetlabs-stdlib' (>=4.1.0 < 5.0.0) 'puppetlabs-mysql' (v3.10.0) requires 'puppetlabs-stdlib' (>= 3.2.0 < 5.0.0) 'stankevich-python' (v1.14.2) requires 'puppetlabs-stdlib' (>= 4.6.0 < 6.0.0) 'maestrodev-rvm' (v1.13.1) requires 'puppetlabs-stdlib' (>=4.2.0)
Moving on to using r10k..
gem install r10k ...
I then created a Puppetfile using my modules and am using r10k to manage them.
Note: converting to using r10k took around 20 minutes — if you’re not using r10k (or Code Manager), it’s time to start.
Leave a Reply