Назад | Перейти на главную страницу

Настройка Tomcat с помощью Puppet (вопрос новичка)

Я изучал Puppet (например, последние 24 часа) и придумал следующий модуль для установки Tomcat. Он отлично работает, но я не могу не чувствовать, что это не самый оптимальный способ сделать это, особенно в name[1-4] часть и шаги / зависимости. Если "Кукловод":) мог бы взглянуть на то, что я делаю, и предложить улучшения, я буду очень признателен.


class tomcat {
  ####                                                                                
  # Tomcat                                                                            

  # Variables                                                                         
  $tomcatVersionedDir="/usr/local/apache-tomcat-6.0.29"
  $tomcatDir="/usr/local/tomcat"
  $tomcatBinDir="${tomcatDir}/bin"
  $tomcatDaemonSrcDir="${tomcatBinDir}/commons-daemon-1.0.2-native-src"

  # 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"],
  }
}

Это нормально?

Другое дело ... поскольку это делает такие вещи, как распаковка кода для одной задачи, есть ли хороший способ выполнить очистку, сохраняя при этом поток через шаги? Например, удаление commons-daemon-1.0.2-native-src каталог после jsvc был скопирован на bin?

Это выглядит слишком "процедурным", ИМО. Вы должны мыслить «декларативно». Я бы лично просто создал .rpm или .deb из этих тарболов и указал другое репо для использования, поэтому все, что вам нужно сделать, это что-то вроде этого:

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

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

Эти множественные определения тоже кажутся ненужными, я бы использовал только прямые предложения Exec, но с псевдонимами для каждого типа Exec.

Пример:

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

 ...

 File { "${tomcatDir}":
   ...
   require => Exec["tomcat-extract"],
   ...
 }

Вернемся к очень старой ветке ради будущих посетителей - вы можете получить tomcat6 rpms из http://www.jpackage.org/ и установить с них (либо прямо с зеркала репо, либо через собственное локальное репо).

Не знаю, как обстоят дела с дебютом.