I am a full-time developer working on Puppet at Puppet Labs. I also co-authored Pro Puppet.
Puppets are certainly sufficient for your purposes. Here is one way to solve this problem using Puppet. First, I will turn to dependency management, since they should only be managed once, no matter how many instances of the application are managed. Then I will talk about how to handle several installations of your application using a specific resource type in the resource type Puppet and vcsrepo .
Firstly, regarding the organization of puppet code to handle several installations of the same application. The dependencies you specify, such as beanstalkd, solr, and PHP extensions, must be modeled using the Puppet class. This class will be included in the configuration directory only once, regardless of how many copies of the application are managed on the node. An example of this class might be something like:
# <modulepath>/site/manifests/app_dependencies.pp class site::app_dependencies {
Now that you have the dependencies in the class, you can simply include this class in the nodes where your application will be deployed. This usually happens in the site.pp file or in the Puppet Dashboard if you use the web interface.
# $(puppet config print confdir)/manifests/site.pp node www01 { include site::app_dependencies }
Next, you need to specify how to declare multiple instances of the application on the system. Unfortunately, right now there is no easy way to do this from the web interface, but you can use Puppet manifests and a specific resource type. This solution uses the vcsrepo resource to control the validation of the git repository for the application.
# <modulepath>/myapp/manifests/instance.pp define myapp::instance($git_rev='master') {
With this specific resource type, you can declare several installations of your application as follows:
# $(puppet config print confdir)/manifests/site.pp node www01 { include site::app_dependencies
Unfortunately, there is currently no easy-to-use way out of the box to make this information visible from the web GUI. However, of course, you can use the external Node API. For more information on pulling external data into Puppet, see these resources:
We hope this information helps.