Add code and set up Code Manager
Set up your control repo, create a Puppetfile, and configure Code Manager so you can start adding content to your Puppet Enterprise (PE) environments.
The control repo is where you store your code. Code in your control repo is usually bundled in modules.
The Puppetfile specifies detailed information about each environment's Puppet code and data, including where to get that code and data from, where to install it, and whether to update it.
Code Manager automates the management and deployment of your Puppet code. PE doesn't require Code Manager, but it is helpful for ensuring Puppet syncs code to your primary server and all your servers run new code at the same time.
Create a control repository from the Puppet template
To create a control repository (repo) that includes a standard recommended structure, code examples, and configuration scripts, base your control repo on the Puppet control repo template. This template covers most customer situations.
To base your control repo on the Puppet control repository template, you must set up a private SSH key (so your primary server can identify itself to your Git host), copy the control repo template to your development workstation, set your own remote Git repository as the default source, and then push the template contents to that source.
environment.conffile to implement a
site-modules/directory for roles, profiles, and custom modules.
config_versionscripts to notify you which control repo version was applied to the agents.
- Basic code examples for setting up roles and profiles.
- An example
hieradatadirectory that matches the default hierarchy .
- A Puppetfile to manage content maintained in your environment.
Generate a private SSH key to allow access to the
This SSH key cannot require a password.
Generate the key pair:
ssh-keygen -t ed25519 -P '' -f /etc/puppetlabs/puppetserver/ssh/id-control_repo.ed25519
Set appropriate permissions so that the
pe-puppetuser can access the key:
puppet infrastructure configure
Your keys are now located in
Configure your Git host to use the SSH public key you generated. The process to do this is different for every Git host. Usually, you create a user or service account, and then assign the SSH public key to it.
Code management needs read access to your control repository, as well as any module repositories referenced in the Puppetfile.
See the your Git host docs for detailed instructions on adding SSH keys to your Git server. Commonly used Git hosts include:
- Generate the key pair:
Create a repository in your Git account, with the name you want your control repo
Steps for creating a repository vary, depending on what Git host you are using (GitHub, GitLab, Bitbucket, or another provider). See your Git host's documentation for complete instructions.
For example, on GitHub:
- Click + at the top of the page, and choose New repository.
- Select the account Owner for the repository.
Name the repository (for example,
- Note the repository's SSH URL for later use.
If you don't already have Git installed, run the following command on your
yum install git
From the command line, clone the Puppet
git clone https://github.com/puppetlabs/control-repo.git
Change directory into your contro repo.
cd <NAME OF YOUR CONTROL REPO>
Remove the template repository as your default
git remote remove origin
Add the control repository you created as the
git remote add origin <URL OF YOUR GIT REPOSITORY>
Push the contents of the cloned control repo to your remote copy of the control
git push origin production
You now have a control repository based on the Puppet
control-repo template. When you make changes to this
repo on your workstation and push those changes to the remote copy of the control
repo on your Git server, Code Manager deploys your infrastructure changes.
You also now have a Puppetfile available for you to start adding and managing content, like module code.
Configure Code Manager
Code Manager stages, commits, and synchronizes your code, automatically managing your environments and modules when you make changes.
Enable Code Manager
Set parameters in the console to enable Code Manager and connect your primary server to your Git repository.
pe-puppetuser to access your Git repositories. The SSH key must be:
- Owned by the
- Located on the primary server.
- Located in a directory the
pe-puppetuser has permission to view, such as
These steps use the
puppet job command. To use this
command, you must have permission to run jobs and have access to the primary
In the console, click Node groups, locate the
PE Master node group, and set these parameters for
trueto enable Code Manager.
r10k_remote, enter a string that is a valid SSH URL for your Git control repository, such as
git@<YOUR.GIT.SERVER.COM>:puppet/control.git.Important: Some Git providers have additional requirements for enabling SSH access. For example, BitBucket requires
ssh://at the beginning of the SSH URL (such as
ssh://git@<YOUR.GIT.SERVER.COM>:puppet/control.git). See your provider's documentation for this information.
r10k_private_key, enter a string specifying the path to the SSH private key that permits the
pe-puppetuser to access your Git repositories, such as
- Click Commit.
On the command line, run
puppet job run --nodes <NODE NAME>where
<NODE NAME>is the name of your primary server. For example:
puppet job run --nodes small-doubt.delivery.puppetlabs.net
Set up authentication for Code Manager
To securely deploy environments, Code Manager needs an authentication token for both authentication and authorization.
Before requesting an authentication token, you must assign a user to the deployment role.
In the Puppet Enterprise (PE) console, create a deployment
Tip: Create a dedicated deployment user for Code Manager to use.
Add the deployment user to the Code Deployers
When you install PE, this role is automatically created with default permissions for code deployment and token lifetime management.
- Click Generate Password to create a password for the deployment user.
Request an authentication token for deployments
To securely deploy your code, request an authentication token for the deployment user.
The default lifetime for authentication tokens is one hour. You can use the
default expiry permission set to change the token lifetime to a
duration better suited for a long-running, automated process.
puppet-access command to generate the authentication token.
From the command line on the primary server, run
puppet-access login --lifetime 180d. This command requests the token and sets the token lifetime to 180 days.Tip: You can specify additional settings in this command, such as the token file's location or your RBAC API URL, as explained in Configuration file settings for puppet-access.
- Enter the deployment user's username and password when prompted.
The generated token is stored in a file for later use. The default token storage location is
~/.puppetlabs/token. You can run
show to view the token.
Test the connection and deploy your code
Make sure Code Manager can connect to your control repository, make a test deployment to a single environment,and then deploy code to all environments.
To test the connection to the control repo, run:
puppet-code deploy --dry-run
If the control repo is set up properly, this command fetches and displays a list of environments in the control repo as well as the total number of environments.
If an environment is not set up properly or causes an error, it does not appear in the returned list. Check the Puppet Server log for details about the errors.
If the control repo connection works, test Code Manager by deploying a single environment. From the command line, run:
puppet-code deploy my_test_environment --waitThe
--waitflag returns results after the deployment is finished.
If Code Manager is configured correctly, this command deploys the test environment and returns deployment results with the SHA (a checksum for the content stored) for the control repo commit.
If the deployment does not work, review the Code Manager configuration steps or refer to Troubleshooting for help.
After enabling and testing Code Manager, you can
trigger Code Manager to deploy all environments. SSH
into your primary server and run:
puppet-code deploy --all --waitYou can also use
puppet-code deploy <ENVIRONMENT> --waitto deploy a specific environment.