Puppet from Puppet Labs is a utility for controlling multiple machines from a single point. It allows for easy server roll outs, as well as keeping multiple servers in the same state. I have a server dedicated for Linux KVM virtualization, and because of this I have spun up about 10 VM’s, so 10 individual Linux installations. I use puppet to make sure that they all have the packages installed that I use on a daily basis, as well as a to make sure that anytime I make a change to my bash or zsh rc it gets populated out to all my servers. Also I store my public key in puppet, so any new server I provision will automatically be populated with it so I can easily SSH into it in a more secure manner.

My virtual servers

dave@[nexus]:~/$ virsh list --all
 Id Name                 State
 46 b-puppet             running
 47 b-ssh01              running
 48 codemaster           running
 49 frontend             running
 50 gradius              running
 51 gvoice               running
 52 ldap                 running
 53 ns1                  running
 54 overmind             running
 55 porthose             running
 56 redbull              running
 57 zfs-test             running
 58 skyevm               running
  - template_ubuntu-server-11.04-amd64 shut off

Using puppet I am able to control all of these virtual servers, as well as the virtual host itself, and the storage server that backs it. When I spin up a VM now, all I need to do is install the puppet client and point it to my puppet server and it pulls in the necessary configs to make that VM ready to use.

Puppet Modules

dave@[overmind]:/etc/puppet/modules/$ ls -1

When a new server is provisioned, puppet will insure that some of my favorite packages like htop, bwm-ng, and vim are installed. I also have a module called ‘motd’ that will allow me to easily control the /etc/motd.tail file using the power of puppet templates. NTP is also a good package that I install to make sure that all new servers are synced on the time, so there are no discrepancies in that. Another thing that is key here is I push out the puppet client configs, which will take the puppet client from a default installation, to one that is set to work with puppet in my environment.