Rubyでサーバ設定を自動化! Chef Soloを試そう!第4回

前回はファイアウォールの設定が必要だというところで終わりましたが、ファイアウォールであるiptablesの操作を行うcookbookも提供されています。これも、cookbooksディレクトリにダウンロード展開します。


cookbooks$git clone git://github.com/opscode-cookbooks/iptables.git

このcookbookは/etc/iptables.dに設定用のファイルをコピーし、その後そのファイルを使ってiptablesを設定します。

既定では確立済みのセッションを許可するall_established.erbというテンプレートと、ICMPプロトコルを許可するall_icmp.erbだけが設定されます。HTTPを許可するためには下記のファイルを用意します。

cookbooks/main/templates/default/http.erb


# Port 80 for http
-A FWR -p tcp -m tcp --dport 80 -j ACCEPT

ただ、これではSSHによる接続もできなくなるので、これを許可するテンプレートも用意します。

cookbooks/main/templates/default/ssh.erb


# Port 22 for ssh
-A FWR -p tcp -m tcp --dport 22 -j ACCEPT

つぎに、cookbooks/main/recipes/default.rbに、iptablesのレシピと、上記の2つのファイルを設定するためのメソッド呼び出しを追加します。

cookbooks/main/recipes/default.rb


include_recipe "selinux::permissive"
include_recipe "apache2"
include_recipe "iptables"
iptables_rule "ssh"
iptables_rule "http"

これでrsyncとsshによるchef-solo実行を行えば、http://192.168.1.1/でApacheのでファオルトページが表示されるはずです。

Rubyでサーバ設定を自動化! Chef Soloを試そう!第3回

さて、これまですべて自作でApacheのインストールと起動設定を行いましたが、実はたくさんの方が使っている製品の場合、他の方が既にCookbookやレシピを公開している事が多いのです。たとえばChefの主要開発元であるOpscodeのコミュニティページには、主要なオープンソースプロダクトのCookbookが列挙されています。

http://community.opscode.com/cookbooks

Apacheについてもapache2の名前で各種のLinuxディストリビューションやAmazon EC2、FreeBSDに対応したCookbookが登録されています。

CentOSなどRedHat系OSの場合、Apacheの設定ファイルはhttp.confの大きなファイルが使われていますが、このファイルを編集して使用するのは自動化にとっては頭の痛い問題です。そこで、apache2のCookbookではDebianスタイルの設定ファイルを採用しています。つまり、サイトやモジュールごとに設定ファイルを分け、シンボリックリンクを使ってロードする方式です。

apache2のCookbookをダウンロードし、ローカルのcookbooksディレクトリに展開します。gitが使える場合には下記のコマンドでダウンロードと展開ができます。

cookbooks$git clone git://github.com/opscode-cookbooks/apache2.git

main/recipes/default.rbはこのapache2のレシピを呼び出すことになるので、下記のように書き換えます。

include_recipe "apache2"

編集後に

client$ rsync -r . root@192.168.1.1:/var/chef
client$ ssh root@192.168.1.1 "chef-solo -c /var/chef/solo.rb"

を実行すると、下記のようなエラーが発生しました。


[apache2] (apache2::default line 219) had an error: Mixlib::ShellOut::ShellCommandFailed: Expected process to exit with [0], but received '1'
---- Begin output of /sbin/service httpd start ----
STDOUT: httpd を起動中: [失敗]
STDERR: httpd: Could not open configuration file /etc/httpd/conf/httpd.conf: Permission denied
---- End output of /sbin/service httpd start ----

/etc/httpd/conf/httpd.confの読み取り権限がないというメッセージですが、パーミッションは0644となっており読み取りできるはずということで調べてみると、centOSでデフォルトで有効になっているselinuxが原因のようです。

自分で解除してもよいのですが、opscode-cookbooks/selinuxが用意されているので、これも使うことにします。

cookbooks$git clone git://github.com/opscode-cookbooks/selinux.git

main/recipes/default.rbに呼び出しを書き加えます。

include_recipe "selinux::permissive"
include_recipe "apache2"

更新後chef-soloを実行すると、今度はエラーは出なくなり、httpdが無事起動されました。

ただ、http://192.168.1.1/を参照してみると接続出来ませんね。調べてみるとデフォルトでファイアウォールが有効になっているためブロックされているようです。
ファイアウォールの設定も自動化したいところですが、それは次回ということで。

Rubyでサーバ設定を自動化! Chef Soloを試そう!第2回

前回は、chef-soloを使ってapache(httpd)をインストールしましたが、CentOSなどRedHat系では、サービス登録がされないので起動の設定をする必要があります。

chef/cookbooks/main/recipes/default.rb に下記の追加を行います。

service :httpd do
  action [:enable, :start]
end

これで、サービス登録がされ、httpdが起動されます。

ところで、いちいちサーバーにログインしてファイルを編集するのは面倒ですし、複数のサーバーに同じ設定をしようとするとさらに大変です。そこで、rsyncを利用してファイルを同期させる事にしましょう。

