Я изучал 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/ и установить с них (либо прямо с зеркала репо, либо через собственное локальное репо).
Не знаю, как обстоят дела с дебютом.