よーし、いろいろアプリケーションのインストールの自動化しちゃうぞー! と思っていましたが、 先に試しておいた方が良さそうなものがあったので、そちらを先にやります。
RPM系Linuxディストリビューション、つまり CentOS だったり、 Fedora などの Linux のディストリビューションでは、 yum (Yellowdog Updater Modified) と呼ばれるパッケージ管理システムが採用されています。
yum に限らずですが、ソースコードから毎回インストールするのはかなり骨の折れる作業だったりします。 (もちろんやったことない場合には、絶対経験しておくべき作業ではあると思うのですが。)
この yum は、パッケージのインストールがコマンド 1行で出来るので非常に便利ではあるものの、そのまま使うと場合によってはちょっと古めのパッケージ(PHP5.3, MySQL5.1 など)がインストールされてしまいます。
ゲストOS上で、sandbox モードになった状態で試しに PHP をインストールしてみます。
※これは、ゲストOSに実際にログインして手作業でコマンド打ってます。
[vagrant@vmclient1 ~]$ sudo yum install php
(略)
Dependencies Resolved
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
php x86_64 5.3.3-22.el6 base 1.1 M
Installing for dependencies:
apr x86_64 1.3.9-5.el6_2 base 123 k
apr-util x86_64 1.3.9-3.el6_0.1 base 87 k
apr-util-ldap x86_64 1.3.9-3.el6_0.1 base 15 k
httpd x86_64 2.2.15-28.el6.centos updates 821 k
httpd-tools x86_64 2.2.15-28.el6.centos updates 73 k
mailcap noarch 2.1.31-2.el6 base 27 k
php-cli x86_64 5.3.3-22.el6 base 2.2 M
php-common x86_64 5.3.3-22.el6 base 524 k
Transaction Summary
================================================================================
Install 9 Package(s)
Total download size: 4.9 M
Installed size: 16 M
Is this ok [y/N]: (y と入力)
(略)
Installed:
php.x86_64 0:5.3.3-22.el6
Dependency Installed:
apr.x86_64 0:1.3.9-5.el6_2 apr-util.x86_64 0:1.3.9-3.el6_0.1 apr-util-ldap.x86_64 0:1.3.9-3.el6_0.1 httpd.x86_64 0:2.2.15-28.el6.centos
httpd-tools.x86_64 0:2.2.15-28.el6.centos mailcap.noarch 0:2.1.31-2.el6 php-cli.x86_64 0:5.3.3-22.el6 php-common.x86_64 0:5.3.3-22.el6
Complete!
入りました。さてバージョンを表示してみます。
[vagrant@vmclient1 ~]$ php -v
PHP 5.3.3 (cli) (built: Feb 22 2013 02:51:11)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
5.3.3 が入ったようです。
ちなみに現時点での最新が5.4.15 で、5.5.0 の RC1(リリース候補版、もうすぐ出るよー的な意味)も出ていますし、 5.3 は若干古くなっているバージョンと言ってもいいかもしれません。 (というと、古くねえよ!全然マシだろ!という声がどこかから上がってくるかもしれませんが・・・)
また、PHP の拡張モジュールも何が入っているのやらさっぱりです。
yum のリポジトリを追加することで、最新のパッケージを選択することが可能となるので、 RPMforge, EPEL, Remi あたりのリポジトリを追加して、最新のパッケージをインストールできるよう、Chef で色々設定してみます。
学生のころ、yum のリポジトリの追加を手動で何回かやったことがあるのですが、 これがちょっとめんどくさかった記憶があります。
確かに今まで出て来た方法でやれば、yum のリポジトリの追加は自動化できるのですが、 そろそろ先人の知恵をお借りしてもいいのではないかなと思います。
公式のコミュニティサイトでは、先人の知恵が詰まった Cookbook が多数公開されています。 http://community.opscode.com/cookbooks
この中に、yum というのももちろん公開されているので、どんなものかを一通り眺めつつ、サードパーティの Cookbook を使って yum のリポジトリの追加を行ってみようと思います。
一応、入ったかどうか確認するために、あらかじめ現在の yum のリポジトリ一覧を確認しておきましょう。
[vagrant@vmclient1 ~]$ yum repolist all
(長いので略)
base CentOS-6 - Base enabled: 6,381
c6-media CentOS-6 - Media disabled
centosplus CentOS-6 - Plus disabled
contrib CentOS-6 - Contrib disabled
debug CentOS-6 - Debuginfo disabled
extras CentOS-6 - Extras enabled: 12
updates CentOS-6 - Updates enabled: 676
repolist: 7,069
あとで比較に使おうと思います。
Vagrant で使用する Cookbook は、~/Vagrant/cookbooks ディレクトリに入れていくルールにしてましたので、
$ cd ~/Vagrant/cookbooks
cookbooks ディレクトリへ移動して、
$ git clone https://github.com/opscode-cookbooks/yum.git
公開されている yum の Cookbook を git clone で持ってきます。
すると、自分で作った vmclient1, vmclient2 の他に、yum というディレクトリが出来ているはずなので、ざっと中を覗いてみます。
$ cd yum/recipes
自分で書いたように、通常は recipes/default.rb が呼ばれますので、こちらを見てみると・・・
コメント文だけで中には特に何も書いてありませんでした。
さてさて、Vagrant のドキュメントを見てみます。
‘apache’ っていう Cookbook が使いたかったら、chef.add_recipe 'apache'
って書くと追加できるよ!とあります。
また、EPEL であれば ‘yum::epel’ 、remi であれば ‘yum::remi’ と入れることで Cookbook の指定が出来るようです。
つまり、default.rb には何も書いてないけど、epel.rb や remi.rb にレシピが書いてあるので、 この名前を指定することでライブラリのように呼び出して使うことができるようですね。
なるほど。
ではさっそく Vagrant に追記して、実行してみます。
Vagrantfile の必要なところだけ抜粋します。
vmclient.vm.provision :chef_solo do |chef|
chef.cookbooks_path = "cookbooks"
chef.data_bags_path = "data_bags"
chef.add_recipe "yum::epel"
chef.add_recipe "yum::remi"
chef.add_recipe "vmclient1"
end
※どうやら最初にレシピ書いた段階では、chef.run_list
と書いてましたが、chef.add_recipe
の方で統一すべきのようです。
package 'php' do
action :install
end
ここに options ‘hogehoge’ と書くことで、コマンドラインにつけるオプションをそのまま書くことが出来るようですが、 Cookbook で yum のリポジトリを追加するだけでどう変化するのかを見るので、一旦何も指定せずにそのままインストールしてみます。
そして、さっきゲストOSを色々いじってしまったので、 vagrant sandbox rollback
で元に戻してから、仮想マシンを再起動します。
$ vagrant sandbox rollback
綺麗さっぱり元通りです。
$ vagrant reload
さてどうなるでしょうか。
さすがにログ全部は長過ぎなんで、ポイントだけを順番に抜粋してみます。
[2013-05-16T18:11:39+00:00] INFO: Setting the run_list to ["recipe[yum::epel]", "recipe[yum::remi]", "recipe[vmclient1]"] from JSON
[2013-05-16T18:11:39+00:00] INFO: Run List is [recipe[yum::epel], recipe[yum::remi], recipe[vmclient1]]
[2013-05-16T18:11:39+00:00] INFO: Run List expands to [yum::epel, yum::remi, vmclient1]
3つのレシピが順に実行されていくのが分かります。
[2013-05-16T18:12:35+00:00] WARN: Cloning resource attributes for yum_key[RPM-GPG-KEY-EPEL-6] from prior resource (CHEF-3694)
[2013-05-16T18:12:35+00:00] WARN: Previous yum_key[RPM-GPG-KEY-EPEL-6]: /tmp/vagrant-chef-1/chef-solo-1/cookbooks/yum/recipes/epel.rb:22:in `from_file'
[2013-05-16T18:12:35+00:00] WARN: Current yum_key[RPM-GPG-KEY-EPEL-6]: /tmp/vagrant-chef-1/chef-solo-1/cookbooks/yum/providers/repository.rb:85:in `repo_config'
途中でGPGキーに関する警告が色々出てるっぽいです。この辺今回はすっ飛ばしてやってますからねー。
[2013-05-16T18:12:36+00:00] INFO: template[/etc/yum.repos.d/epel.repo] updated content
[2013-05-16T18:12:36+00:00] INFO: template[/etc/yum.repos.d/epel.repo] mode changed to 644
[2013-05-16T18:12:36+00:00] INFO: template[/etc/yum.repos.d/epel.repo] sending run action to execute[yum-makecache] (immediate)
Template Resource を使って、 `/etc/yum.repos.d/epel.repo を色々書いてくれていますね。
[2013-05-16T18:15:39+00:00] INFO: Processing yum_key[RPM-GPG-KEY-remi] action add (yum::remi line 22)
remi リポジトリも同様でした。
[2013-05-16T18:24:58+00:00] INFO: Processing package[php][/php] action install (vmclient1::default line 19)
[2013-05-16T18:24:58+00:00] INFO: package[php][/php] installing php-5.4.15-1.el6.remi from remi repository
さて、PHP のインストールがされているようですが、 どうやら PHP 5.4.15 が入っているようですね!
こんな感じで一通りの自動化作業が終わったところで、実際に何がインストールされたか見てみましょう。
[vagrant@vmclient1 ~]$ php -v
PHP 5.4.15 (cli) (built: May 9 2013 08:20:20)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
おおー、ちゃんと入っておりました。
ちなみに yum のリポジトリはどうでしょう?
base CentOS-6 - Base enabled: 6,381
c6-media CentOS-6 - Media disabled
centosplus CentOS-6 - Plus disabled
contrib CentOS-6 - Contrib disabled
debug CentOS-6 - Debuginfo disabled
epel Extra Packages for Enterprise Linux enabled: 8,783
extras CentOS-6 - Extras enabled: 12
remi Les RPM de remi pour Enterprise Linux 6.4 - x86_64 enabled: 1,015
updates CentOS-6 - Updates enabled: 678
repolist: 16,869
epel と remi が増えておりますね!
時間がないので今回はここまでですが、あとでサードパーティ Cookbook の中で何が行われていて、結果どういうファイルがどう変わったか?というのは、しっかりと見ておこうと思います。
中で何やってるのかよく分からないけど、順番通りにやったらなんかできましたーみたいなのをよく聞きますが、 そういうブラックボックス的な使い方は非常に危険だと思うので、 あくまで「普通にやったら 100 の労力かかるけど、それを 1 にしてくれるショートカットツール」みたいな、 めんどくさいところの時間短縮を行ってくれるツール、という位置づけで常に使うことを心がけていきたいです。
(あ、前者の使い方って、実装者が「よくわかんないけど jQuery プラグインをポンと入れたら動いちゃったんでオッケーですー」って言ってるのと大差ないかもしれないですね・・・。)
この記事は書かれてから1年以上が経過しており、最新の情報とは異なる可能性があります