ファンブライト山下です。
最近、サーバーの構成状態を管理できるツール「Chef」を使い始めています。
やりたかった事が一通り出来るようになりましたので、Chef の概要説明を含めたご紹介です。
Chef とは?
「DevOps」や「自動化」、「仮想化」、「クラウド」などのキーワードの中で注目されているツールで、特にIT会社で利用されるシーンが増えています。
「Chef」をうまく使うと、サーバーの「あるべき」構成状態をプログラムで管理できるようになります。
例えば、以下のような事が実現できます。
- 新規でサーバーを構築する際に、手順書化されるような作業を自動化できる
- 既存のサーバー構成の変更作業を自動化できる
- 既存のサーバー管理をChefで行う事によって、構成情報を管理できる
具体的には、以下のような作業を、プログラムで定義し、実行する事ができます。
- OSのアカウントやグループを作成する
- ディレクトリを作成する
- パッケージをインストールする
- 設定ファイルを配置する
- サービスの起動設定をする
上記載はあくまで一例です。実際には、さらに色々な事が出来ます。結構便利です。
ちなみに、「Chef」という名称は、料理人(シェフ)を表現しています。Chef の仕組みでは、料理本の「Cookbook」や、料理レシピにあたる「Recipes」等の名称があります。親しみやすい名称ですので、頭も整理しやすくなります。
Chef の利用例
今回用意した Chef 利用環境は以下のような感じです。構築対象OSはCentOSです。
基本的に、右側(青色)の「Chef作業端末」から作業を行います。
ただし、作業前に、左側(ピンク色)の「Chef 管理対象ノード」で、基本的なCentOSのインストールを行っておきます。あとは、「Chef作業端末」から自動認証でSSHログインできるように設定を行っておきます。
あとは、「Chef作業端末」で「レシピ」や「テンプレート」などのファイルを用意します。
この「レシピ」というのはRubyのコードです。サーバーにインストールしたいrpmパッケージを定義したり、配置したい設定ファイルを指定したり、起動させたいサーバーや停止したいサーバーを定義したりします。
たとえば以下のコードです。そんなに難しいものではないと思います。
package "nginx" do action :install end service "nginx" do supports :status => true, :restart => true, :reload => true action [ :enable, :start ] end template "nginx.conf" do path "/etc/nginx/nginx.conf" source "nginx.conf.erb" owner "root" group "root" mode 0644 notifies :reload, 'service[nginx]' end
このRubyコードでは、Nginx(Webサーバー)をインストールし、起動設定を行い、設定ファイルを配置して Nginxを再起動します。
このRubyコード以外に、Nagix 設定ファイルのテンプレートを用意します。例えば以下のようなファイル(nginx.conf.erb)を指定の場所に配置しておきます。
user nginx; worker_processes 1; error_log /var/log/nginx/error.log; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; server { listen <%= node['nginx']['port'] %>; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; } } }
このテンプレートファイルを元に、Chef実行時に、Nginx設定ファイルとして対象ノードに配布されます。
あとは、Chef管理対象ノードを定義したJSONファイルを用意します。以下のようなファイルです。
{ "nginx": { "port" : 80 }, "run_list":[ "recipe[nginx]" ] }
このJSONファイルで、レシピ「nginx」を指定しています。また、ポート番号「80」を指定していますが、この値が先ほどの「Nagix設定ファイルのテンプレート」で書かれている以下の場所に埋め込まれます。
<%= node['nginx']['port'] %>
これらのファイルを用意した後に、Chef(knife solo)を実行すると、コードに従ってインフラの設定が行われるわけです。人が手順書を見ながら実施するような作業が自動的に実施できるわけです。
実行コマンドは以下になります。
$ knife solo cook (対象ノード)
また、Chefの導入メリットは自動化だけではありません。「Chefでレシピを何度実行してもレシピのとおりに実行される」=「サーバーの構成状態をレシピ通りに管理できる」という事が実現できます。
ただし、このメリットは、構成情報の管理方法を今までのやり方から変更するなどの業務プロセス改革が伴うと考えられます。既存のやり方に大きな課題認識がある場合に、メリットと感じられると思われます。
以上が、Chef を使ったサーバー構築自動化の概要となります。私自身もこれからChefを使いこなせるように取り組んでいく事になりますが、とても面白いツールです。
多くのサーバーを構築し管理するITサービスプロパイダーやアプリ開発会社などで、有効なツールだと思います。ぜひ、ご利用を検討されると良いかと思います。