I've been contracted to design a deployment system for installing a variety of operating systems onto bare metal. The OS flavors will most likely be RedHat and Suse-based GNU/Linux as well as Solaris, all on Intel hardware. Knowing I'm certainly not the first with such a task, I thought I'd look around and see what others have done. I've spent the better part of the last two weeks evaluating existing environments. I've looked at a variety of different possibilities, concentrating on toolsets that have at least an option of integration with Puppet. I found mainly two: Cobbler and Foreman.
I looked closely at Foreman because of its promise of Puppet integration, and let me tell you, I am not impressed. (Hint: look for the documentation.) Cobbler is rather good; its strength is in provisioning of RedHat-based systems, though others can be added. I like the way it uses templates to generate configuration files for DHCPD and BIND; whoever thought that up was certainly on the right track. Cobbler also supports triggers -- scripts that can be invoked at different stages of deployment. All in all, quite good.
After quite a bit of scalp scratching and some sleepless nights, I've decided that we won't use either:
- Foreman just isn't there yet. I like its Puppet integration, but that's about it!
- Cobbler would be just perfect for the job, but it is a bit too complicated for the operators who'll take over when I've finished.
So, what now? I believe I've found the perfect start. Recall what I said in the first sentence: multi-OS. That is the most important: I must be able to boot a variety of operating systems in order to kick off an OS installation. All machines will be able to PXE boot, so I'm going to go with gPXE respectively with its successor iPXE. Why?
- gPXE allows me to chain to a boot loader that I can invoke via HTTP (instead of TFTP).
- In doing so, I can call a CGI that determines which OS flavor to install, looking up, say, the machine's MAC address in a database and providing gPXE with the URLs to the appropriate kernels and startup options.
- From there, I can generate (i.e. pull from a database) appropriate kickstart, autoyast or jumpstart scripts to provision the servers.
My client has a large number of machines but a limited variety of uses for these. So I have to be able to provision, say, machines of type mail server or database, or Tomcat server. The database schema will be quite simple, the amount of information required for provisioning the bare metal as well. And I forgot to mention: the whole thing must be point-and-click.
This morning I did a demo, and I think I'm on the right track. It's been several years since I got down and dirty with OS installs, but I'm enjoying it.