Chefを使っていると、Recipeのコード量が膨大になってしまったり、Recipeを使い回したりすることがあるかと思います。本稿では、そのような場合にコードの見通しを良くしたり、コードの再利用性を向上したりできる独自のResourceを定義する方法について、独自Resource導入前後のコードを紹介しつつ、解説したいと思います。
構成管理ツール「Chef」とは
有名なツールなのでご存じの方も多いかもしれませんが、ChefはChef社(旧Opscode社)が提供しているインフラ環境の構築や構成管理の自動化ツールです。Chefを使えばOS環境の設定やパッケージのインストール、ミドルウェアの設定など、インフラエンジニアが今まで人手で行ってきたような作業を自動化することができます。また、ChefはApache License,Version 2.0でOSSとして公開されているため、誰でも利用が可能です。
Chefでは、CookbookやRecipe、knifeなどの用語が登場します。Chefの基本用語や概要、インストール方法などの基本的な操作については、過去の記事『構成管理ツール「Chef」の概要とインストール手順』を参照してみてください。
Chefを使う上で重要な概念である「Resource」とは
Chefを使う上ではResource定義が重要です。ChefではRubyを独自に拡張した内部DSL(※1)を使い、サーバの構成内容をRecipeに定義することで自動化を実現しています。Recipe内ではDSLだけでなく、通常のRubyも使用できます。例えば、指定した場所にファイルを新規に作成するRecipeは以下のように定義します。
file "/tmp/something" do owner "tis" group "tis" mode "0755" action :create end
中身を見れば一目瞭然かと思いますが、このRecipeを実行することで、/tmp/somethingというファイルがユーザ「tis」、グループ「tis」、パーミッション「755」で作成されます。ここで、標準のRubyには定義されていない「file」という命令を使っています。この「file」という命令をChefでは「Resource」と呼び、Resourceを組み合わせてRecipeを作成し、Cookbookを構成することでサーバの構成内容を定義していきます。例として挙げたfileのように、ChefではあらかじめResourceが定義されています。定義されているResourceについては公式のマニュアルを参照してください。
独自のResourceを使用しないでCookbookを作ってみる
それでは、実際にCookbookを作ってみたいと思います。冒頭で述べましたが、まずは独自のResourceを用いずにCookbookを作成します。今回はサンプルとしてRubyの構成管理ツールであるrbenvのCookbookを作ってみましょう。作成するCookbookには以下の機能を持たせます。
- rbenvをインストールする
- rbenvを使って指定したバージョンのRubyを有効にする
- 指定したバージョンのRubyがインストールされていなかった場合には対象バージョンのRubyをインストールする
今回の動作環境
Chefは、大きく分けてChef ServerとChef Soloの2つの構成で利用できます。今回は簡単にChefを使うことができるChef Soloを利用して解説を進めていきます。使用するChefのバージョンは11.12.2です。
また、特に記載がない限りは作業用のOSはCentOS 6.5を使用しています。
Cookbookの作成
最初にrbenvという名前のCookbokを作成します。まずはChefをインストールします。Chefをインストールすると、Chef Soloを実行するためのchef-soloのコマンドやChefのコマンドラインツールであるknifeなどがインストールされます。Chefをインストールした後、Cookbookを置くディレクトリを作成し、knifeを使用してCookbookの雛形を作成します。
$ curl -L https://www.opscode.com/chef/install.sh | sudo bash ...途中のメッセージは省略... Thank you for installing Chef! $ mkdir cookbooks $ knife cookbook create rbenv -o cookbooks ** Creating cookbook rbenv ** Creating README for cookbook: rbenv ** Creating CHANGELOG for cookbook: rbenv ** Creating metadata for cookbook: rbenv
knifeコマンドの-oオプションで作成するCookbookを格納するディレクトリを指定します。作成されたディレクトリは、下記のような構成になっています。
cookbooks/ └── rbenv ├── CHANGELOG.md ├── README.md ├── attributes ・・・Recipe内で使用する変数を定義したattributeを格納するディレクトリ ├── definitions ├── files │ └── default ├── libraries ├── metadata.rb ├── providers ├── recipes ・・・今回作成するRecipeを格納するディレクトリ │ └── default.rb ├── resources └── templates └── default
今回はRecipeの他に、Recipe内で使用できる変数を定義するattributeも使います。作成したCookbookのrecipesディレクトリの中には、default.rbというRecipeファイルがありますが、今回は以下の2ファイルのRecipeを新たに作成します。
-
install_rbenv.rb
- rbenv自体をインストールするRecipe
-
install_ruby.rb
- rbenvを使って指定したバージョンのRubyをインストールするRecipe