Zabbix2.2をPostgeSQL9.3でインストールをChefのCookbookにした。(リポジトリの追加不具合に対応)

かなり時間が空いてしまいましたが、不具合が解消できたので追加で記事を書きます。
リポジトリの追加不具合というのは、下記のような現象です。

Zabbix2.2を入れたいのに、1.8が入ってしまう不具合

Zabbixのdefault recipeです。

# repository
execute "zabbix repo install" do
  not_if "/bin/rpm -qa | grep #{node[:zabbix][:repo_rpm]}"
  command "/bin/rpm -ivh #{node[:zabbix][:repourl]}"
end 
 
# package
node[:zabbix][:package].each do |package_name|
  package package_name do
    action :install
  end
end

(後略)
Zabbix2.2のリポジトリをRPMで入れたいと思っているrecipeです。attributeのdefault.rbには下記の記述を入れています。

default[:zabbix][:repourl] = “http://repo.zabbix.com/zabbix/2.2/rhel/6/x86_64/zabbix-release-2.2-1.el6.noarch.rpm”

これを-W オプション(dry-run) をつけて実行すると下記のような表示が出ます。

Starting Chef Client, version 11.6.0
Compiling Cookbooks...
Converging 13 resources
Recipe: zabbix::default
  * execute[zabbix repo install] action run
    - Would execute /bin/rpm -ivh http://repo.zabbix.com/zabbix/2.2/rhel/6/x86_64/zabbix-release-2.2-1.el6.noarch.rpm
 
  * package[zabbix-server-pgsql] action install
    - Would install version 1.8.21-1.el6 of package zabbix-server-pgsql
 
  * package[zabbix-web-pgsql] action install
    - Would install version 1.8.21-1.el6 of package zabbix-web-pgsql

これは、epelのリポジトリを無効にしていない状態なので、1.8が入ってしまいます。1回目の実行でyumリポジトリが更新、2回目でインストールというちょっと間抜けなインストール方法で我慢してしまいました。

run_actionを使った解決方法

Chef実践入門の8章「Chefをより活用するための注意点」
 → 8.8「Chefのレシピが実行されるまでのサイクル」からヒントを貰いました。
WEBで公開されている記事ではこちらですね。Chefのレシピは上から下に実行されるという誤解 – Engine Yard Blog

リソースの処理をただちに実行するにはという内容でした。
どうやら、Chefはコンパイル→収束→通知という段階を経て実行されるようです。通常は「収束」のところで実行される用なのですが、run_actionを使うと、コンパイル時に実行されるリソースを作り出せるようです。

変更後のdefault recipeです。

# repository
e = execute "zabbix repo install" do  not_if "/bin/rpm -qa | grep #{node[:zabbix][:repo_rpm]}"
  command "/bin/rpm -ivh #{node[:zabbix][:repourl]}"
  action :nothingend 
 
e.run_action(:run) 
# package
node[:zabbix][:package].each do |package_name|
  package package_name do
    action :install
  end
end

まず、action :nothingで実行しないようにしました。execute って、e(名前は何でもよさそうですが) に代入できるんですね。
で、run_actionメソッドを呼び出して実行しています。これが、-W のdry-run実行するとこんなログが出ます。

Starting Chef Client, version 11.6.0
Compiling Cookbooks...
Recipe: zabbix::default
  * execute[zabbix repo install] action run
    - Would execute /bin/rpm -ivh http://repo.zabbix.com/zabbix/2.2/rhel/6/x86_64/zabbix-release-2.2-1.el6.noarch.rpm
 
Converging 13 resources
  * execute[zabbix repo install] action nothing (skipped due to action :nothing)
  * package[zabbix-server-pgsql] action install
    - Would install version 1.8.21-1.el6 of package zabbix-server-pgsql
 
  * package[zabbix-web-pgsql] action install
    - Would install version 1.8.21-1.el6 of package zabbix-web-pgsql

Compiling Cookbooks… で実行されているログが出ました。その代わりにConverging ではexecuteがaction nothing でskipされています。
この出力では相変わらずZabbix 1.8.21がインストールされるんじゃない?と出ていますが、実行してみると下記のような結果になりました。

Starting Chef Client, version 11.6.0
Compiling Cookbooks...
Recipe: zabbix::default
  * execute[zabbix repo install] action run
    - execute /bin/rpm -ivh http://repo.zabbix.com/zabbix/2.2/rhel/6/x86_64/zabbix-release-2.2-1.el6.noarch.rpm
 
Converging 13 resources
  * execute[zabbix repo install] action nothing (skipped due to action :nothing)
  * package[zabbix-server-pgsql] action install
    - install version 2.2.8-1.el6 of package zabbix-server-pgsql
 
  * package[zabbix-web-pgsql] action install
    - install version 2.2.8-1.el6 of package zabbix-web-pgsql

いやあ・・・なんとか今年中に宿題が片付いて良かったという小学生の時のような気分です。
全てをchefでやれる日は、僕の仕事ではなかなか来ないかもしれませんが、ある程度実績のあるベースを作るという作業はこれでやれると楽です。

そりゃあ、一人で知識を抱え込んでいればコマンドラインから次々に実行していくだけで作成できちゃうので、recipeを作成する1/30ぐらいの時間で
一つのサーバは完成するんですが、100台あれば100台分の時間がかかるっていう事実は短縮できないので、未来を見るのならば構築技術に習熟しておくのは
良い事だと思っています。