MPI – Managing multiple customers within a single environment

Written by Ger Apeldoorn. Posted in Manageable Puppet Infrastructure

Intro

This is set in the Manageable Puppet Infrastructure, but should be quite useable if you're not using it.

You want to manage multiple clients within a single environment. (You probably don't want to create seperate environments or puppetmasters, because that creates quite a bit of overhead in the long run).

But how do we keep things flexible? It's quite simple, use Hiera and classes in a smart way and you're there!

One note; this simple setup only works if you do not have any naming conflicts in the modules. e.g. customer1 needs puppetlabs/apache and another needs another module named apache. In that case, you do need seperate environments.

Get that $customer variable filled

You'll need a way to let Puppet know what customer a node belongs to. There are several ways:

Facter variables can be overridden quite easily. Use the ENC or Hiera!

  • Getting the info from Hiera, see below.
  • Set it from the ENC.

Adding a global $customer variable

In my site.pp:

Example: hieradata/hosts/myserver.customer.com.yaml

That's an easy way to get the $customer (global) variable filled!

Putting it to use!

Roles

With the MPI, you've created a baserole that applies to all hosts.

We can still use that, just be aware that those resources/includes apply to ALL customers.

Also, we'd like a baseclass for each customer. Within the roles-module, that's a piece of cake.

Hiera

You can add a level for customer-specific settings.

Now, we can add a yaml file for each customer and assign the role::customer::base there.

Example: hieradata/customer/mycustomer1.yaml

Of course, you can add other customer-specific settings as well here!

Feedback is welcome, leave a message!