Puppetで商用製品のインストールを実行するには

PuppetにはFile, Cronなどの組み込みのリソースに加えて、Execという任意のコマンドを実行できるリソースがあるため、スクリプト化出来る項目については基本的に何でも実施できる。
ここでは、IBM HTTP Server(以下IHS)のインストールを自動化してみた。
IHSについて詳しくはこちら。
http://ja.wikipedia.org/wiki/IBM_HTTP_Server
http://www-01.ibm.com/software/webservers/httpservers/
なお、今回は体験版を使用しており、製品版では上手く動かないかもしれないので注意。。orz
基本的な方針としては、1. tarファイルで提供されたIHSを一時ディレクトリに展開し、2. インストーラーをsilentモードで実行する、 の2点となる。まず、最初にマニフェストを貼り付けて、後は順次説明を加えていこう。。

マニフェスト

# どこかで設定: 今回はIHSだけだが、実際には他のツールでも共用しているので、virtual resource とする。。
@file { “/opt/local”:
  ensure=>directory,
}
class ihs_tools{
 #IHS
 realize (File[“/opt/local”])
 file {'/opt/local/ihs':
  ensure=>directory,
 }
 hugefilesexec {"/opt/local/ihs/ihs.7000.linux.ia32.tar":
  execresource=>"ihstar",
  subscribe => [File["/opt/local/ihs"]],
  onlyif=>"/usr/bin/test ! -f /opt/IBM/HTTPServer/bin/versionInfo.sh",
 }
 configfile {"/opt/local/ihs/ihs_responsefile.txt":
  ensure=>present,
 }
 exec { 'expandihsandinstallihs':
  command=>"/bin/tar -x -f /opt/local/ihs/ihs.7000.linux.ia32.tar -C /opt/local/ihs && /opt/local/ihs/IHS/install -options /opt/local/ihs/ihs_responsefile.txt -silent && /bin/rm -rf /opt/local/ihs/",
  creates=>'/opt/IBM/HTTPServer/bin/versionInfo.sh',
  subscribe=>[Exec["ihstar"], File["/opt/local/ihs/ihs_responsefile.txt"]],
  user => "root",
 }
}
# ここから関数
define hugefilesexec($execresource, $subscribe=[Package["glibc"]], $user = root, $unless = '/bin/false', $onlyif= '/bin/true', $timeout = 1200){
    $server = "fedora-intel1.jp.example.org"
    exec {"${execresource}":
            command =>"/usr/bin/wget http://$server/hugefiles/$name -O $name",
            subscribe=>$subscribe,
            unless=>$unless,
            onlyif=>$onlyif,
            timeout =>$timeout,
            creates => "$name",
            user => "$user",
    }
define configfile(owner = root, group = root, mode = 644,
                  backup = false, recurse = false, ensure = file, require = [Package["glibc"]],replace = true) {
    file { $name:
            mode => $mode,
            owner => $owner,
            group => $group,
            backup => $backup,
            recurse => $recurse,
            ensure => $ensure,
            replace => $replace,
            source => "puppet://$server/files/$operatingsystem$operatingsystemrelease/$name"
    }
 }
}

これに加えて、Puppetマスター(Fedora14)でhttpdを起動し、/var/www/html/hugefiles/opt/local/ihs/ihs.7000.linux.ia32.tar にインストール用のtarファイルを置いている。また、silentインストール用の設定ファイルとして、 /etc/puppet/files/CentOS5.5/opt/local/ihs/ihs_responsefile.txt を配置している。(/etc/puppet/files は fileserver.conf で [files] としてエクスポートしている。)

tarファイルの転送

tarファイルは普通に転送すればよいのだが、それなりにサイズが大きい(100MB以上。。)ため、 PuppetのFileリソースで運ぼうとするとサイズ超過で失敗する。
対策として、関数 hugefilesexec を作成している。基本的にはExecリソースを使用し、中でwget ww を実行するだけである。。 <<参考リンク>> http://groups.google.com/group/puppet-users/browse_thread/thread/7e91404c1673b2b1

インストーラーの実行

tarファイルを展開すると、中からインストーラーが出てくるので、これを実行するのだが、IHSの性質上インストールのプロセス内でいくつか追加の設定を行う必要があるため、このままインストーラーを起動しても失敗する。このため、事前に設定ファイル(応答ファイルと呼ばれる。。)を作成し、設定を提示しておく必要がある。<<参考リンク>>
http://publib.boulder.ibm.com/infocenter/wasinfo/v6r0/index.jsp?topic=/com.ibm.websphere.express.doc/info/exp/ae/rins_plugins_responsefile.html
応答ファイルの内容はバージョンごとに変わるので詳しくは書かない、、 orz (サンプルはtarファイル内に含まれている。)

このファイルをconfigfile関数(こちらから拝借。。 http://people.redhat.com/dlutter/puppet-app.html ) で一時ディレクトリ (/opt/local/ihs ) に配置しておき、Execリソース expandihsandinstallihs でインストールを実行している。

まとめ

他にもいくつか追加の設定があるのだが、基本的な流れはこのような感じである。。同じ理屈でWAS(WebSphere Application Server)のインストールやFix適用も自動化出来る。、基本的に条件はシェルから自動で実行出来ることだけなので、他の製品も含めて、いろいろ試してみるとよさそうだ。。
注意点として、Execのonlyif, Fileのrequireなど、条件設定の仕組みを上手く使わないと順番が変わってしまい、上手く動作しなくなる。この場合も大抵は何度かPuppetdを実行することでインストールは可能だが、出来れば一度でインストール出来るようにしたいものだ。。 orz