Creating environments
An environment is a branch that gets turned into a directory on your primary Puppet server. Environments are turned on by default.
Environment structure
The structure of an environment follows several conventions.
When you create an environment, you give it the following structure:
-
It contains a
modules
directory, which becomes part of the environment’s default module path. -
It contains a
manifests
directory, which is the environment’s default main manifest. -
If you are using Puppet 5, it can optionally contain a
hiera.yaml
file. -
It can optionally contain an
environment.conf
file, which can locally override configuration settings, includingmodulepath
andmanifest
.Note: Environment names can contain lowercase letters, numbers, and underscores. They must match the following regular expression rule:\A[a-z0-9_]+\Z
. If you are using Puppet 5, remove theenvironment_data_provider
setting.
Environment resources
An environment specifies resources that the primary server uses when compiling
catalogs for agent nodes. The modulepath
, the main manifest, Hiera data, and the config version script, can all be
specified in environment.conf
.
The modulepath
The modulepath
is the list of directories Puppet loads modules from. By default, Puppet loads modules first from the environment’s
directory, and second from the primary server's puppet.conf
file’s basemodulepath
setting, which can be multiple directories. If the modules directory is empty or
absent, Puppet only uses modules from directories in
the basemodulepath
.
Related topics: module path.
The main manifest
The main manifest is the starting point for compiling a catalog. Unless you say
otherwise in environment.conf
, an environment uses the global
default_manifest
setting to determine its main manifest. The
value of this setting can be an absolute path to a manifest that all environments
share, or a relative path to a file or directory inside each environment.
The default value of default_manifest
is
./manifests
— the environment’s own manifests directory. If the
file or directory specified by default_manifest
is empty or absent,
Puppet does not fall back to any other manifest.
Instead, it behaves as if it is using a blank main manifest. If you specify a value
for this setting, the global manifest setting from puppet.conf
is
not be used by an environment.
Related topics: main manifest, environment.conf, default_manifest setting, puppet.conf.
Hiera data
Each environment can use its own Hiera hierarchy and provide its own data.
Related topics: Hiera config file syntax.
The config version script
Puppet automatically adds a config version to every catalog it compiles, as well as to messages in reports. The version is an arbitrary piece of data that can be used to identify catalogs and events. By default, the config version is the time at which the catalog was compiled (as the number of seconds since January 1, 1970).
The environment.conf file
An environment can contain an environment.conf
file,
which can override values for certain settings.
The environment.conf
file overrides these
settings:
-
modulepath
-
manifest
-
config_version
-
environment_timeout
Related topics: environment.conf
Create an environment
Create an environment by adding a new directory of configuration data.
# /etc/puppetlabs/code/environments/test/environment.conf
# Puppet Enterprise requires $basemodulepath; see note below under "modulepath".
modulepath = site:dist:modules:$basemodulepath
# Use our custom script to get a git commit for the current state of the code:
config_version = get_environment_commit.sh
Related topics: Deploying environments with r10k, Code Manager control repositories, disable_per_environment_manifest
Assign nodes to environments via an ENC
You can assign agent nodes to environments by using an external node classifier (ENC). By default, all nodes are assigned to a default environment named production.
The interface to set the environment for a node is different for each ENC. Some ENCs cannot manage environments. When writing an ENC:
- Ensure that the environment key is set in the YAML output that the ENC returns. If the environment key isn’t set in the ENC’s YAML output, the primary server uses the environment requested by the agent.
Assign nodes to environments via the agent's config file
You can assign agent nodes to environments by using the agent’s config file. By default, all nodes are assigned to a default environment named production.
To configure an agent to use an environment:
-
Open the agent's
puppet.conf
file in an editor. -
Find the
environment
setting in either the agent or main section. -
Set the value of the
environment
setting to the name of the environment you want the agent to be assigned to.
When that node requests a catalog from the primary server, it requests that environment. If you are using an ENC and it specifies an environment for that node, it overrides whatever is in the config file.
Global settings for configuring environments
The settings in the primary server's puppet.conf
file configure how
Puppet finds and uses environments.
environmentpath
The environmentpath
setting is the list of directories where
Puppet looks for environments. The default value
for environmentpath
is $codedir/environments
. If
you have more than one directory, separate them by colons and put them in order of
precedence.
temp_environments
is searched before
environments
:
$codedir/temp_environments:$codedir/environments
If environments with the same name exist in both paths, Puppet uses the first environment with that name that it encounters.
Put the environmentpath
setting in the main section of the
puppet.conf
file.
basemodulepath
The basemodulepath
setting lists directories of global modules that
all environments can access by default. Some modules can be made available to all
environments. The basemodulepath
setting configures the global
module directories.
By default, it includes $codedir/modules
for user-accessible modules
and /opt/puppetlabs/puppet/modules
for system modules.
Add additional directories containing global modules by setting your own value for
basemodulepath
.
Related topics: modulepath.
environment_timeout
The environment_timeout
setting sets how often the primary
server refreshes information about environments. It can be overridden
per-environment.
This setting defaults to 0 (caching disabled), which lowers the performance of your primary server but makes it easy for new users to deploy updated Puppet code. After your code deployment process is mature, change this setting to unlimited.
All code in Ruby and Puppet loaded from the environment is cached. Inputs to compilation (for example, facts and looked up values) and the resulting catalog, are not cached.
disable_per_environment_manifest
The disable_per_environment_manifest
setting lets you specify
that all environments use a shared main manifest.
When disable_per_environment_manifest
is set to true, Puppet uses the same global manifest for every
environment. If an environment specifies a different manifest in
environment.conf
, Puppet does
not compile catalogs nodes in that environment, to avoid serving catalogs with
potentially wrong contents.
If this setting is set to true, the default_manifest
value must be
an absolute path.
default_manifest
The default_manifest
setting specifies the main
manifest for any environment that doesn’t set a manifest value in
environment.conf
. The default value of
default_manifest
is ./manifests
— the
environment’s own manifests directory.
The value of this setting can be:
-
An absolute path to one manifest that all environments share.
-
A relative path to a file or directory inside each environment’s directory.
Related topics: default_manifest setting.
Configure the environment timeout setting
The enviroment_timeout
setting determines how often the primary Puppet server caches the data it loads from an environment.
For best performance, change the settings after you have a mature code deployment
process.
environment-timeout
setting can be overridden per-environment in
environment.conf
.