knife-solo(chef)でnrpe(nagios)のセットアップをしてみる


[Vagrantのセットアップが完了した](http://qiita.com/mats/items/8b80ffb8020217644355)ので今度はchefを使って、nagiosでの監視でクライアント側にインストールするnrpeのセットアップをやってみる。

# 事前準備

## knife-soloのインストール

RubyGemsとして公開されているのでgemでインストールする。
knife-soloをインストールすることで、knifeコマンドのサブコマンドとしてknife soloコマンドが利用可能になる。

```
$ gem install knife-solo
```

knife soloコマンドは

## キッチン（Chefリポジトリ）の作成

VagrantfilがあるディレクトリにChefリポジトリを作成する。
※一応、キッチンと呼ぶらしい。

```
$ knife solo init .
```

作成すると、次のようなディレクトリ構成になるはず。

```
├── Vagrantfile
├── cookbooks
├── data_bags
├── environments
├── nodes
├── roles
└── site-cookbooks
```

## クックブックの作成

nrpeというクックブックを作成する。
自作のクックブックは **site-cookbooks** に置くのが慣習らしい。

```
$ knife cookbook create nrpe -o site-cookbooks
```

# レシピを編集する

## ユーザ作成

nagiosユーザを作る為に次のようにレシピ```site-cookbooks/nrpe/recipes/default.rb```に記述する。

```ruby:site-cookbooks/nrpe/recipes/default.rb
group 'nagios' do
	group_name	'nagios'
	gid			9999
	action		:create
end
user 'nagios' do
	comment		'nrpe'
	uid			9999
	group 		'nagios'
	home		'/usr/local/nagios'
	shell		'/bin/false'
	password	nil
	supports	:manage_home =>true
	action		[:create, :manage]
end
```

この状態でknife-soloを実行するとnagiosグループとユーザが出来る。
※centos-6.5は仮想マシンの名前

```
$ knife solo cook centos-6.5
```

## パッケージのインストール

パッケージのインストールの前に、epelリポジトリを登録しておく。


```ruby:site-cookbooks/nrpe/recipes/default.rb
yum_repository 'epel' do
	description	'Extra Packages for Enterprise Linux'
	mirrorlist	'http://mirrors.fedoraproject.org/mirrorlist?repo=epel-6&arch=$basearch'
	gpgkey		'http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6'
	enabled		false
	action		:create
end
```

必要なパッケージをインストールしていく。

```ruby:site-cookbooks/nrpe/recipes/default.rb
package "xinetd" do
	action :install
end
```

複数のパッケージをまとめてインストールする際は次のように記述する。

```ruby:site-cookbooks/nrpe/recipes/default.rb
%w{nrpe nagios-plugins nagios-plugins-all}.each do |pkg|
	package pkg do
		options '--enablerepo=epel'
		action :install
	end
end
```

## サービスの起動

インストールしたパッケージの開始と自動起動の設定は下記の通り。

```ruby:site-cookbooks/nrpe/recipes/default.rb
service "xinetd" do
	action [ :enable, :start ]
end
```

## ファイルの転送

よく監視で使うスクリプトを転送しておく。
check_log3.pl というログ監視に用いるスクリプトを```site-cookbooks/nrpe/files/default```に配置する。

```
site-cookbooks
    └── nrpe
        ├── files
        │   └── default
        │       └── check_log3.pl
        └── recipes
            └── default.rb
```

これを転送するようなコードをレシピに記述する。

```ruby:site-cookbooks/nrpe/recipes/default.rb
cookbook_file "check_log3.pl" do
	source	"check_log3.pl"
	path	"/usr/lib64/nagios/plugins/check_log3.pl"
	owner	"root"
	group	"root"
	mode	0755
	action	:create
end
```

**source** とか **path** は明示しなくても大丈夫らしいが一応書いておいた。

## テンプレートから設定ファイルを生成

xinetdの設定ファイルのテンプレートを```site-cookbooks/nrpe/templates/default```に配置する。

```
site-cookbooks
    └── nrpe
        ├── files
        │   └── default
        │       └── check_log3.pl
        ├── recipes
        │   └── default.rb
        └── templates
            └── default
                └── xinetd_nrpe.erb
```

監視を行うNgiosサーバは環境によって異なるので、許可するホストのIPは```<%= @nagios_server %>```と書いておく。

```eRuby:site-cookbooks/nrpe/templates/default/xinetd_nrpe.erb
# default: on
# description: NRPE (Nagios Remote Plugin Executor)
service nrpe
{
        flags           = REUSE
        socket_type     = stream
        port            = 5666
        wait            = no
        user            = nagios
        group           = nagios
        server          = /usr/sbin/nrpe
        server_args     = -c /etc/nagios/nrpe.cfg --inetd
        log_on_failure  += USERID
        disable         = no
        only_from       = <%= @nagios_server %>
}
```
レシピには次のように記述する。

```ruby:site-cookbooks/nrpe/recipes/default.rb
template "xinetd_nrpe.erb" do
	source	"xinetd_nrpe.erb"
	path	"/etc/xinetd.d/nrpe"
	owner	"root"
	group	"root"
	mode	0644
	action	:create
	variables(
		:nagios_server => node["nrpe"]["nagios_server"]			#Attribute設定
	)
	notifies :reload, 'service[xinetd]'							#xinetdのリロード
end
```

このままでは```nagios_server```に入る値がないので、attributeの設定を```site-cookbooks/nrpe/attribute/default.rb```に記述する。

```
site-cookbooks
    └── nrpe
        ├── attributes
        │   └── default.rb
        ├── files
        │   └── default
        │       └── check_log3.pl
        ├── recipes
        │   └── default.rb
        └── templates
            └── default
                └── xinetd_nrpe.erb
```

```ruby:site-cookbooks/nrpe/attribute/default.rb
default["nrpe"]["nagios_server"] = "10.0.0.2"
```

attributeにより設定ファイルを変更する場合は **template** を、そうでない場合は **cookbook_file** を用いるのがいいらしい。

## レシピ完成

通して記述すると下記のような感じになる。
レシピは上から処理されていくので、記述順には注意すること。

```ruby:site-cookbooks/nrpe/recipes/default.rb
# ==== create user & group
group 'nagios' do
	group_name	'nagios'
	gid			9999
	action		:create
end
user 'nagios' do
	comment		'nrpe'
	uid			9999
	group 		'nagios'
	home		'/usr/local/nagios'
	shell		'/bin/false'
	password	nil
	supports	:manage_home =>true
	action		[:create, :manage]
end

# ==== add the EPEL repo
yum_repository 'epel' do
	description	'Extra Packages for Enterprise Linux'
	mirrorlist	'http://mirrors.fedoraproject.org/mirrorlist?repo=epel-6&arch=$basearch'
	gpgkey		'http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6'
	enabled		false								#デフォルトでは使用しない様にしておく
	action		:create
end

# ==== install packages
package "xinetd" do
	action :install
end

%w{nrpe nagios-plugins nagios-plugins-all}.each do |pkg|
	package pkg do
		options '--enablerepo=epel'
		action :install
	end
end

# ==== start service
service "xinetd" do
	action [ :enable, :start ]
	supports :reload => true						#後述のコードで許可する動作
end

# === create custom plugins
cookbook_file "check_log3.pl" do
	source	"check_log3.pl"
	path	"/usr/lib64/nagios/plugins/check_log3.pl"
	owner	"root"
	group	"root"
	mode	0755
	action	:create
end

# ==== create xinetd config
template "xinetd_nrpe.erb" do
	source	"xinetd_nrpe.erb"
	path	"/etc/xinetd.d/nrpe"
	owner	"root"
	group	"root"
	mode	0644
	action	:create
	variables(
		:nagios_server => node["nrpe"]["nagios_server"]
	)
	notifies :reload, 'service[xinetd]'				#"xinetd"に値を引き渡す
end

```