Before we get started I want to go over what it means to be highly available/fault tolerant. To have a pair of machines (the minimum!) in a cluster that provides redundency to a service or set of services. High availability is usually accomplished by a cluster framework like the one we will be using in this post. That being said there are a lot of tutorials online that show a partial implementation of this setup. My objective here is to have a more complete resource in one place. That said, this post still only scratches the surface of what you can do with Pacemaker/CoroSync.
Puppet is an infrastructure and configuration management toolset that no only unifies the management of multiple machines across multiple platforms. It allows for knowledge sharing, elimination of repetition, increase portability of configurations because it is platform agnostic. This is done by overlaying a domain-specific language (DSL) on top that can be shared across multiple systems, platforms, and architectures.