- 更新日: 2014年7月8日
- Vagrant & Chef
ChefでCookbook, Recipeを独自に作成
前回までに以下の作業を進め、ChefコミュニティのCookbookを使ってサーバーの構成管理を行うところまでは試しました。その続きとして、今回は独自にクックブック(とそのレシピ)を作成して、Vagrant 上の仮想マシンにプロビジョニングを実行してみたいと思います。
以下内容を作業済みとします、上のエントリーが新しいものです。
ChefコミュニティのCookbookでサーバー構成管理 | EasyRamble
Chef超入門、Chef-soloでVagrant上の仮想マシンのCentOSにGitをインストールするとこまで | EasyRamble
MacにVagrantとVirtualBoxをインストール | EasyRamble
Chef リポジトリのディレクトリ構造確認
作業ディレクトリ(Chef リポジトリ)は、現時点で以下の内容。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
$ cd ~/Vagrant/CentOS64 $ tree -a -L 1 . ├── .bundle ├── .chef ├── .git ├── .gitignore ├── .vagrant ├── Berksfile ├── Berksfile.lock ├── Gemfile ├── Gemfile.lock ├── Vagrantfile ├── cookbooks ├── data_bags ├── environments ├── nodes ├── roles ├── site-cookbooks └── vendor |
cookbooks がコミュニティのクックブックの格納ディレクトリ、site-cookbooks が独自にカスタマイズしたクックブックの格納ディレクトリです。
knife cookbook create コマンドで独自 cookbook 用の雛形を作成
site-cookbooks 以下に独自の cookbook を作成します。今回は、railsapp_cookbook という名前のクックブックを作成。
1 2 3 4 5 6 7 |
$ bundle exec knife cookbook create -o site-cookbooks railsapp_cookbook ** Creating cookbook railsapp_cookbook ** Creating README for cookbook: railsapp_cookbook ** Creating CHANGELOG for cookbook: railsapp_cookbook ** Creating metadata for cookbook: railsapp_cookbook |
tree で生成された site-cookbooks/railsapp_cookbook の中身を確認し、簡単な説明を付けました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$ tree site-cookbooks/railsapp_cookbook -a -L 1 site-cookbooks/railsapp_cookbook ├── CHANGELOG.md - Cookbookの変更履歴 ├── README.md - 概要・説明 ├── attributes - ノード(各々のサーバー環境)固有の設定ファイルを格納 ├── definitions - 独自のリソースを定義したファイルを格納 ├── files - Cookbook内で利用されるファイルを格納 ├── libraries - Chefの機能を拡張するRubyコードを格納 ├── metadata.rb - メタデータ記述ファイル ├── providers - リソースに対する処理実行のための設定ファイルを格納 ├── recipes - レシピファイルを格納 ├── resources - リソースの設定ファイルを格納 └── templates - テンプレートファイルを格納 |
metadata.rb の編集
まず、Cookbook のメタデータ(作成者やライセンスなどの情報)を編集しておきます。
railsapp_cookbook/metadata.rb
1 2 3 4 5 6 7 |
name 'railsapp_cookbook' maintainer 'maintainer name' maintainer_email 'maintainer_email@example.com' license 'All rights reserved' description 'A cookbook for railsapp_cookbook' long_description IO.read(File.join(File.dirname(__FILE__), 'README.md')) version '0.1.0' |
では、以降 Cookbook の核となる Recipe を作成していきます。パーフェクト Ruby on Rails の8章を参考にさせて頂きました。
ユーザーを追加する Recipe を作成
続いて、早速ユーザーを追加する Recipe を作成します。作業アカウント用に ops という名前のユーザーを作成するレシピです。
railsapp_cookbook/recipes/user_ops.rb
1 2 3 4 5 6 7 8 9 |
# Cookbook Name:: railsapp_cookbook # Recipe:: user_ops user 'ops' do action :create supports :manage_home => true home "/home/ops" shell "/bin/bash" end |
読めば大体分かりますね。簡単に説明しますと…
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
1 2 3 4 5 6 7 8 9 10 11 |
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| # ... config.vm.provision :chef_solo do |chef| chef.cookbooks_path = ["./cookbooks", "./site-cookbooks"] chef.add_recipe 'railsapp_cookbook::user_ops' end # ... end |
chef.cookbooks_path に ./site-cookbooks を追加しています。
プロビジョニングを実行。
1 2 3 4 |
$ vagrant reload $ vagrant provision |
ユーザーを確認。
1 2 3 4 5 6 7 |
$ vagrant ssh [vagrant@localhost ~]$ id ops uid=502(ops) gid=502(ops) 所属グループ=502(ops),10(wheel) [vagrant@localhost ~]$ sudo ls /home ops vagrant veewee |
ユーザー ops と /home/ops ディレクトリが作成されていることが確認できました。
ファイルをアップロードする Recipe 作成
もう一つ Recipe 作成の例として、ファイルをアップロードするレシピの例です。SSH 接続用に ssh-keygen で鍵ペアを作成後、公開鍵を cookbook 内の files/default/ ディレクトリに、authorized_keys という名前でコピーしておきます。この files/default/authorized_keys をアップロードします。
1 2 3 4 |
$ ssh-keygen $ cp ~/.ssh/id_rsa.pub ~/Vagrant/CentOS64/site-cookbooks/railsapp_cookbook/files/default/authorized_keys |
ファイルをアップロードするには、cookbook_file という Resource を用います。
railsapp_cookbook/recipes/ssh_keys.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# Cookbook Name:: railsapp_cookbook # Recipe:: ssh_keys include_recipe "railsapp_cookbook::user_ops" directory "/home/ops/.ssh" do action :create owner "ops" mode "0700" end cookbook_file "/home/ops/.ssh/authorized_keys" do action :create owner "ops" mode "0600" end |
この Recipe も見れば大体分かるかと思います。/home/ops が存在する必要がありますので、最初に user_ops の Recipe をインクルードしています。また ~/.ssh は自動で作成してくれないので、先に directory リソースを用いて、ops ユーザーの ~/.ssh ディレクトリを作成しています。
リモートリポジトリからのデプロイ用などで、秘密鍵もアップロードするために /file/default 以下に配置する場合は、.gitignore で指定したほうが良い。
あとは、Vagrantfile に ssh_keys の Recipe を追加してプロビジョニング。
Vagrantfile
1 2 3 4 5 6 7 8 9 10 11 12 |
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| # ... config.vm.provision :chef_solo do |chef| chef.cookbooks_path = ["./cookbooks", "./site-cookbooks"] chef.add_recipe 'railsapp_cookbook::user_ops' chef.add_recipe 'railsapp_cookbook::ssh_keys' end # ... end |
プロビジョニングして確認。
1 2 3 4 5 6 7 |
$ vagrant reload $ vagrant provision $ vagrant ssh [vagrant@localhost ~] $ sudo ls /home/ops/.ssh authorized_keys |
ちゃんとアップロードされていますね。
以上簡単ですが、独自に 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 のシンタックステストが行えるのですが、私の環境ですと以下のエラーでこけます。
1 2 3 4 5 6 7 |
$ bundle exec knife cookbook test railsapp_cookbook checking railsapp_cookbook Running syntax check on railsapp_cookbook Validating ruby files ERROR: Errno::EACCES: Permission denied @ dir_s_mkdir - /var/chef |
理由は分かりませんが、プロビジョニングは正常にできています。いずれ解決したい…
- Vagrant & Chef の関連記事
- Vagrantで使うVirtualBoxのVM(仮想マシン)を外付けHDDに移動
- Chefで/etc/sysctl.confのkernel.panicを設定
- Chefでtelnetをインストール
- Chefでyumリポジトリを追加する設定
- Chef で iptables の設定
- ChefでSSH接続用の公開鍵をサーバーに設置
- nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
- Chef Recipe でユーザー・グループを作成
- Chef Recipe で CentOS のネットワーク・ホストを設定
- NetworkManager 他不要なパッケージを削除する Chef Recipe
Leave Your Message!