Edited at

Chefを使ってより効率的にサーバを管理しよう。まずは用語から

More than 1 year has passed since last update.


関連記事


Chefとは


  • サーバの状態を扱うフレームワーク

  • サーバ自身が保持しているサーバ状態をコードという外部表現で管理する。

  • Chefでサーバプロビジョニングを行う場合はSSHを通じて直接設定を書き換えるのは禁止する。


Chefの構成


Chef Server / Chef Client


  • サーバ・クライアント構成でChefを利用する。

  • 設定を中央サーバから各ノード(管理対象サーバ、クライアント)に配布し、適用していくことでプロビジョニングを実行する。

  • ローカル端末(クックブック)+ サーバ(Chef Server) + ノード(Chef Client)

  • 各ノードからChef Serverに対して変更がないかを確認し、変更があれば適用する。


Chef Solo

Chefのスタンドアロン版で、Chefのパッケージに含まれている。


  • スタンドアロンでChefを利用する。

  • ローカル端末(クックブック)+ ノード(chef-soloが設置されている)

  • knife-soloを使いローカル端末上のクックブックをリモートで各ノードに転送してchef-soloのコマンドを実行する。


Chef Zero(Chef Client Local Mode)


  • Chef ClientをLocal Modeに運用することによってChef Soloと同様の機能を提供する。

  • メモリ上で高速で動くChef Serverを作り、サーバ・クライアント構成と同じオペレーションが行われる。

  • サーバ・クライアント構成に移行するとき便利

  • 近頃はChef Soloの代わりに使っているようだが、ここではChef Soloを使う。


knife


  • Chefのための一連のコマンドツール群

  • リモートでChef ServerやChef Soloを操作する。

  • クライアント・サーバ構成の場合はknifeを、Chef Solo構成の場合はknife-soloを使う。


knife-solo


  • Chef Soloに特化したknifeのサブコマンドを提供する。

  • knife-soloをインストールすると依存関係のあるChefも同時にインストールされる。

  • 手元で作ったクックブックをリモートのサーバに転送してchef-soloコマンドを実行するといった一連の作業が自動化できる。


クックブック


  • サーバ構築の手順書が書かれた定義ファイル

  • knifeを使ってクックブックを生成する。


Berkshelf


  • クックブックの依存関係を管理する。

  • コミュニティから公開されたクックブックをbundlerのように管理することができる。


設置


環境


  • ホスト:OS X El Capitan

  • ゲスト:vagrant上のCentOS 6.7


ローカル端末


  • ここではホストが各ノード(ゲスト)を管理する。

  • knife-soloはgemで提供されるため、rubyが必要だ。

  • MACはrubyがデフォルトで設置されているが、rbenv環境のrubyを使うことを推奨する。

  • この場合も二つの選択肢がある。

  • グローバルのgem環境に設置する場合は、他のプロジェクトでもchefコマンドの利用ができる。

  • ローカル(プロジェクトの直下)のgem環境に設置する場合は、該当プロジェクトだけchefコマンドの利用ができる。

  • ここではグローバルのgem環境はできるだけ綺麗に管理したいので、ローカルのgem環境にknife-soloを設置する。

  • 人の好みによる問題で別にグローバルのgem環境に設置しても問題はない。

  • rbenvとvagrantのboxがすでに用意されていることを前提とする。


  • 用意されていない場合は下記の記事を参考にしていただきたい。



  • knife-soloなどのgemをbundlerで管理する。


  % cd chef

% bundle init


  • 生成されたGemfileを開き下記のようにgemを追加する。

  % vi Gemfile

... snip ...
gem 'knife-solo'
gem 'berkshelf'


  • vendor/bundle以下にgemを設置する。

  % bundle install --path vendor/bundle --jobs=4 --binstubs


  • 設置したgem一覧を確認する。

  % bundle exec gem list


  • knife-soloでリポジトリを生成する。

  % knife solo init .

# リポジトリのディレクトリ構造
% tree . -L 1
.
├── Berksfile
├── Gemfile
├── Gemfile.lock
├── Vagrantfile
├── bin
├── cookbooks
├── data_bags
├── environments
├── nodes
├── roles
├── site-cookbooks
└── vendor


  • .gitignoreを下記のように修正する。

  % vi .gitignore

/cookbooks/
/.bundle/
/bin/
/vendor/bundle/
Gemfile.lock
Vagrantfile


  • gitリポジトリを生成する。

  git init

git add .
git commit -m "Create knife-solo's repository"

# githubのほうにchefというリポジトリを生成した場合
git remote add origin git@github.com:devtopia/chef.git
git push -u origin master


ノード(vagrant上のCentOS 6.7)


  • knife-soloでノードにChef Soloをインストールする。

  # 仮想サーバの状態を確認

% vagrant status
Current machine states:

default running (virtualbox)

# 仮想サーバのホストがdevの場合
% bin/knife solo bootstrap dev


  • 処理結果

  % bin/knife solo bootstrap dev

Bootstrapping Chef...
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 20022 100 20022 0 0 3451 0 0:00:05 0:00:05 --:--:-- 79452
Getting information for chef stable 12.7.2 for el...
downloading https://omnitruck-direct.chef.io/stable/chef/metadata?v=12.7.2&p=el&pv=6&m=x86_64
to file /tmp/install.sh.3056/metadata.txt
trying wget...
url https://opscode-omnibus-packages.s3.amazonaws.com/el/6/x86_64/chef-12.7.2-1.el6.x86_64.rpm
md5 8c3ba2e797fc852fc557b0e7157556cc
sha256 6af0eb1c7706fc6a36f74ae9f590135e37e6206f2fe7d5a1760c1e2da1b36068
version 12.7.2downloaded metadata file looks valid...
downloading https://opscode-omnibus-packages.s3.amazonaws.com/el/6/x86_64/chef-12.7.2-1.el6.x86_64.rpm
to file /tmp/install.sh.3056/chef-12.7.2-1.el6.x86_64.rpm
trying wget...
Comparing checksum with sha256sum...
Installing chef 12.7.2
installing with rpm...
警告: /tmp/install.sh.3056/chef-12.7.2-1.el6.x86_64.rpm: ヘッダ V4 DSA/SHA1 Signature, key ID 83ef826a: NOKEY
準備中... ########################################### [100%]
1:chef ########################################### [100%]
Thank you for installing Chef!
Generating node config 'nodes/dev.json'...
Running Chef on dev...
Installing Berkshelf cookbooks to 'cookbooks'...
Resolving cookbook dependencies...
Uploading the kitchen...
WARNING: Local cookbook_path '/Users/devnote/Documents/study/chef/cookbooks' does not exist
Generating solo config...
Running Chef: sudo chef-solo -c ~/chef-solo/solo.rb -j ~/chef-solo/dna.json
Starting Chef Client, version 12.7.2
Compiling Cookbooks...
Converging 0 resources

Running handlers:
Running handlers complete
Chef Client finished, 0/0 resources updated in 01 seconds


参考


  • チーム開発実践入門

  • Chef実践入門