Server Fault is a question and answer site for system and network administrators. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I have been learning Puppet (as in, the last 24 hours) and have come up with the following module to install Tomcat. It works great, but I can't help but feel like this is not the most optimal way to do this - particularly around the name[1-4] part and steps/dependencies. If a "Puppet Master" :) could take a look at what I am doing and suggest improvements, I would be most appreciative.

class tomcat {
  # Tomcat                                                                            

  # Variables                                                                         

  # 1) Get the package                                                                
  file { "/root/tomcat6.tgz":
    ensure => "file",
    source => "puppet://puppet/tomcat/tomcat6.tgz",

  # 2) Untar the package                                                              
  define tomcat_expand() {
    exec { "/bin/tar xzf /root/tomcat6.tgz":
      cwd => "/usr/local",
      creates => $tomcatVersionedDir,
  tomcat_expand { name1:
    require => File["/root/tomcat6.tgz"],

  # 3) Create the symlink                                                             
  file { "${tomcatDir}":
    ensure => $tomcatVersionedDir,
    require => Tomcat_expand["name1"],

  # 4) Daemon source expand                                                           
  define tomcat_daemon_expand() {
    exec { "/bin/tar xzf commons-daemon-native.tar.gz":
      cwd => "${tomcatDir}/bin",
      creates => "${tomcatDaemonSrcDir}",
  tomcat_daemon_expand { name2:
    require => File["${tomcatDir}"],

  # 5) Configure daemon                                                               
  define tomcat_daemon_config() {
    exec { "./configure > puppet-config.out":
      path => "/bin:/usr/bin:.",
      cwd => "${tomcatDaemonSrcDir}/unix",
      creates => "${tomcatDaemonSrcDir}/unix/puppet-config.out",
  tomcat_daemon_config { name3:
    require => Tomcat_daemon_expand["name2"],

  # 6) Compile daemon                                                                 
  define tomcat_daemon_compile() {
    exec { "make clean && make":
      path => "/bin:/usr/bin:.",
      cwd => "${tomcatDaemonSrcDir}/unix",
      creates => "${tomcatDaemonSrcDir}/unix/jsvc",
  tomcat_daemon_compile { name4:
    require => Tomcat_daemon_config["name3"],

  # 7) Copy jsvc to bin directory                                                     
  file { "${tomcatBinDir}/jsvc":
    source => "${tomcatDaemonSrcDir}/unix/jsvc",
    require => Tomcat_daemon_compile["name4"],

Is this style OK?

Another thing... since this is doing things like unpacking code for one task, is there a good way to do clean up, while still maintaining the flow through the steps? For example, deleting the commons-daemon-1.0.2-native-src directory after jsvc has been copied to bin?

share|improve this question
up vote 5 down vote accepted

It looks way too "procedural," IMO. You have to think in a "declarative" way. I would personally just create .rpm's or .deb's from those tarballs, and specify another repo to use so all you would have to do is something like this:

 class tomcat {
   Package { "tomcat":
      ensure => installed,

   File { "/etc/init.d/tomcat":
      source => "puppet:///tomcat/tomcat.initd",

etc. Those multiple defines seem unnecessary as well, I'd go with just straight Exec clauses but with aliases for each Exec type.


 Exec { "/bin/tar xzf /root/tomcat6.tgz":
   name => "tomcat-extract",
   <rest of content here>


 File { "${tomcatDir}":
   require => Exec["tomcat-extract"],
share|improve this answer
Thanks Christian. I agree this is procedural, I even marked the comments with the order. It seems like Puppet can handle it, though. – Peter Sankauskas Aug 21 '10 at 20:16

Revisiting a very old thread for the sake of future visitors -- you can get tomcat6 rpms from and install from them (either straight from a repo mirror, or via your own local repo).

Not sure what the situation is like for debs though.

share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.