Twitter Facebook github

Vagrant+Chef-Zero入門

今更感があってごめんなさい。確かに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は最新のものなので心配ありません。

インストール直後のバージョン情報は次の通りです。

 

Vagrantを準備

とりあえず適当にVagrantのゲストOSを用意します。今回は Vagrantことはじめ でダウンロードしてきた bento/centos-6.7 を使います。読むのに慣れてVagrantfileのコメントが邪魔になってきたら init時に –minimal (-m)オプションを付けましょう。コメントが消えてくれます。

Chefを使ってプロビジョニングを行うためには、ゲストOS内にもChefが必要です。色々な解説サイトを読むと、Vagrantのプラグインを入れてゲストOSにChefをインストールするような記事が多く見られますが、そうするとVagrantfileを配布する際にそのプラグインのインストール手順を共同開発者に伝え、手動で入れてもらう必要があります。せっかくの自動化なのに、vagrant upだけで完結させたいですよね。なので今回はChefのインストール部分だけインラインシェルを使うことにします。

 

Chefリポジトリを作る

まずはベースとなるリポジトリを作ります。今後はこの中で作業するので、移動しておいてください。

 

Cookbookを作る

オリジナルなcookbookはデフォルトで作られているcookbooksではなくsite-cookbooksに入れるのが慣習のようなので、それに従おうと思います。ここでは例として空のCookbookを置いてみます。

これで空のクックブックができました。

 

Berksfileを作る

実際にCookbookの中身を作り込む前に、Berkshelfへの登録を済ませておきましょう。
BerkshelfというのはRubyのBundler、PHPのComposerのように、Cookbookに依存するCookbookを自動で入れてくれるCookbookマネージャーのような役割を担います。

Berkshelfで自分の使いたいCookbookを記述しておくのがBerksfileになります。これをChefリポジトリのルートに作ります。

1行目のsourceというのは、指定された名前のCookbookをデフォルトでどこから落としてくるか指定します。今回は有名な Chef Supermarket を使いました。

その後で使いたいcookbookの名前とバージョンを指定し、

コマンドを実行することで、 Berksfileを元にcookbooksディレクトリに依存性が解決されたCookbookが保存されるようになります。

実際に上のコマンドを実行してみてください。./site-cookbooks/do-something が ./cookbooks/do-something にコピーされたと思います。今回のようにpathパラメーターにローカルのCookbookを与えた場合は、sourceに記述したリモートロケーションではなく指定されたローカルのCookbookを見に行くようになります。

 

Vagrantのプロビジョンで実行する

Chef-Soloでプロビジョンを行ったことがある人は同じように使えます。

chef_zero provisionerを使って、cookbooksのディレクトリと実行するレシピをadd_recipeで列挙していきます。

add_recipe の代わりに add_role を使ってRolesという機能も使えます。これは複数のレシピをロールという単位で管理することで、役割という意味単位でグルーピングして扱うことができます。

 

Marketで公開されているCookbookを使ってみる

既に作った do-something のCookbookを自分で書いてもいいのですが、とても長くなってしまうので今は公開されているCookbookを使ってみます。例えばApacheやMySQL Serverなどの有名どころは大抵公開されているので、そもそも自分で一から書くことは少ないかもしれません。

上でBerksfileのsourceに指定したURLが Chef Supermarket です。

https://supermarket.chef.io/

今回はApacheのCookbook、 apache2 を使ってみようと思います。

berks vendorでCookbookを取得してきます。

cookbooksディレクトリの中にapache2のcookbookがインストールされればOKです。

Vagrantfileにも追加して、実行してみましょう。

プロビジョンが完了したら、正しくインストールされているか確認してみましょう。

 

Vagrantfileを公開するとき

チーム内で開発用仮想マシンを共有したいときは、Vagrantfileの他に最低限 ./provision/cookbooksを共有するといいでしょう。Berkshelfがインストールされているユーザーであれば、 Vagrantfile+Berkshelfでなんとかなりますが、一般的にはVagrantfile+cookbooksの共有が多いような気がします。

 

まとめ

Chef勉強しながら作業内容の備忘録と共有のために書きました。実際これだけではChefの2割にも満たないくらいの知識量だと思います。学習コストが比較的高いですが頑張っていきましょう。

コメントを残す

メールアドレスが公開されることはありません。