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