Unless I'm really reading the question wrong, I'd say for hosting web applications, you're going about it the wrong way.
I'd suggest having multiple nodes (virtual, or physical) and managing their config with puppet.
Your nodes could be a whole rack of 1U servers, or a bunch of powerful 3U multiprocessor servers running KVM and then an OS of your choice as virtualization guests.
Given 4 servers you could set them up as follows:
- Server 1: Load balancer + HTTP Node (running Varnish and Apache)
- Server 2: Load balancer + HTTP Node (running Varnish and Apache)
- Server 3: HTTP Node + DB Master(running Apache and MySQL)
- Server 4: HTTP Node + DB Slave(running Apache and MySQL)
It would be advantageous to have a fifth server, that runs services, such as nagios, munin, tftpd for a PXE boot environment, a small HTTP server for kickstart/preseed files, a DHCPd, maybe serial consoles via a Rocketport or similar.
The massive advantage of using Puppet to deploy your own systems, instead of having a single image, is that the resources are effectively self-documenting. It's a lot clearer, and less black-box than just having an image you drop onto servers. Plus it makes updates and changes to the image far simpler.