akadama

そこらへんにいるプログラマが適当にやってます

Chef を使ってみる その1

先日のVagrantのエントリー内でちょっと触れたChefを試してみます

Chefとは

Chef
Chef でサーバ管理を楽チンにしよう!|るびま

Rubyで作られたサーバの構成管理ツールです
いろんなサーバにapacheとか入れたり設定ファイルも配置しちゃったりできるようです

これで下記みたいな時に幸せになれるのかもしれません

  • 特定のサーバだけ設定がもれてて動かなかった!
  • あのサーバだけライブラリのバージョン違うじゃねぇか!!
  • 100台サーバあるけど、apacheのバージョン更新しといて

ただ、ChefにはServerやらClientやらNodeやらRoleやらいろんな考えがあって、
最初から完璧にやろうと思うと必ず失敗します。
自分もすでに数回目(笑)

今回はVagrantで使うことを目的としていますので、chef-soloだけで試そうと思います
最終的には開発用のVirtualBoxと公開用サーバでアプリとか設定とかを統一していきたいです

インストール

Rubyは入っているという想定です

1
gem install chef

これだけでOk

Chefに関する設定ファイルを作成

下記のコマンドを実行して設定ファイルを作成します

1
$ knife configure

設定ファイルの置き場所とかが聞かれると思うので $HOME/.chef/ にしてみましょう
ファイルの設定が終わったら、~/.chef/knife.rbにcookbookの保管場所を設定します

1
cookbook_path            '~/.chef/cookbooks/'

レシピ作成

…ここではレシピと言うべきなのかクックブックと言うべきなのか
インストールするもの毎に作るのが慣習ぽいです
apacheならapacheだけ。PHPとかでライブラリを入れる場合は一緒でもいいのかな?

今回は単に静的ファイルを1つ置くだけのレシピを書いてみましょう

1
$ knife cookbook create static_file

cookbook_path以下にstatic_fileというディレクトリが出来ているはずです
ここがstatic_fileレシピに関する情報をまとめるディレクトリになります

レシピディレクトリの中身

  • attributes
  • definitions
  • files
  • libraries
  • providers
  • recipes
  • resources
  • templates

8つのディレクトリと

  • metadata.rb
  • README.md

2つのファイルがあります

今回は静的ファイルを置くだけなので、recipesとfilesディレクトリ以外は消しておきます

ファイルを置いてみる

ファイルの扱いに関してはここを参考にしています

ファイルを置くのは簡単で

  1. files以下に置きたいファイルを置く
  2. recipes/default.rbに cookbook_file メソッドでファイルを指定

といった感じです。

実際にやってみます
files 以下にsample.txtを作る
recipes/default.rb に以下のようにファイルを配置したいパスを指定

1
2
3
cookbook_file '/tmp/sample.txt' do
  mode '0644'
end

これでレシピの作成は完了
ではこのレシピをVagrantで利用してみましょう
Vagrantfileの途中にchef-soloの記述があるのでその部分を以下のように変更します

1
2
3
4
5
6
7
8
9
Vagrant::Config.run do |config|

  # 中略

  config.vm.provision :chef_solo do |chef|
    chef.cookbooks_path = "~/.chef/cookbooks"
    chef.add_recipe "static_file"
  end
end

あとはVagrantから仮想マシンを立ちげれば反映されてるはずです

1
$ vagrant up     # すでに起動済みの場合はvagrant reload

その後以下のコマンドでファイルがあるかを確認してみましょう

1
2
3
$ vagrant ssh

$ ls /tmp/sample.txt

ファイルはちゃんと配置されたでしょうか?
まだここだと嬉しさわからないと思うので次回はテンプレートを使って値の書き換え等を行うのを確認したいと思います