Chefをインストールしてサーバ環境を構築する

Chefをインストールしてサーバ環境を構築する

こんにちは、Yuuです。2014年12月9日に第5回目の勉強会「ファンタラクティブ・オープンミーティング」を開催しました。内容はChefを中心にお話したので、こちらでも再度Chefの流れをまとめてみようと思います。

Chefとは

Chef Official Site

https://www.chef.io/

Rubyコードを書くことで、サーバ構成をスクリプトベースで自動的に構成してくれるツールです。

クックブック(Cookbooks, site-cookbooksフォルダ)と呼ばれるディレクトリを作り、そのなかに含まれるレシピ(Recipesフォルダ以下)にRubyコードを書きます。
また、上記以外にChefを動かすために必要なファイルもあり、それら全てを含めてキッチン、もしくはリポジトリといいます。
そしてこのキッチンを作成・操作するためのツールをナイフ(knife)といいます。

Chefの動作形態

Chefの動作形態には2種類の形式があり、Chef ServerとChef Clientの組み合わせによるクライアント・サーバ型、Chef Soloによるスタンドアロン型があります。

Chef ServerとChef Client

全体を統合するためのサーバとしてChef Serverを1台用意したうえで、設定対象となるサーバにはChef Clientをインストールすることで、個々のサーバの設定作業は、Chef Clientが行い、Chef Serverでは情報管理を行う形式です。中〜大規模以上環境用。

Chef Solo

スタンドアロン形式のChef Soloは、実行対象となるサーバに直接インストールし、設定内容となるクックブックなどを配置・実行します。Chef Serverが必要が無いため、小規模環境用。

今回はスタンドアロン型の「Chef Solo」を使用して環境を構築します。

 構築環境

Vagrantを使用して、基本的にはホストOS上で操作し、ゲストOSに反映させる流れになります。

ホストOS環境

  • Mac OS X 10.9.5
  • Vagrant 1.5.2
  • Ruby 2.1.1p76

ゲストOS環境

  • CentOS 6.5
  • Apache
  • PHP 5.4
  • MySQL

Vagrantの初期化

予め、VirtualBox、Vagrantはインストールしてある前提です。
作業用ディレクトリを作成し、下記を実行します。

$ vagrant box add opscode-centos-6.5 http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_centos-6.5_chef-provisionerless.box
$ vagrant init opscode-centos-6.5
$ mkdir opscode && opscode
$ vagrant up
$ vagrant ssh-config --host lamp >> ~/.ssh/config

これで、サーバにssh lampでログインできるようになります。

Bundlerを導入する

Rubyはバージョンの依存関係でぶつかることが多いので、gem管理ツールを導入して、gemの依存関係を解消します。

$ sudo gem install bundler

作業用ディレクトリ内で、Gemfileを作成します。

$ vi Gemfile

source 'https://rubygems.org'

gem 'chef'
gem 'knife-solo'
gem 'berkshelf'

bundleを使ってGemfileに書かれたツールをインストールします。

$ bundle install

knife-solo

ChefをChef Solo環境で利用するためのツールで、Chef Soloをインストールしたり、作成したクックブックをサーバにリモート反映させることができます。
インストールすると、knifeコマンドと、knife soloコマンドが使えるようになります。

BerkShelf

BerkshelfはChefのクックブック管理ツールで、他の方が作成したクックブックをダウンロードする際にいい感じにしてくれるそう。
RubyでいうBundlerと同じものとのこと。詳しくは和訳文を読んでいただけると。

Chef Soloのインストール

Chef SoloはChef本体をインストールすると、一緒にインストールされます。
Chef社が提供するインストラーがあるので、サーバログイン後、コマンドで直接インストールすることが可能です。

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

ただ、直接ログインせずにリモート反映させたいので 、knife-soloを使ってインストールします。

キッチン(リポジトリ)を作成

Chef Soloを利用するにあたって、Chefリポジトリを新規に作成します。
Vagrantの作業用ディレクトリにて下記を実行します。

