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
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 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
- Environment isolation (Puppet doc)
- SERVER-94 (Puppet Ticket)
- elasticsearch Puppet-Modul (GitHub)