今更感があってごめんなさい。確かにAnsibleとかFabricとか流行ってますもんね。でも老舗感と重厚感あるChef触っておくのもいいと思うんです。にしてもChefって色々複雑そうで入りにくいですよね…。
私はChef初級者です。一応裏付けは取るようにしていますが、もし間違いがあれば指摘いただけると嬉しいです。
Chef-Zeroっていうのは、消えゆく(らしい)Chef-Soloに代わる形で推奨されている単体で動く環境構築の自動化ツールです。元々Chefはサーバーとクライアントが分かれているアプリケーションですが、Chef-Soloは独立して動くChefで、Chef-Zeroは1つのマシンにサーバーとクライアントの両方を入れたようなイメージらしいです。
導入編
昔はRubyのgemでChef入れて、関連ツール入れて・・・のような形でRubyの環境がない人はそこから、という結構導入が重めでした。
最近はChefDKというのがあり、Chef本体とその関連ツールを一気にインストールできるようになっています(実際は内部でgemが使われているんですが…)。
https://downloads.chef.io/chef-dk
今回はこのMac用のChefDK、執筆時点の最新 0.10.11を使います。バージョン番号から察するに、まだ正式リリースではないようですがインストールされるChefは最新のものなので心配ありません。
インストール直後のバージョン情報は次の通りです。
1 2 3 4 5 |
$ chef -v Chef Development Kit Version: 0.10.0 chef-client version: 12.5.1 berks version: 4.0.1 kitchen version: 1.4.2 |
Vagrantを準備
とりあえず適当にVagrantのゲストOSを用意します。今回は Vagrantことはじめ でダウンロードしてきた bento/centos-6.7 を使います。読むのに慣れてVagrantfileのコメントが邪魔になってきたら init時に –minimal (-m)オプションを付けましょう。コメントが消えてくれます。
1 2 |
mkdir /tmp/vagrant-chef; cd $_ vagrant init bento/centos-6.7 --minimal |
Chefを使ってプロビジョニングを行うためには、ゲストOS内にもChefが必要です。色々な解説サイトを読むと、Vagrantのプラグインを入れてゲストOSにChefをインストールするような記事が多く見られますが、そうするとVagrantfileを配布する際にそのプラグインのインストール手順を共同開発者に伝え、手動で入れてもらう必要があります。せっかくの自動化なのに、vagrant upだけで完結させたいですよね。なので今回はChefのインストール部分だけインラインシェルを使うことにします。
1 2 3 4 5 |
Vagrant.configure(2) do |config| config.vm.box = "bento/centos-6.7" + config.vm.provision 'shell', + inline: 'curl -L https://www.opscode.com/chef/install.sh | sudo bash -s -- -v 11' end |
Chefリポジトリを作る
まずはベースとなるリポジトリを作ります。今後はこの中で作業するので、移動しておいてください。
1 2 |
chef generate repo provision cd ./provision |
Cookbookを作る
オリジナルなcookbookはデフォルトで作られているcookbooksではなくsite-cookbooksに入れるのが慣習のようなので、それに従おうと思います。ここでは例として空のCookbookを置いてみます。
1 2 |
mkdir site-cookbooks chef generate cookbook site-cookbooks/do-something |
これで空のクックブックができました。
Berksfileを作る
実際にCookbookの中身を作り込む前に、Berkshelfへの登録を済ませておきましょう。
BerkshelfというのはRubyのBundler、PHPのComposerのように、Cookbookに依存するCookbookを自動で入れてくれるCookbookマネージャーのような役割を担います。
Berkshelfで自分の使いたいCookbookを記述しておくのがBerksfileになります。これをChefリポジトリのルートに作ります。
1 |
vim Berksfile |
1 2 |
+source "https://supermarket.chef.io" +cookbook 'do-something', path: './site-cookbooks/do-something' |
1行目のsourceというのは、指定された名前のCookbookをデフォルトでどこから落としてくるか指定します。今回は有名な Chef Supermarket を使いました。
その後で使いたいcookbookの名前とバージョンを指定し、
1 |
berks vendor cookbooks |
コマンドを実行することで、 Berksfileを元にcookbooksディレクトリに依存性が解決されたCookbookが保存されるようになります。
実際に上のコマンドを実行してみてください。./site-cookbooks/do-something が ./cookbooks/do-something にコピーされたと思います。今回のようにpathパラメーターにローカルのCookbookを与えた場合は、sourceに記述したリモートロケーションではなく指定されたローカルのCookbookを見に行くようになります。
Vagrantのプロビジョンで実行する
Chef-Soloでプロビジョンを行ったことがある人は同じように使えます。
chef_zero provisionerを使って、cookbooksのディレクトリと実行するレシピをadd_recipeで列挙していきます。
1 2 3 4 5 6 7 8 9 10 |
Vagrant.configure(2) do |config| config.vm.box = "bento/centos-6.7" config.vm.provision 'shell', inline: 'curl -L https://www.opscode.com/chef/install.sh | sudo bash -s -- -v 11' + config.vm.provision "chef_zero" do |chef| + chef.cookbooks_path = "./provision/cookbooks" + chef.add_recipe "do-something" + end end |
add_recipe の代わりに add_role を使ってRolesという機能も使えます。これは複数のレシピをロールという単位で管理することで、役割という意味単位でグルーピングして扱うことができます。
Marketで公開されているCookbookを使ってみる
既に作った do-something のCookbookを自分で書いてもいいのですが、とても長くなってしまうので今は公開されているCookbookを使ってみます。例えばApacheやMySQL Serverなどの有名どころは大抵公開されているので、そもそも自分で一から書くことは少ないかもしれません。
上でBerksfileのsourceに指定したURLが Chef Supermarket です。
今回はApacheのCookbook、 apache2 を使ってみようと思います。
1 |
vim Berksfile |
1 2 3 |
source "https://supermarket.chef.io" cookbook 'do-something', path: './site-cookbooks/do-something' +cookbook 'apache2' |
berks vendorでCookbookを取得してきます。
1 |
berks vendor cookbooks |
cookbooksディレクトリの中にapache2のcookbookがインストールされればOKです。
Vagrantfileにも追加して、実行してみましょう。
1 2 3 4 5 6 7 8 9 10 11 |
Vagrant.configure(2) do |config| config.vm.box = "bento/centos-6.7" config.vm.provision 'shell', inline: 'curl -L https://www.opscode.com/chef/install.sh | sudo bash -s -- -v 11' config.vm.provision "chef_zero" do |chef| chef.cookbooks_path = "./provision/cookbooks" chef.add_recipe "do-something" + chef.add_recipe "apache2" end end |
1 2 |
vagrant provision # または vagrant destroy -> vagrant up |
プロビジョンが完了したら、正しくインストールされているか確認してみましょう。
1 2 3 4 |
vagrant ssh [vagrant@localhost ~]$ service httpd status httpd (pid 3844) is running... |
Vagrantfileを公開するとき
チーム内で開発用仮想マシンを共有したいときは、Vagrantfileの他に最低限 ./provision/cookbooksを共有するといいでしょう。Berkshelfがインストールされているユーザーであれば、 Vagrantfile+Berkshelfでなんとかなりますが、一般的にはVagrantfile+cookbooksの共有が多いような気がします。
まとめ
Chef勉強しながら作業内容の備忘録と共有のために書きました。実際これだけではChefの2割にも満たないくらいの知識量だと思います。学習コストが比較的高いですが頑張っていきましょう。