ChefでCookbook, Recipeを独自に作成

前回までに以下の作業を進め、ChefコミュニティのCookbookを使ってサーバーの構成管理を行うところまでは試しました。その続きとして、今回は独自にクックブック(とそのレシピ)を作成して、Vagrant 上の仮想マシンにプロビジョニングを実行してみたいと思います。

スポンサーリンク

以下内容を作業済みとします、上のエントリーが新しいものです。

ChefコミュニティのCookbookでサーバー構成管理 | EasyRamble
Chef超入門、Chef-soloでVagrant上の仮想マシンのCentOSにGitをインストールするとこまで | EasyRamble
MacにVagrantとVirtualBoxをインストール | EasyRamble

Chef リポジトリのディレクトリ構造確認

作業ディレクトリ(Chef リポジトリ)は、現時点で以下の内容。

cookbooks がコミュニティのクックブックの格納ディレクトリ、site-cookbooks が独自にカスタマイズしたクックブックの格納ディレクトリです。

knife cookbook create コマンドで独自 cookbook 用の雛形を作成

site-cookbooks 以下に独自の cookbook を作成します。今回は、railsapp_cookbook という名前のクックブックを作成。

tree で生成された site-cookbooks/railsapp_cookbook の中身を確認し、簡単な説明を付けました。

metadata.rb の編集

まず、Cookbook のメタデータ(作成者やライセンスなどの情報)を編集しておきます。

railsapp_cookbook/metadata.rb

では、以降 Cookbook の核となる Recipe を作成していきます。パーフェクト Ruby on Rails の8章を参考にさせて頂きました。

ユーザーを追加する Recipe を作成

続いて、早速ユーザーを追加する Recipe を作成します。作業アカウント用に ops という名前のユーザーを作成するレシピです。

railsapp_cookbook/recipes/user_ops.rb

読めば大体分かりますね。簡単に説明しますと…

user ‘ops’ → ops という名前のユーザー。

ブロックの中身は…

action :create → アクションは create(作成)。
supports :manage_home => true → ユーザーのホームディレクトリを作成。
home “/home/ops” → ホームディレクトリの場所は、/home/ops。
shell “/bin/bash” → シェルは、/bin/bash を使用。

ここで指定している、user は Chef の概念上 Resource と呼ばれるものです。Resource は他にも、group や package, service, template, bash など多数あります。詳しくはドキュメント参照。

About Resources and Providers — Chef Docs
Resources and Providers Reference — Chef Single-page Topics

続いて、Vagrantfile に作成した user_ops の Recipe 追加の設定を行います。

Vagrantfile

chef.cookbooks_path に ./site-cookbooks を追加しています。

プロビジョニングを実行。

ユーザーを確認。

ユーザー ops と /home/ops ディレクトリが作成されていることが確認できました。

ファイルをアップロードする Recipe 作成

もう一つ Recipe 作成の例として、ファイルをアップロードするレシピの例です。SSH 接続用に ssh-keygen で鍵ペアを作成後、公開鍵を cookbook 内の files/default/ ディレクトリに、authorized_keys という名前でコピーしておきます。この files/default/authorized_keys をアップロードします。

ファイルをアップロードするには、cookbook_file という Resource を用います。

railsapp_cookbook/recipes/ssh_keys.rb

この Recipe も見れば大体分かるかと思います。/home/ops が存在する必要がありますので、最初に user_ops の Recipe をインクルードしています。また ~/.ssh は自動で作成してくれないので、先に directory リソースを用いて、ops ユーザーの ~/.ssh ディレクトリを作成しています。

リモートリポジトリからのデプロイ用などで、秘密鍵もアップロードするために /file/default 以下に配置する場合は、.gitignore で指定したほうが良い。

あとは、Vagrantfile に ssh_keys の Recipe を追加してプロビジョニング。

Vagrantfile

プロビジョニングして確認。

ちゃんとアップロードされていますね。

以上簡単ですが、独自に Cookbook の雛形を作成して、Recipe を追加する方法を見てきました。流れとしては、

1. knife cookbook create で Cookbook の雛形を作成
2. Recipe を作成
3. Vagrantfile に Recipe 追加の設定
4. プロビジョニング

となります。

Cookbook は汎用的に使える粒度でまとめると良いかと思います。そうしておけば、似たような Cookbook を何度も作らなくて済みますし、使い回しが効きますので。

あとは、色々な Resource の書き方を調べながら、がんがん Recipe を書いていくのみ。Nginx や MySQL などサービスとして動作させたり、設定ファイルが必要な場合は、service や template の Resource を使います。

最後ひとつ気になった点… knife cookbook test で Cookbook のシンタックステストが行えるのですが、私の環境ですと以下のエラーでこけます。

理由は分かりませんが、プロビジョニングは正常にできています。いずれ解決したい…

スポンサーリンク
スポンサーリンク
 
Twitterを使っていますのでフォローお願いたします!ブログの更新情報もつぶやいてます^^
(英語学習用)

Leave Your Message!