Chef is a programmatic provisioning system and while it's certainly popular, I prefer a declarative solution for things like this. The weakness of programmatic systems is their strength. Meaning that you can code whatever you want, but at the price of coding bugs. And bugs in provisioning can do horrible things to large numbers of servers in a very short interval.
Declarative systems have a fixed syntax and rule relationships, so it's easy to scan them beforehand and catch many common mistakes. Also, you don't have to be an ace programmer to code rules. Usually.
So I'm a puppet fan myself. Although the puppet docs aren't always as obvious as they ought to be, and configuring Apache is a prime example of where they assume you know what needs to be done at the higher levels so they only explain the lower-level stuff.
Ansible's speciality is that is is an agent-less "push" system. Puppet and Chef rely on having a client agent installed that "pulls" the maintenance into the client and applies it. It's not actually all that bad as far as specifying stuff goes if you're OK with YAML, but again, I prefer Puppet, which I think is tidier. However, Ansible is definitely useful for doing the initial push of the Puppet agent out to a new client!
I don't install software from source, myself. I build RPMS, debs, or Solaris packages as part of the prep work for production (
Jenkins can help, but I used to do fine with just
Ant). Even my
JEE modules are RPM-packaged, since that allows me to do whatever setup needs to be done external to the server, such as building work resource directories. There is/was a tool that could generate Solaris, RPM and deb from a common spec file, although it had its limitations. I'm not sure of its current state, since I no longer deal with Solaris in production.
There are also, of course, systems that work on the idea that your applications and servers should be built as prototypes and replicated as needed. Stuff like Docker, pre-packaged VMs (Vagrant), and full cloud solutions. My project this week, in fact, is to work with the Apache stratos Paas (Platform as a service) system, which is geared towards scalable management of server systems known as "cartridges". It's huge, it's complex, it's not very tidy and I spent 2 days just trying to get Maven to build it. But it's popular in some circles, so I'm slogging my way through it. It used Puppet as its deployment tool, incidentally.