Environment isolation prevents resource types from leaking between your various environments.
If you use multiple environments with Puppet, you might encounter issues with multiple versions of the same resource type leaking between your various environments on the master. This doesn’t happen with Puppet’s built-in resource types, but it can happen with any other resource types.
This problem occurs because Ruby resource type bindings are global in the Ruby runtime. The first loaded version of a Ruby resource type takes priority, and then subsequent requests to compile in other environments get that first-loaded version. Environment isolation solves this issue by generating and using metadata that describes the resource type implementation, instead of using the Ruby resource type implementation, when compiling catalogs.
Note: Other environment isolation problems, such as external helper logic issues or varying versions of required gems, are not solved by the generated metadata approach. This fixes only resource type leaking. Resource type leaking is a problem that affects only masters, not agents.
To use environment isolation, generate metadata files that Puppet can use instead of the default Ruby resource type implementations.
puppet generate types --environment <ENV_NAME>for each of your environments. For example, to generate metadata for your production environment, run:
puppet generate types --environment production
puppet generate types --environment <ENV_NAME> --force
To use environment isolation with r10k, generate types for each environment every time r10k deploys new code. (Environment isolation is not supported with r10k in Puppet Enterprise.)
To generate types with r10k, use one of the following methods:
generate typescommand after code deployment.
generate typesas a post run command.
If you have enabled environment-level purging in r10k, whitelist the
resource_types folder so that r10k doesn’t purge it.
Note: In Puppet Enterprise, environment isolation is provided by Code Manager. Environment isolation is not supported for r10k with Puppet Enterprise.
generate types command cannot generate certain types, if the type generated has missing or inaccurate information, or if the generation itself has errors or fails, you will get a catalog compilation error of “type not found” or “attribute not found.”
To fix these errors:
Ensure that your Puppet resource types are correctly implemented. Refactor any problem resource types.
Regenerate the metadata by removing the environment’s
.resource_types directory and running the
generate types command again.
If you continue to get catalog compilation errors, disable environment isolation to help you isolate the error.
To disable environment isolation in open source Puppet:
generate typescommand from any r10k hooks.
To disable environment isolation in Puppet Enterprise:
/etc/puppetlabs/puppetserver/conf.d/pe-puppet-server.conf, remove the
service pe-puppetserver reload
.resource_typesdirectories from your staging code directory,
When you run the
generate types command, it scans the entire environment for resource type implementations, excluding core Puppet resource types.
generate types command accepts the following options:
--environment <ENV_NAME>: The environment for which to generate metadata. If you don’t specify this argument, the metadata is generated for the default environment (
--force: Use this flag to overwrite all previously generated metadata.
For each resource type implementation it finds, the command generates a corresponding metadata file, named after the resource type, in the
It also syncs the files in the
.resource_types directory so that:
The generated metadata files, which have a .pp extension, exist in the code directory. If you are using Puppet Enterprise with Code Manager and file sync, these files appear in both the staging and live code directories. The generated files are read-only. Do not delete them, modify them, or use expressions from them in manifests.