Vagrant + Knife-solo + chef-soloでHello Chef!

前々回取り上げたVagrantと,環境構築を自動化するツールであるChef Soloを利用して,インフラのコード化にチャレンジ.

はじめに

NLPな研究室に属するサーバ管理者が,各種マシンの設定を自動化する技術を学ぶためにChefに手を出した話.
今回は,VagrantとChefを実際に動かしてみて,Hello Chef!を実行するところまでをまとめる.
なお,これら一連の手順は,下記の文献を参考にしている.

参考:入門Chef Solo – Infrastructure as Code [Kindle版]
入門Chef Solo - Infrastructure as Code ※大変良書.この記事を読むよりも,この本を買って読む方が何倍も理解が深まる.

環境

  • Virtual Box 4.2.18
  • Vagrant 1.3.3

Vagrant側の設定

Cent OS 6.4上に環境を構築する.

1
2
$ vagrant box add centos-6.4 http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130427.box
$ vagrant init

vagrant upコマンドを実行する前に,ネットワーク設定を編集する.
ホストOS側からゲストOSへのネットワークアクセスをアクティブにし,かつゲストOSのIPを192.168.50.12に設定する.
※仕様変更により,参考書通りに書いても動作しないので注意.

1
2
3
4
5
6
7
8
9
10
11
12
# Vagrantfile
Vagrant::Config.run do |config|
    config.vm.box = "centos-6.4"
    # こちらでは動かないので注意
    # config.vm.network :hostonly, "192.168.50.12"
    # こちらで書き直す
    config.vm.network :private_network, ip: "192.168.50.12"

    # VMのマシン名設定(おこのみで)
    config.vm.provider :virtualbox do |vb|
        vb.name = "hello-chef"
    end

vagrant upで起動する.
またknife-soloというツールを利用するために,ゲストOSにsshアクセス出来るようssh-configの設定をホスト側のconfigに書き加えておく(今回は,ホスト名:helloc).

1
2
3
4
5
6
7
8
9
10
11
12
$ vagrant ssh-config --host helloc
Host helloc
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile "/Users/makabi/.vagrant.d/insecure_private_key"
  IdentitiesOnly yes
  LogLevel FATAL
$ vagrant ssh-config --host helloc >> ~/.ssh/config

ssh hellocして,ログイン出来たら成功である.
さらに前回紹介した,saharaも入れておくと良い.

Chef の導入

Opscodeが提供しているスクリプトを利用することで,簡単にChefを導入することができる.

1
$ curl -L http://www.opscode.com/chef/install.sh | sudo bash

または,gem install chefでインストールすることも可能.

次にknifeの初期設定を行う.
knifeとは,Chefをインストールすると自動でインストールされる,レポジトリ操作用のツールである.
以下のコマンドを実行する(色々聞かれるが,全てデフォルトでOK).

1
$ knife configure

完了すると,~/.chef/knife.rb にknifeの設定ファイルが保存される.

knife-solo の導入

通常,Chef Soloの各種設定はゲストOS側にログインした上で行われる.
しかしこれだと煩雑なので,リモートからchef-soloを実行できる,knife-soloを導入する. (knife-soloを利用しない場合に関しては,参考図書の2章と3章で説明されているので,ご一読下さい).
knife-soloは,knifeコマンドにchef-solo向けのコマンドを多数追加するものである.
最新版である0.3.0を導入するために,Versionを指定する.

1
$ gem install -v ">=0.3" knife-solo

knife-solo + chef-solo でHello Chef!

大まかな流れは以下の通りである.

  1. レポジトリの作成
  2. ホストにchef-soloをインストール
  3. クックブックの作成
  4. レシピの作成
  5. レシピ転送 & リモート実行

レポジトリの作成

キッチンとも呼ばれる.作業用ディレクトリ.
1システム1レポジトリ程度の粒度である.

1
$ knife solo init chef-repo

0.3.0からは,テンポラリディレクトリやクックブックのパスを指定するsolo.rbの設定ファイルは生成されない.
この下をバージョン管理しておく.

1
2
3
4
$ cd chef-repo
$ git init
$ git add .
$ git commit -m "initial commit"

ホストにchef-soloをインストール

指定したサーバにchef-soloをインストール.
このときサーバに必要なのは,ssh & sudoできるログインアカウントだけである.

1
2
3
4
5
6
7
8
9
10
$ knife solo prepare helloc
$ tree chef-repo/
chef-repo/
├── Berksfile
├── cookbooks
├── data_bags
├── nodes
│   └── helloc.json
├── roles
└── site-cookbooks

これで,nodesディレクトリ以下にhelloc.jsonファイルが作成される.
これは,Chef Solo実行時に実行するレシピ群などを記載しておくファイルである.
各ディレクトリの説明を以下に示す.

  • cookbooks, site-cookbooks クックブックを格納するディレクトリ.cookbooksには第三者の作ったクックブックを,site-cookbooksには自分の作ったクックブックを入れることが推奨されている.
  • nodes ノード毎のjsonファイルの格納場所.
  • data_bags, roles に関しては省略.

クックブックの作成

knifeコマンドを利用して,site-cookbooksディレクトリにhelloというクックブックを作成

1
$ knife cookbook create hello -o site-cookbooks

レシピの作成

knifeコマンド実行時にレシピの雛形は作成されているため,これを編集する.

1
2
3
4
5
6
7
8
9
10
11
12
$ emacs site-cookbooks/hello/recipes/default.rb

#
# Cookbook Name:: hello
# Recipe:: default
#
# Copyright 2013, YOUR_COMPANY_NAME
#
# All rights reserved - Do Not Redistribute
#

log "Hello, Chef!"

Resourceと呼ばれる様々な命令を与えることで,サーバの状態を決定できる. 主なコマンドの例を以下に紹介する.

  • Package
    Packageの状態を記述する(インストール)
  • Log
    Chefのログを操作する
  • Service
    サービスを操作する(サービスの起動/停止,OSブート時に起動するサービスとして登録)
  • Template
    設定ファイルをChefでいじる 指定されたテンプレートを展開し,設定ファイルとして利用できる

Chef Solo実行時に実行するレシピも記述しておく.
helloc.jsonを編集する.

1
2
3
4
5
{
    "run_list": [
        "recipe[hello]"
    ]
}

レシピ転送 & リモート実行

最後に,以下のコマンドを用いてホストでchef-soloを実行する.

1
$ knife solo cook helloc

ここで,以下のような出力がえられれば成功である.

1
2
3
4
5
6
7
8
9
10
11
12
Running Chef on helloc...
Checking Chef version...
Uploading the kitchen...
Generating solo config...
Running Chef...
Starting Chef Client, version 11.6.0
Compiling Cookbooks...
Converging 1 resources
Recipe: hello::default
  * log[Hello, Chef!] action write

Chef Client finished, 1 resources updated

ここまでがおおまかな流れとなる.
簡単!素晴らしい!!

Comments