開発2部の吉岡です。
前回は、rpmの配信サーバーを構築してみました。
今回はそのrpmを使ったchef-soloのレシピ作成を行っていきたいと思います。
レシピの作成
で、レシピを作成していくわけですが、rpmのファイル名は
パッケージ名-バージョン-リリース番号.アーキテクチャ名.rpm
という形式なので、それぞれを変数に定義しておけば、良い感じに出来そうです。
というわけで、下記のようなレシピ(httpdのインストール)を作成してみました。
middleware_name = 'httpd' arch_name = 'x86_64' rpm_base_url = 'http://rpm配信サーバーのホスト:8095/rpm' install_rpm_list = [ [ 'apr', '1.3.9-5.el6_2' ], [ 'apr-util', '1.3.9-3.el6_0.1' ], [ 'apr-util-ldap', '1.3.9-3.el6_0.1' ], [ 'httpd-tools', '2.2.15-29.el6.centos' ], [ 'httpd', '2.2.15-29.el6.centos' ], ] ####### package "mailcap" do action :install end ####### def get_rpm_dic(package_name, package_version, middleware_name, arch_name, rpm_base_url) rpm_filename = "%s-%s.%s.rpm" % [package_name, package_version, arch_name ] ret = { package_version: package_version, rpm_filename: rpm_filename, rpm_url: "%s/%s/%s" % [ rpm_base_url, middleware_name, rpm_filename ], cache_file: "%s/%s" % [Chef::Config[:file_cache_path] ,rpm_filename ] } end ####### install_rpm_list.each do |package_name, package_version| rpm_dic = get_rpm_dic( package_name, package_version, package_name, arch_name, rpm_base_url ) remote_file rpm_dic[:cache_file] do source rpm_dic[:rpm_url] end package package_name do action :install source rpm_dic[:cache_file] provider Chef::Provider::Package::Rpm end end
レシピの中身
勢いだけで書いたrubyなので、かなりビミョウな部分があるかと思いますがご容赦を…
install_rpm_listにインストールするパッケージ名とバージョン・リリース番号を定義します。
そして、rpm_base_url、middleware_name、arch_nameと組み合わせてrpmのURLを作成し、キャッシュにダウンロード、インストールするという感じです。
mailcapもインストールしていますが、これは「/etc/mime.typesが無い」と怒られるためです。
rpmを単にインストールしただけでは依存性などでエラーが出てしまうことがあり、必要なライブラリのインストールをレシピに追加したりという対応が必要になります。
エラーが発生した場合、ターミナルに表示されるchefの実行ログを見ながら、何の処理で躓いたのか確認します。
たいていは「rpm -U rpmファイル名」で怒られるので、仮想マシン上で実際に実行してみると「ほげほげが存在しない」というようなエラーが表示されます。そのライブラリを含むパッケージを調査し、インストールをレシピに加えておくという感じです。
このエラーが頻繁に出てくるので、根気でレシピの修正をしていく必要があります…
クックブックをGitにpushしておく
chef-soloの管理はGitを使用していることが多いかと思いますが、どこかのremoteにpushしておきます。
後ほどvagrantのディレクトリ内でsubmoduleとして読み込ませるためです。
こうしておくと、chefのクックブック開発とVagrantの定義を上手く切り離すことが出来るんじゃないかと。
ちなみに社内ではgitblitというGitサーバーを使っています。
社内サーバーがWindows Serverだからなのですが、サクッと立ち上がってブラウザ上で管理画面を提供してくれるのでお手軽な感じです。
またVagrantでは「site-cookbooks」ディレクトリのみを必要とする形にしたいので、このディレクトリだけsubmodule化する等して、別リポジトリにしておきます。
詳しくは
http://akio0911.net/archives/3421
などを参考に…
ちなみに、アイキャッチ画像は最近2部に導入されたオフィスグリコです。試しに使ってみたところやたら好評で、来週には2台目が届くそうです。
みんな飢えていたんですね…
次回は、Vagrantとchef-soloを連携させて開発環境を作っていきます!