インフラストラクチャ自動化フレームワーク「Chef」の基本(2/2 ページ)
DevOpsというキーワードに関連して、「Chef」というツールの名前を聞いたことのある人も多いのではないでしょうか。この記事では、インフラにおける構成管理、展開作業を自動化するChefの構造および基本的な使い方について解説します。
Chef Clientのインストール
では、早速Chef Clientをインストールしてみましょう。以前はいろいろなインストール方法があり、導入に際してのハードルとなっていましたが、現在は1行でインストールが可能なOmnibus Installerと呼ばれるインストーラが提供されています。
% curl -L https://www.opscode.com/chef/install.sh | sudo bash
これでたいていの環境には導入が可能です。
Thank you for installing Chef!
と表示されたらインストール完了です。なお、手動でパッケージを選んでインストールしたい場合は、Install Chefを参照してください。
Apache HTTP Serverを導入するCookbook
では、実際にApache HTTP Serverを導入するCookbookを作成してみましょう。まず、以下のようなシェルスクリプトがあるとします。
#!/bin/sh # # apache2-take-simple # # Copyright 2013, CREATIONLINE,INC. # # # Value # NAME=`hostname --fqdn` # # check OSTYPE # if [ -e /etc/redhat-release ]; then OSTYPE=REDHAT elif [ x`lsb_release -si 2> /dev/null` = "xDebian" -o \ x`lsb_release -si 2> /dev/null` = "xUbuntu" ]; then OSTYPE=DEBIAN else echo "unknown OSTYPE" exit 1 fi # # install apache2 # case "x${OSTYPE}" in "xREDHAT" ) yum install -y httpd && \ rpm -q httpd 1> /dev/null 2> /dev/null ;; "xDEBIAN" ) apt-get update && \ apt-get install -y apache2 && \ dpkg -l apache 1> /dev/null 2> /dev/null ;; *) echo "cannot install apache2 because of unknown OSTYPE" exit 1 ;; esac # # check error # if [ "x$?" != "x0" ]; then echo "cannot install apache2" exit 1 fi # # set content # case "x${OSTYPE}" in "xREDHAT" ) echo "Welcome to ${NAME}" > /var/www/html/index.html ;; "xDEBIAN" ) echo "Welcome to ${NAME}" > /var/www/index.html ;; *) echo "cannot set content because of unknown OSTYPE" exit 1 ;; esac # # check error # if [ "x$?" != "x0" ]; then echo "cannot set content" exit 1 fi # # check content # case "x${OSTYPE}" in "xREDHAT" ) grep -qE "^Welcome to ${NAME}$" /var/www/html/index.html ;; "xDEBIAN" ) grep -qE "^Welcome to ${NAME}$" /var/www/index.html ;; *) echo "cannot check content because of unknown OSTYPE" exit 1 ;; esac # # check error # if [ "x$?" != "x0" ]; then echo "cannot set content" exit 1 fi # # set auto start # if [ "x${OSTYPE}" = "xREDHAT" ]; then chkconfig httpd on if [ "x$?" != "x0" ]; then echo "cannot set auto start apache2" exit 1 fi fi # # restart apache2 # case "x${OSTYPE}" in "xREDHAT" ) /etc/init.d/httpd restart && \ /etc/init.d/httpd status ;; "xDEBIAN" ) /etc/init.d/apache2 restart && \ /etc/init.d/apache2 status ;; *) echo "cannot restart apache2 because of unknown OSTYPE" exit 1 ;; esac # # check error # if [ "x$?" != "x0" ]; then echo "cannot restart apache2" exit 1 fi # # normal exit # exit 0 # # [EOF] #
このシェルスクリプトは、
- Linuxディストリビューションを判別します(Red Hat、CentOS、Debian、Ubuntu)。
- Red Hat系ならhttpdパッケージを、Debian系ならapache2パッケージをインストールします。
- index.htmlファイルを作成します。
- Red Hat系ならApache HTTP Serverの自動起動を設定します。
- Apache HTTP Serverを起動します。
という一連の作業を行います。
しかしシェルスクリプトでは、このようにLinuxディストリビューションごとの差異の吸収やエラーハンドリングをいちいち記述しなくてはならないため、大変長くなっています。
では、これと同じ作業を行うCookbookを書いてみることにしましょう。
先程Chef Clientをインストールしたノードにて、
% knife cookbook create apache2-take-simple -o .
と入力してください。これはChefのコマンドラインインターフェイスであるKnifeを利用し、apache2-take-simpleという名前でCookbookの雛形をカレントディレクトリに作成することを意味するコマンドです。
では、Recipeを記述してみましょう。apache2-take-simple/recipes/default.rbファイルに次のように記載します。
# # Cookbook Name:: apache2-take-simple # Recipe:: default # # Copyright 2013, CREATIONLINE,INC. # # # install apache2 # package 'apache2' do case node[ :platform ] when 'redhat', 'centos' package_name 'httpd' when 'debian', 'ubuntu' package_name 'apache2' end end # # set content # template 'index.html' do case node[ :platform ] when 'redhat', 'centos' path '/var/www/html/index.html' when 'debian', 'ubuntu' path '/var/www/index.html' end source 'index.html.erb' mode 0644 variables( { :fqdn => node[ :fqdn ] } ) end # # set auto start and restart apache2 # service 'apache2' do case node[ :platform ] when 'redhat', 'centos' service_name 'httpd' when 'debian', 'ubuntu' service_name 'apache2' end action [ :enable, :start ] end # # [EOF] #
さらに、apache2-take-simple/templates/default/index.html.erbファイルを作成し、次のように記載します。
Welcome to <%= @fqdn %>
なるべく元のシェルスクリプトからの差異が少なくなるように作成しましたが、それでもかなり見通しがよく、短くなったと思います。これを実現しているのがChefのAttributeとResourceです。AttributeとResourceがもたらすメリットをまとめると、以下の事柄が挙げられるでしょう。
- platform Attributeによって、Linuxディストリビューションの判別を行えます。
- package Resourceを使うことで、Linuxディストリビューションごとのパッケージ管理システムを意識する必要がなくなります。
- template Resourceを使うことで、設置したいファイルをeRuby形式で記載し、容易に値やコードの埋め込みが行えます。
- service Resourceを使うことで、Linuxディストリビューションごとのサービス管理システムを意識する必要がなくなります。
- 各種Resourceにはエラーハンドリングが内包されているため、個別に記述する必要がなくなります。
では、これをChef Soloを用いてノードに適用してみましょう。まず、Chef Soloの設定ファイルとなるsolo.rbを作成します。
cookbook_path [ '/home/ubuntu' ]
ここでは、適用するCookbookを置いてあるディレクトリを指定しています。/home/ubuntuの部分は、実際にCookbookが存在するディレクトリに置き換えてください。
次に、solo.jsonファイルを作成します。
{ "run_list": [ "recipe[apache2-take-simple]" ] }
ここでは、ノードに適用するRecipeを指定しています。
これで準備ができました。Chef SoloをUbuntu、CentOSの双方のノードで実行してみましょう。
% sudo chef-solo -j solo.json -c solo.rb Starting Chef Client, version 11.4.0 Compiling Cookbooks... Converging 3 resources Recipe: apache2-take-simple::default * package[apache2] action install - install version 2.2.22-1ubuntu1.3 of package apache2 * template[index.html] action create - update template[index.html] from 94850c to 6556f5 --- /var/www/index.html 2013-03-26 16:48:44.466012317 +0900 +++ /tmp/chef-rendered-template20130326-12296-45i4m6 2013-03-26 16:48:46.846014380 +0900 @@ -1,4 +1 @@ -<html><body><h1>It works!</h1> -<p>This is the default web page for this server.</p> -<p>The web server software is running but no content has been added, yet.</p> -</body></html> +Welcome to ubuntu.example.jp * service[apache2] action enable (up to date) * service[apache2] action start (up to date) Chef Client finished, 2 resources updated % % curl http://127.0.0.1/ Welcome to ubuntu.example.jp %
% sudo chef-solo -j solo.json -c solo.rb Starting Chef Client, version 11.4.0 Compiling Cookbooks... Converging 3 resources Recipe: apache2-take-simple::default * package[apache2] action install - install version 2.2.15-26.el6.centos of package httpd * template[index.html] action create - create template[index.html] --- /tmp/chef-tempfile20130326-1309-1oi5tkf 2013-03-26 16:52:28.140674985 +0900 +++ /tmp/chef-rendered-template20130326-1309-hcjw9x 2013-03-26 16:52:28.139674577 +0900 @@ -0,0 +1 @@ +Welcome to centos.example.jp * service[apache2] action enable - enable service service[apache2] * service[apache2] action start - start service service[apache2] Chef Client finished, 4 resources updated % % curl http://127.0.0.1/ Welcome to centos.example.jp %
いかがでしょうか。同一のCookbookでUbuntu、CentOS双方に対して同じ結果を得ることができました。
しかも、このChef Soloを何度実行しても動作に問題は起こりません。これがべき等性が保証されている状態です。
また、Apache HTTP Serverパッケージをアンインストールしたり、index.htmlファイルを削除したりしても、Chef Soloを再度実行することで元通り、Cookbookによって定義されたノードの状態に収束します。
おわりに
以上でインフラストラクチャ自動化フレームワークChefの基礎は終わりとなります。Cookbookをいちから記述する前に、Opscode Public Cookbooksをはじめとして公開されているCookbookを使ってみたり、参考にすると、より理解が深まるでしょう。
また、Chefは本稿で紹介したChef Soloによるスタンドアロン運用だけでなく、Chef Server/Clientによる大規模なクライアント・サーバ運用にも効力を発揮します。Chef Serverのインストールは、以前は手間が掛かる作業でしたが、現在はChef Client同様にインストーラが整備され、大変手軽に構築できるようになっています。これを機に導入してみてはいかがでしょうか。詳しくはInstall Chefを参照してください。
またOpscodeでは、Chef ServerをSaaSとして提供しています。Hosted Chefでは、5ノードまでは無料で利用できるので、Chef Serverがどのようなものか試用してみるのもいいでしょう。さらに、Hosted Chefを自前で運用したいという要望に応えるために、Private Chefも用意されています。
また、ChefのコマンドラインインターフェイスであるKnifeには多数のプラグインが作成されており、IaaS上にインスタンスを作成し、さらにChef環境を構築するといった使い方も可能です。
なお、Chefの情報はdocs.opscode.comに網羅されていますので、ここを参照することでほとんどの疑問は解決します。日本でのコミュニティに関する情報は、Twitterのハッシュタグ「#opschef_ja」などを参照してください。
関連特集:DevOpsで変わる情シスの未来
今やクラウド、ビッグデータに次ぐキーワードになったDevOps。だが前者2つが通過したようにDevOpsも言葉だけが先行している段階にあり、その意義や価値に対する理解はまだ浸透しているとはいえない。ではなぜ今、DevOpsが必要なのか? DevOpsは企業や開発・運用現場に何をもたらすものなのか?――本特集では国内DevOpsトレンドのキーマンにあらゆる角度からインタビュー。DevOpsの基礎から、企業や情シスへのインパクト、実践の課題と今後の可能性までを見渡し、その真のカタチを明らかにする。
Copyright © ITmedia, Inc. All Rights Reserved.