$ bundle exec knife solo init .

.
├── Berksfile
├── Gemfile
├── Vagrantfile
├── cookbooks
├── data_bags
├── environments
├── nodes
├── roles
└── site-cookbooks

Chef Soloをサーバにインストール

$ bundle exec knife solo bootstrap lamp

これで、Chef Soloの実行環境ができました。

クックブックの作成

クックブックは、Apache、PHP、MySQLとソフトウェアごとにまとめるのがよさそうとのことなので、knife-soloを利用してそれぞれのクックブックを作成します。

今回は例としてApacheのクックブックを作ります。
自分が作成したCookbookはsite-cookbooks内に保存するということなので下記コマンドを実行します。

$ bundle exec knife cookbook create apache -o ./site-cookbooks

レシピの編集

レシピの詳しい書き方は追々として、今回は簡単なApacheのみの構成です。

$ vi site-cookbooks/apache/recipes/default.rb

#
# Cookbook Name:: apache
# Recipe:: default
#
# ------------------------------------
# package
# ------------------------------------
package "httpd" do
action :install
end
# ------------------------------------
# service
# ------------------------------------
service 'httpd' do
supports :status => true, :restart => true, :reload => true
action [ :enable, :start ]
end

Berksfileの編集

$ vi Berksfile

site :opscode

cookbook "apache", path: "./site-cookbooks/apache"

※Berkshelf3以降はsite: opscodeの記述がsource〜に変更となっています。

クックブックの実行

$ bundle exec berks install --path ./cookbooks

これで、cookbooksディレクトリ以下にapacheのクックブックが配置されます。

ノードオブジェクトの設定

ChefではChefで管理するサーバのことをノードといいます。

このノードに何のクックブックを適用するか、などをJSONファイルに記載します。
JSONファイルは、bundle exec knife solo bootstrap lampを実行した際に、nodesディレクトリ内に自動的に生成されています。

$ vi nodes/lamp.json

{
"run_list":[
"recipe[apache]"
]
}

Chef Soloの実行

ApacheのクックブックをゲストOSに適用する準備が整ったので下記コマンドを実行します。

$ bundle exec knife solo cook lamp

これでApacheの適用ができました。
同じようにPHP、MySQLなどのクックブックを作成し、ノードオブジェクトやBerksfileに設定追加していきます。

公開されているクックブックを使う

コミュニティクックブックとして公開されている、他の方が作成したクックブックをダウンロードして使用することができます。
Yum、PHPなど公式のChef社がメンテナンスをしているものもあるので、自分でクックブックを作成しレシピを書かずとも 楽に環境を作ることが出来ます。

Berksfileの編集

# Berksfileを編集

$ vi Berksfile

site :opscode

cookbook "apache", path: "./site-cookbooks/apache"
cookbook "yum", "~> 3.5.1"
cookbook "php", "~> 1.5.0"
cookbook "hogehoge", git: "git://github.com/hogehoge/chef-hoge.git"

# クックブックをダウンロード
$ bundle exec berks install --path ./cookbooks

#ノードオブジェクトの設定
$ vi nodes/lamp.json

{
"run_list":[
"recipe[apache]"
"recipe[yum]"
"recipe[php]"
"recipe[hogehoge]"
]
}

# クックブック適用
$ bundle exec knife solo cook lamp

基本的にはopscodeからクックブックをダウンロードしますが、上記のようにgithubのデータも適用できます。
コミュニティクックブックを改修したい場合は、一旦フォークして、自分のgithubからもってくるのがいいのかな。

現在作ってるクックブックは後ほどgithubに上げてメンテナンスしていこうと思います。

今回作った資料

補足

スライドの最後にもありますが、Chef SoloはChef Zeroに移るそうなのでその辺も追々。

トラックバック

TRACKBACK&PING

TrackBack URL :

コメントを残す

メールアドレスが公開されることはありません。