まず、サーバーにsshdをインストールし、root でリモートログインできるようにしておきます。

sshでリモートログインできるようになったら、scpを使ってサーバー上のchef関連のファイルをローカルクライアントにコピーしましょう。ここではサーバーのIPアドレスを192.168.1.1と仮定します。

client$ scp root@192.168.1.1:/var/chef .

パスワードが要求されるので入力します。サーバー上のchefディレクトリがカレントディレクトリにコピーされます。今後はクライアント側のファイルを編集した後、下記の通りrsyncコマンドでサーバーに同期させます。

client$ rsync -r . root@192.168.1.1:/var/chef

こちらもパスワード入力が求められます。ファイル同期が終わったら、後は下記のコマンドでサーバー上でchef-soloを実行します。

client$ ssh root@192.168.1.1 "chef-solo -c /var/chef/solo.rb"

言い忘れましたが、上記はクライアントがLinuxまたはMac OS Xの場合です。Windowsの場合には下記の記事などを参考にすれば良いかと思います。(すいません。ためしてません)

Windowsユーザもrsyncでファイルをアップしよう

Rubyでサーバ設定を自動化! Chef Soloを試そう!第1回

前回の第0回でCentOS 6.2にRuby 1.9.3をソースコンパイルでインストールしました。今回はいよいよChefのインストールです。gemコマンド一発でインストールは完了です。

[root@localhost ~]# gem install chef ruby-shadow --no-ri --no-rdoc

ruby-shadowはlinuxのパスワードファイルの操作を行う場合に必要となるライブラリです。また、インストールしたマシンは開発用のマシンではありませんのでgemのリファレンスの生成を抑止するため、–no-ri –no-rdoc というスイッチをつけています。

せっかくChefをインストールしたので、早速試してみましょう。今回使用しているマシンにはApacheがインストールされていません。これをChefを使ってインストールしてみます。

Chefでは一連のサービスあるいは機能の設定に必要な操作の定義をcookbook(料理本)と呼びます。cookbookの中には複数のrecipe(レシピ)が含まれます。今回はサーバーを必要としないChef Soloを使うので、設定ファイルは設定をしようとするマシンのローカルディスクにある必要があります。まず、/var ディレクトリの下に、chef-soloの実行に必要な定義ファイルを収納するためのディレクトリを作成します。

[root@localhost ~]# mkdir /var/chef
[root@localhost ~]# cd /var/chef

さらに、cookbookとrecipeを保管するディレクトリ構造を用意します。今回はとりあえずmainというcookbookを定義する事にしましょう。

[root@localhost chef]# mkdir -p cookbooks/main/recipes

このrecipesディレクトリにdefault.rbと言うファイル名で最初のレシピを作成します。ファイルの内容は下記の通りです。

package "httpd"

この指定によりOSのパッケージマネージャーを使って指定した名称のパッケージがインストールされます。CentOSの場合にはyumですね。cookbookは複数のOSやディストリビューションに対応させる事もできます。ただ、Apacheのようにディストリビューションでパッケージ名が異なる場合には工夫が必要になりますが、それは後の機会に紹介します。

さて、レシピファイルを書いただけでは実行はできません。ローカル版のchef-soloの場合には、cookbookの場所を教えてあげる必要があります。ここでは/var/chefの直下にsolo.rbの名前で下記の内容のファイルを作成しました。

cookbook_path File.expand_path("../cookbooks", __FILE__)

ちなみにFile.expand_pathメソッドは、第1引数で与えられた相対パスを絶対パスに変換します。第2引数は基準となるディレクトリです。__FILE__はスクリプトファイル自体のパスを表します。

さて、それではchef-soloを実行してみましょう。設定ファイルを表す—cスイッチを使って先ほどのsolo.rbを指定します。

[root@localhost chef]# chef-solo -c solo.rb

実行すると下記のような表示がなされるはずです。

[root@localhost chef]# chef-solo -c solo.rb
[2012-07-21T09:36:47+09:00] INFO: *** Chef 10.12.0 ***
[2012-07-21T09:36:48+09:00] INFO: Run List is []
[2012-07-21T09:36:48+09:00] INFO: Run List expands to []
[2012-07-21T09:36:48+09:00] INFO: Starting Chef Run for localhost
[2012-07-21T09:36:48+09:00] INFO: Running start handlers
[2012-07-21T09:36:48+09:00] INFO: Start handlers complete.
[2012-07-21T09:36:48+09:00] INFO: Chef Run complete in 0.003487679 seconds
[2012-07-21T09:36:48+09:00] INFO: Running report handlers
[2012-07-21T09:36:48+09:00] INFO: Report handlers complete
[root@localhost chef]#

