$shibayu36->blog;

株式会社はてなでエンジニアをしています。プログラミングや読書のことなどについて書いています。

「入門Chef Solo」を読んでChefに入門した話

これまでChefとか全くやったことなかったのだけれど、PrePANとかで必要になったのとなんとなく興味もあったので、naoyaさんが最近出した入門Chef Soloを読んでみました。

入門Chef Solo - Infrastructure as Code

入門Chef Solo - Infrastructure as Code


読んでみた感想としては非常によくまとまっていて分かりやすいけど、全くChefをやったことない人にとってはChefの実行を試すフェーズが少しやりづらい印象を受けました。理由としてはAWS環境を持っていない場合、2,3章のChefを試す章ができず、さらにそのあとにvagrantでローカルに仮想環境を作るのを学んだとしても、その仮想環境を使って試す部分が少ないためです。

そこで僕は全くchefをやったことない人はまずvagrantでの実行環境を作れるようになってから、本を読み始めるとより知識が深まるのではないかなと思いました。この本の4章でそのあたりも学べるので、その章をまず読んでその後自分でvagrantを少しいじってみると良いと思います。

vagrantでchef-soloの実行環境を作る

vagrantというのはVirtualBoxみたいなVMコマンドラインからたちあげるなどのことが出来るツールです。
とりあえずvagrantVM立ち上げたり、壊したり出来るところまで出来るとchef-soloの実行・テスト環境を作ることが出来ます。
vagrantのインストールなどは http://docs.vagrantup.com/v2/installation/index.html 辺りを参考にどうぞ。gem版じゃなくてpackage版が推奨されています。

まずvagrantのboxを落としてきます。

$ vagrant box add base http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.3-x86_64-v20130101.box

vagrant initするとVagrantfileが出来、vagrant upするとVMが立ち上がります。sshしたければvagrant sshすれば良いです。

$ mkdir chef-solo-tutorial-sample && cd chef-solo-tutorial-sample
$ vagrant init
$ vagrant up
$ vagrant ssh

これでとりあえず立ち上がるところまでいけると思います。逆に作ったものを壊したい時は

$ vagrant destroy

とすればVMを消すことができます。chefを試したい時はvagrant upしてたちあげて実行したあとに、うまく行かなかったらvagrant destroyして壊して、もう一度vagrant upからやり直すみたいにします。

vagrantについては以下の記事も参考にしてください。

chef solo入門に出てくるサンプルをvagrant上で動かす

vagrantを立ち上げられるようになったとしても、2,3章のサンプルはvagrantで立ち上げたVMで動かすようになっていません。そこでとりあえず2章のhello worldvagrantVMで実行する手順を書いてみます。

必要なgemをインストールしておく

knife-soloが必要なのでインストールしておきます。この本では0.3.0を使ったほうがよいとされているので、それをインストールしてみます。

$ git clone git://github.com/matschaffer/knife-solo.git
$ cd knife-solo
$ rake install

chef soloの雛形を作る

以下のコマンドで出来ます。

$ cd chef-solo-tutorial-sample
$ knife solo init .

hello worldを作る

まずhello recipeの雛形を作ります。

$ knife cookbook create hello -o site-cookbooks/

そのあとsite-cookbooks/hello/recipes/default.rbに以下を追記します。

log "Hello, Chef!"

そのあとnodes/melody.jsonというファイルを追加し、以下を書いておきます。

{
    "run_list":[
        "hello"
    ]
}

vagrant上でchef soloを実行する

このあとchef soloをssh経由で実行します。

まず~/.ssh/configに必要な情報を追記します。必要な情報はvagrant upした状態でvagrant ssh-configすれば出てきます。

$ vagrant ssh-config --host melody
Host melody
  HostName 127.0.0.1
  User vagrant
  Port 2200
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile "/Users/sample/.vagrant.d/insecure_private_key"
  IdentitiesOnly yes

自分の環境でssh-configを実行して出てきた設定を~/.ssh/configに追記しておきます。この状態で

以下のようにしてVMの中にssh出来ることを確認しておいてください。

$ ssh melody

そのあとchef soloのセットアップをします。

$ knife solo prepare melody
Bootstrapping Chef...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
101  6471  101  6471    0     0   1037      0  0:00:06  0:00:06 --:--:-- 37189
Downloading Chef 11.4.0 for el...
Installing Chef 11.4.0
warning: /tmp/tmp.e8Qh0w4p/chef-11.4.0.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID 83ef826a: NOKEY
Preparing...                ########################################### [100%]
   1:chef                   ########################################### [100%]
Thank you for installing Chef!

これでchefのセットアップが終わったので、先ほどのhello worldを実行します。

$ knife solo cook melody
Running Chef on melody...
Checking Chef version...
Syncing kitchen...
Adding patches...
Syncing solo config...
Running Chef...
Starting Chef Client, version 11.4.0
Compiling Cookbooks...
Converging 1 resources
Recipe: hello::default
  * log[Hello, Chef!] action write

Chef Client finished, 1 resources updated

これでlog[Hello, Chef!]が出てくれば成功です。

まとめ

Chef Solo本を読んでもうちょっとvagrant上で実行できるサンプルがあると嬉しいなと思って、hello recipeを参考に手元のvagrantで実行する方法をまとめてみました。今回のsampleはhttps://github.com/shibayu36/chef-solo-tutorial-sampleに置きましたので、これを参考に本に出てくる他のサンプルもためしてみると理解が深まると思います。