Verschiedene Versionen eines Puppet-Moduls in verschiedenen Environments

Wer z.B. zwei Versionen vom elasticsearch/elasticsearch installiert hat mit

puppet module install \
  -v 0.10.3 \
  --environment production \
  elasticsearch/elasticsearch

puppet module install \
  --environment feature \
  elasticsearch/elasticsearch

Wird schnell mal feststellen, dass man solche kryptischen Fehlermeldungen bekommt:

Error: Could not retrieve catalog from remote server: Error 500 on SERVER: Server Error: 
Evaluation Error: Error while evaluating a Resource Statement, 
Evaluation Error: Error while evaluating a Resource Statement, 
Could not autoload puppet/type/elasticsearch_plugin: 
Could not autoload puppet/provider/elasticsearch_plugin/plugin: 
undefined method `[]' for Facter:Module 
at /etc/puppetlabs/code/environments/production/modules/elasticsearch/manifests/plugin.pp:134:7 
at /etc/puppetlabs/code/environments/production/manifests/site.pp:9 on node c7.novalocal


Das Puppet Manifest dazu sieht folgendermassen aus:

class { 'elasticsearch':
  manage_repo  => true,
  repo_version => '2.x',
}

elasticsearch::instance { 'es-01': }

elasticsearch::plugin { 'lmenezes/elasticsearch-kopf':
  instances => 'es-01'
}

Auf der Suche nach der Ursache bin ich dann darauf gestossen, dass die Puppet Environments wohl nicht wirklich klar kommen, wenn die Type/Providers im Modul lib Verzeichnis in verschiedenen Environments in verschiedenen Versionen vorhanden sind. Ist somit blöd, wenn man in der Produktion Version x hat und auf dem Test-System Version y testen will. 

Bei Puppet 4.8.0 ist jetzt ein neuer Befehl dabei, welcher Metadaten zu den Type/Providers generiert und so das Problem  zumindest für elasticsearch löst:

puppet generate types --environment production
puppet generate types --environment feature

Das generiert dann einen Ordner .resource_types im jeweiligen Environment. 

Referenzen

Beliebte Posts aus diesem Blog