エラーにはなりませんが、何もインストールされた形跡がありませんね。実はchef-soloの実行にはRun Listとよばれる実行項目のリストに登録が必要なのです。Run Listの指定はjson形式のファイルを用いて行います。ここではnode.json(ちなみにnode.jsとは全く無関係です)という名で下記のファイルを作ります。

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

今度はこのファイルも-jスイッチで指定して実行してみます。

[root@localhost chef]# chef-solo -c solo.rb -j node.json
[2012-07-21T09:46:28+09:00] INFO: *** Chef 10.12.0 ***
[2012-07-21T09:46:29+09:00] INFO: Setting the run_list to ["recipe[main]"] from JSON
[2012-07-21T09:46:29+09:00] INFO: Run List is [recipe[main]]
[2012-07-21T09:46:29+09:00] INFO: Run List expands to [main]
[2012-07-21T09:46:29+09:00] INFO: Starting Chef Run for localhost
[2012-07-21T09:46:29+09:00] INFO: Running start handlers
[2012-07-21T09:46:29+09:00] INFO: Start handlers complete.
[2012-07-21T09:46:29+09:00] INFO: Processing package[httpd] action install (main::default line 9)
[2012-07-21T09:46:38+09:00] INFO: package[httpd] installing httpd-2.2.15-15.el6.centos.1 from base repository
[2012-07-21T09:46:53+09:00] INFO: package[httpd] installed version 2.2.15-15.el6.centos.1
[2012-07-21T09:46:53+09:00] INFO: Chef Run complete in 23.932614002 seconds
[2012-07-21T09:46:53+09:00] INFO: Running report handlers
[2012-07-21T09:46:53+09:00] INFO: Report handlers complete
[root@localhost chef]#

今度はちゃんとインストールされたようです。ちなみに同じコマンドをもう一度実行しても、2度インストールが走る事はありません。

Rubyでサーバ設定を自動化! Chef Soloを試そう!第0回

Ruby担当としては、この最初の連載のテーマを何にするか考えていたのですが、他のメンバーがクラウド活用を中心にされるという事なので、IaaS/VPSを利用する際に、自分の必要とする環境を構築するのに便利なツール “Chef” を自分の勉強もかねて紹介してみようと思い立ちました。

“Chef” はRubyで作られたオープンソースの設定管理ツールで、Linuxなどのパッケージのインストールや設定ファイルによる構成などを自動化することができます。本来はクラウドでたくさんのサーバーを一括設定したりするのが目的のため、設定を管理するサーバーと、そこにぶら下がるサーバー(クライアント)で構成されるのですが、ここはまず利用が簡単なスタンドアロン版の “Chef Solo” を使ってみることにします。

“Chef” はRubyで書かれたツールのため、使うにはRubyをインストールする必要があります。今回は、OSとして新潟オープンソース協会のメンバーがよく使うCentOSを使う事にしましたが、一般的にLinuxのディストリビューションの一部として配布されているRubyはバージョンが古い事が多く、とくにRedHat系は古めです。また、これはRubyの開発標準OSがDebianであることも関係していると思うのですが、RedHat系のディストリビューションでは、ソースからのコンパイルもDebianに比べて少々面倒です。

そこで、今回は連載0回と称して、CentOS 6.2にRubyをソースコンパイルでインストールする手順を紹介します。下記のシェルスクリプトをルート権限で実行します。

#!/bin/bash
# install packages needed to compile ruby
yum -y install make gcc zlib-devel openssl-devel \
readline-devel gdbm-devel bison \
libffi-devel
# you should register EPEL repository to install libyaml
rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-7.noarch.rpm
yum -y install libyaml-devel
cd /tmp
wget ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p194.tar.gz
tar xvzf ruby-1.9.3-p194.tar.gz
cd ruby-1.9.3-p194
./configure --prefix=/usr/local
make
make install

なお、CentOS 6.2の環境でsudoすると、PATHに/usr/local/binが含まれないようなので、

export PATH=/usr/local/bin:$PATH

する必要があるようです。

[6/30 追記]

上記のファイルをgistに登録しました。

https://gist.github.com/3023767

root権限で下記のコマンドを実行するとコンパイルできます。(表示がうまくないようですが、1行コマンドとして実行します)


curl -L
https://gist.github.com/raw/3023767/3d2d381eb69e16ba7ca0e249ce877ee989fbec5b/compile_ruby_on_centos.sh | bash

OSC 2006 新潟 を開催しました

オープンソースカンファレンス2006 新潟

  1. 前夜祭
    • 日時:2006年6月16日(金) 18:00〜21:00
    • 会場:ガレッソホール(JR新潟駅直結) http://www.garesso.jp/garesso.html
    • 参加費:無料(ビール・ソフトドリンク付き)
  2. 開催概要
    • 日時:2006年6月17日(土) 10:00〜16:30
    • 会場:新潟市産業振興センター http://sansin.or.jp/access1.html
    • 駐車場:無料
    • 参加費:無料
    • 主催:オープンソースカンファレンス実行委員会
    • 共催:NPO法人 新潟オープンソース協会