chef-solo はじめてのLinux環境構築の自動化入門

DevOps

環境構築を自動化すれば数分でサーバ構築して投入できますよ?@HIROCASTERでございませう。
vagrantで開発環境(仮想マシン)を自動構築しようの記事で、仮想マシンにchefやpuppetを自動的に実行させて開発環境を自動で構築する手順を紹介しました。
環境構築を自動化する内容をchefであれば、レシピと呼ばれるものを、puppetであればマニフェストと呼ばれるものを記述しなければなりません。
今回はパッケージ(NTP)を導入して、NTPの設定ファイルを自動的に配備して、サービスを立ち上げるという環境構築の自動化をchef-soloを使って、紹介したいと思います。基本的に他のソフトになっても手順は同じです。参考にしてください。

スポンサーリンク

chefとchef-soloの違い

chefはクライアントとサーバの形を取っており、chefを実行するためにはサーバにレシピや付随する数多くのデータがなければなりません。
また、chefサーバが稼働していることが前提となるため、chefサーバを構築するとういハードルが少し高くなります。
一方、chef-soloはサーバが不要で、本来サーバから取得すべきデータと一緒に実行することによって、chefサーバ不要でクックブックを実行するものです。
Gitリポジトリにchef-soloのデータを全部登録しておけば、取得して実行するだけで、複数のLinux環境やMac環境でも環境構築が簡単に自動化できます。
chef-soloはrubyがあるだけで実施できるので、お手軽です。今回はこのchef-soloを利用します。

chefのインストール

chef-soloはgemパッケージのchefに含まれています。これをインストールします。

gem install chef --no-rdoc --no-ri

cookbookの作成

chefの操作は基本的にknifeコマンドを利用します。
以下のようにして、cookbookのひな形を作成します。今回はntpのクックブックを作成します。

mkdir cookbooks && cd cookbooks
knife cookbook create ntp -o ./

クックブックはchefで実行されるコマンド内容や設定などが組み合わさった1つの集まりです。
MySQLのクックブックやApacheのクックブックなど、導入するソフトウェアごとにつくりわけたりします。

作成したクックブックのファイル構造はこの様な感じ。

ntp
├── README.md
├── attributes
├── definitions
├── files
│   └── default
├── libraries
├── metadata.rb
├── providers
├── recipes
│   ├── default.rb # ここに自動実行する命令を記述する
├── resources
└── templates
    └── default # 設定ファイルなどのテンプレートをおく

環境構築などの命令を記述していくのはrecipes以下にファイルをつくる。
default.rbは初期設定で動くので、これに変更を加える。
recipes/default.rb

package "ntp" do # ntpパッケージをインストールする
  action :install
end
service "ntp" do # ntpのサービスを定義
  supports :status => true, :restart => true
  action [ :enable, :start ]
end
template "/etc/ntp.conf" do # テンプレートファイルを元に設定ファイルを配備
  source "ntp.conf"
  group "root"
  owner "root"
  mode "400"
  notifies :restart, "service[ntp]" # 配備後にサービスを再起動
end

設定ファイルをテンプレートファイルとして以下のパスにおきます。erbを書けば、変数を展開した設定ファイルを作成することができます。
templates/default/ntp.conf

driftfile /var/lib/ntp/ntp.drift
statistics loopstats peerstats clockstats
filegen loopstats file loopstats type day enable
filegen peerstats file peerstats type day enable
filegen clockstats file clockstats type day enable
server ntp.nict.jp
server ntp1.sakura.ad.jp
server ntp.nc.u-tokyo.ac.jp
restrict -4 default kod notrap nomodify nopeer noquery
restrict -6 default kod notrap nomodify nopeer noquery
restrict 127.0.0.1
restrict ::1

chef-soloの実行

以前の記事で紹介したvagrant環境下のVMに適応するのであれば

vagrant provision

だけでchef-soloは実行されます。
vagrantのVM環境ではなく、実際に今操作しているLinux環境などに実行するためには以下のファイルを追加する。
solo.rb

file_cache_path "/tmp/chef-solo"
cookbook_path   "/home/hirocaster/chef-solo-sample/cookbooks" # full path only

chef-soloを実行するための設定ファイル
chef.json

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

本来chef-serverから受け取る実行すべきcookbookなどのJSONデータ
JSONのrun_listにレシピを何個も書いてあげれば、何個も実行する。レシピを増やしたらここを追加するのを忘れずに!
実際に実行するコマンドはこんな感じ。

sudo chef-solo -c ./solo.rb -j ./chef.json

ぞろぞろぞろっ、っと実行ログが出力される。
rvm環境以下はこんな感じ

$ rvmsudo chef-solo -c solo.rb -j chef.json
[2012-08-09T02:05:47+09:00] INFO: *** Chef 10.12.0 ***
[2012-08-09T02:05:47+09:00] INFO: Setting the run_list to ["recipe[ntp]"] from JSON
[2012-08-09T02:05:47+09:00] INFO: Run List is [recipe[ntp]]
[2012-08-09T02:05:47+09:00] INFO: Run List expands to [ntp]
[2012-08-09T02:05:47+09:00] INFO: Starting Chef Run for www3042u.sakura.ne.jp
[2012-08-09T02:05:47+09:00] INFO: Running start handlers
[2012-08-09T02:05:47+09:00] INFO: Start handlers complete.
[2012-08-09T02:05:47+09:00] INFO: Processing package[ntp] action install (ntp::default line 10)
[2012-08-09T02:05:47+09:00] INFO: Processing service[ntp] action enable (ntp::default line 14)
[2012-08-09T02:05:47+09:00] INFO: Processing service[ntp] action start (ntp::default line 14)
[2012-08-09T02:05:47+09:00] INFO: Processing template[/etc/ntp.conf] action create (ntp::default line 19)
[2012-08-09T02:05:47+09:00] INFO: Chef Run complete in 0.218744014 seconds
[2012-08-09T02:05:47+09:00] INFO: Running report handlers
[2012-08-09T02:05:47+09:00] INFO: Report handlers complete

こんな感じでソフトウェアの導入と設定ファイルの配備、サービスの再起動などは自動化できます。
環境構築自動化のポイントは、いきなりすべて自動化に切り替えるのではなく、少しずつ実施することです。
開発当初であれば、最初から自動化して環境をつくっていくことがベストプラクティスです。

ウェブオペレーション ―サイト運用管理の実践テクニック (THEORY/IN/PRACTICE)

ウェブオペレーション ―サイト運用管理の実践テクニック (THEORY/IN/PRACTICE)

John Allspaw、Jesse Robbins、角 征典

Test-Driven Infrastructure With Chef

Test-Driven Infrastructure With Chef

Stephen Nelson-smith

タイトルとURLをコピーしました