2013年12月17日火曜日

fluentd+elasticsearch+kibana3をやってみた

■環境
CentOS 5.9

elasticsearch 0.90.5
kibana3
fluentd 0.10.39
のインストールは事前済ませておいてください
今回は/var/log/messagesを解析してみたいと思います

■/etc/fluent/fluent.confの設定
1. ログ送信側(クライアント側)設定
vim /etc/fluent/fluent_elasticsearch_client.conf
<source>
  type tail
  format syslog
  path /var/log/messages
  tag log.messages
</source>

<match log.messages>
  type forward
  flush_interval 5s
  <server>
    name server_host_name
    host server_host_name
    port 24224
    weight 60
  </server>
</match>

2. ログ受信側(サーバ側)設定
vim /etc/fluent/fluent.conf
<source>
  type forward
  port 24224
</source>

<match log.messages>
  index_name messages
  logstash_format true
  type elasticsearch
  host server_host_name
  port 9200
  include_tag_key true
  tag_key _key
  flush_interval 10s
</match>
include_tag_key を true にするとelasticsearchにログを突っ込む際にmatchに合致したタグ情報を自動で付与してくれます

■fluent-plugin-elasticsearchのインストール
fluent-gem install fluent-plugin-elasticsearch

■各種デーモンの起動
1. elasticsearch起動
elasticsearch -f
2. kibana3起動(apache起動)
service httpd start
3. サーバ側fluentd起動
fluentd
4. クライアント側fluentd起動
fluentd --conf /etc/fluent/fluent_elasticsearch_client.conf

各種起動が完了しエラーが表示されていないければkibana3を開きデータが入っていることを確認します
kibana3 サンプル画像


■Tips
syslogをelasticsearchに送る場合は素直に「format syslog」を使って下さい
format /^(?<timestamp>\w{3} \d{2} \d{2}:\d{2}:\d{2}) (?<host>[^ ]*) (?<body>.*)$/
こんな感じで自分でパースしてelasticsearchに渡すとうまくtimestampをパースしてくれません
以下にあるようにmappingを手動で設定してもダメでした
なので「format syslog」を使うのが定石になるのですが、ポイントとしてはサーバ側のfluent.confに「logstash_format true」を必ず入れて下さい
これを入れることでdynamic mappingもちゃんと働くので自分でmappingを登録する必要がなくなります

●elasticsearchにindexの登録とmappingの設定(今回は実施しなくて大丈夫です)
1. indexの登録
curl -X POST 'http://server_host_name:9200/messages'
サーバ側のfluent.confに記載してあるindex_nameと同じindexを作成してください

2. mapping登録
curl -X PUT http://server_host_name:9200/messages/fluentd/_mapping -d '{
  "app_log" : {
    "properties" : {
      "host" : {"type" : "string"},
      "body" : {"type" : "string"},
      "timestamp": {"format" : "MMM dd HH:mm:ss","type" : "date", "locale" : "ja_JP"}
    }
  }
}'

2013年12月12日木曜日

【AWS】SimpleQueueServiceクイックスタート for PHP(composer編)

■環境
CentOS 5.9 64bit
PHP 5.3.3

■クイックスタート
1. AWS SDK for php for composer をダウンロードする
以下の記事を参考に事前にcomposerをインストールしてください
http://kakakikikeke.blogspot.jp/2013/12/phpcomposer.html

touch composer.json
vim composer.json
{
    "require": {
        "aws/aws-sdk-php": "2.*"
    }
}

composer install
以下のようになれば完了です(デバッグログにデフォルトで色付けされているのがいいです)
WARNING: channel "pear.php.net" has updated its protocols, use "pear channel-update pear.php.net" to update
Loading composer repositories with package information
Installing dependencies (including require-dev)
  - Installing symfony/event-dispatcher (v2.4.0)
    Downloading: 100%

  - Installing guzzle/guzzle (v3.7.4)
    Downloading: 100%

  - Installing aws/aws-sdk-php (2.4.11)
    Downloading: 100%

symfony/event-dispatcher suggests installing symfony/dependency-injection ()
symfony/event-dispatcher suggests installing symfony/http-kernel ()
aws/aws-sdk-php suggests installing doctrine/cache (Adds support for caching of credentials and responses)
aws/aws-sdk-php suggests installing ext-apc (Allows service description opcode caching, request and response caching, and credentials caching)
aws/aws-sdk-php suggests installing monolog/monolog (Adds support for logging HTTP requests and responses)
aws/aws-sdk-php suggests installing symfony/yaml (Eases the ability to write manifests for creating jobs in AWS Import/Export)
Writing lock file

2. アクセスキーとシークレットキーの取得
https://portal.aws.amazon.com/gp/aws/securityCredentials
アクセスしawsのアカウントでログインします
取得したアクセスキー、シークレットキーは後で使いますので大切に補完しておいてください

3. サンプル実行ファイルを作成する
touch sample_sqs.php
vim sample_sqs.php
以下を貼り付けてください
<?php
require 'vendor/autoload.php';
use Aws\Sqs\SqsClient;

$client = SqsClient::factory(array(
  'key'    => 'your access key',
  'secret' => 'your secret access key',
  'region' => 'us-west-2'
));

echo 'ListQueues' . "\r\n";
$result0 = $client->listQueues(array(
  'QueueNamePrefix' => 'string',
));
$result0->get('QueueUrls');
var_dump($result0);

$result1 = $client->createQueue(array(
  'QueueName' => 'kaka_queue002',
  'Attributes' => array(
    'VisibilityTimeout' => '300',
  ),
));
$queueUrl = $result1->get('QueueUrl');
echo $queueUrl . "\r\n";

$result2 = $client->sendMessage(array(
  'QueueUrl' => $queueUrl,
  'MessageBody' => 'test message !',
  'DelaySeconds' => 0,
));

echo 'ReceiveMessage' . "\r\n";
$result3 = $client->receiveMessage(array(
  'QueueUrl' => $queueUrl,
  'MaxNumberOfMessages' => 10,
  'WaitTimeSeconds' => 20,
));
$body = $result3['Messages'];
echo $body[0]['Body']. "\r\n";
#var_dump($result3);

echo 'OK';
?>

リージョンはus-west-2(Oregon)にしていますので適宜変更して問題ございません
key と secret を取得したアクセスキーとシークレットキーで設定してください
基本的に結果は連想配列で返ってくるようなので、中身をvar_dumpメソッドで確認しながら目的のデータを取得する感じになるかと思います

php sample_sqs.php
とするとkaka_queue002に「test message !」というメッセージが送信され受信もされます

■参考

2013年12月11日水曜日

【PHP】composerのインストール方法

■環境
CentOS 5.9 64bit
PHP 5.3.3
composer 2013-12-06

■インストール
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/
cd /usr/local/bin
ln -s composer.phar composer

■バージョン確認
composer -V
Composer version 80499bb02418711b34bba59c1a6d8032429e5702 2013-12-06 12:32:19

あとはcomposer.jsonを作成し
composer install
とすればvendor配下にライブラリが追加されていきます
実行するphpのソースコード内では「vendor/autoload.php」をrequireするだけで自動でインストールしたライブラリが使えるようになります

2013年12月9日月曜日

puppetのインストールとサンプルの実行

■環境
CentOS 5.9
puppet 2.6.18 ( puppetd, puppetmasterd ともに同じバージョンです )

■インストール
yum -y install puppet
yum -y install puppet-server
※epelのリポジトリの登録が必要です

■puppetmasterdサーバ起動
vim /etc/puppet/puppet.conf
main 部分に以下を記載
※servernameにはpuppetmasterdが動作するサーバのホスト名またはIPアドレスを入力してください
server = servername
puppetmasterd --no-daemonize --d
  • --no-daemonizeを指定することでフォアグランドで動作します
  • -dはデバッグログを出力するためのオプションです
  • Ctrl + c で停止できます
  • バックグラウンドで実行した場合に停止する際はkillで停止してください

■マニュフェストファイルの作成
上記puppetmasterdは起動したまま以下の作業を続けます
今回はhostsファイルの権限を変更するサンプルを実行してみます
touch /etc/puppet/manifests/site.pp
emacs /etc/puppet/manifests/site.pp
file { '/etc/hosts':
    owner => 'root',
    group => 'root',
    mode  => 644,
}
※.ppファイルの名前が「site」でないとうまく動作しない可能性があります

■puppetdクライアント実行
実行する前にhostsファイルの権限を777とかに変更しておいてください
実行後にhostsファイルを確認すると権限が644になっているかと思います
puppetd --server [servername] --no-daemonize -d
※[servername]にはpuppetmasterdを起動しているサーバのIPもしくはホスト名を入力してください

■参考

●いろんなresourceを使ったサンプルマニュフェスト
1. ファイルを作成する
file { 'test.txt':
  path => '/var/tmp/test.txt',
  ensure => present,
  mode => 644,
  content => "これはテスト用のファイルです",
}
pathはフルパスでファイル名まで記載します
mode, contentは記載しなくてもOKです、ない場合は空のファイルを作成するだけです
contentに記載の内容はファイルに書き込まれます、日本語も使えます

2. コメントアウト
先頭に「#」をつけることで1行のコメントアウト、「/* ... */」で囲うことで複数行のコメントアウトができます

3. chkconfigをON/OFFにする
service { 'tomcat':
  enable => false,
}
/etc/init.dで管理されている必要があります

4. puppetをpuppetmasterdなしに単独で実行する方法
puppet apply localhost.pp -d
とするとpuppetmasterdが起動していなくてもクライアント単独でpuppetを実行させることが可能です
「-d」を付けることでデバッグログを出力することができます
chefでいうところにchef-soloにあたるのかなと思います

5. serviceの起動と停止をする方法
service { 'tomcat':
  #ensure => 'running',
  ensure => 'stopped',
}

6. マニュフェスト内で変数を使用する方法
$process_name = 'tomcat'
$file_name = 'test2'

service { $process_name:
  #enable => false,
  enable => true,
  ensure => 'running',
  #ensure => 'stopped',
}

file { "/var/tmp/$file_name":
  ensure => 'directory',
}
変数を文字列と結合して参照する場合はダブルクオートで囲うことで変数が展開されます


2013年12月7日土曜日

【Mac】ターミナルの色をきれいに表示するSolarizedをインストール、設定する方法

■環境
OS X 10.8.5

■インストール
1. ターミナルから実施
ターミナルを開きます
cd /var/tmp
git clone https://github.com/tomislav/osx-terminal.app-colors-solarized solarized
git clone https://github.com/altercation/vim-colors-solarized.git
mkdir -p ~/.vim/colors
mv vim-colors-solarized/colors/solarized.vim ~/.vim/colors
touch ~/.vimrc
syntax enable
set background=dark
colorscheme solarized
let g:solarized_termcolors=256

sudo port -v selfupdate
ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go/install)"
※上記のbrewをインストールするためには事前にJavaとruby、XcodeCommandLineが必要です
brew install coreutils
※全然関係ないですが、インストール時にビールのアイコンがターミナル上に表示されます
git clone https://github.com/seebi/dircolors-solarized.git dircolors-solarized
vim ~/.bash_profile
alias ls='gls --color=auto'
eval $(gdircolors /var/tmp/dircolors-solarized/dircolors.ansi-universal) 
source ~/.bash_profile

2. ターミナルの設定
ターミナル -> 環境設定 -> プロファイル一覧の一番した歯車マークから「読み込む」を選択
先ほどターミナルからの操作でダウンロードした/var/tmp/solarized/Solarized Dark.terminal と Solarized Light.terminalを読み込みます
起動 -> 起動時に開く -> Solarized Darkを選択
ターミナルを再起動するとSolarizedのカラーテーマのターミナルが立ち上がり「ls」および「vim」でカラー付けがされているかと思います

以上で設定は完了です

2013年12月5日木曜日

Zabbixでmongoの監視やってみた

■環境
CentOS 6.2
Zabbix 2.0.3
mongoDB 2.4.5
php 5.3.3
※事前作業としてZabbixサーバのインストールとmongoDBのインストールは完了しているものとします
※今回の対応自体ではzabbix_agentd自体は使用しません、また作業はほぼ全てZabbixサーバ上で実施します、zabbix_agentdはインストールしてあっても問題はないです

■モジュール追加(Zabbixサーバ上で実施上で実施)
yum -y install php-devel php-pear gcc make
pecl install mongo
vim /etc/php.ini
以下を追記
extension=mongo.so

vim test.php
以下を追記
<?php
new MongoClient("mongodb://dbserver:27017");
?>

php test.php
でエラーとならなければOK
エラーとなる場合はmongoのプロセスが上がっているかやACLの設定(FWやiptables)を見なおして下さい

■スクリプト追加(Zabbixサーバ上で実施)
mkdir -p /opt/zabbix/share/zabbix/externalscripts/
cd /opt/zabbix/share/zabbix/externalscripts/
wget http://mikoomi.googlecode.com/svn/plugins/MongoDB%20Plugin/mikoomi-mongodb-plugin.php
wget http://mikoomi.googlecode.com/svn/plugins/MongoDB%20Plugin/mikoomi-mongodb-plugin.sh
chmod 755 mikoomi-mongodb-plugin.*
chown zabbix:zabbix mikoomi-mongodb-plugin.*
※どうやらchefインストールした環境だと上記のパスに置く必要があるようです(すいません、先に書いておくべきでしたが今回Zabbiサーバのインストールはchefで実施しています

■スクリプト修正(Zabbixサーバ上で実施)
以下は実施しないでもいいかもしれません、自分の環境では実施しないと動作しなかったので備忘録がてら記載しておきます
  1. mikoomi-mongodb-plugin.sh内で「shift」コマンドを実行している行を削除(shiftすることで引数がうまくphpに渡せませんでした)
  2. mikoomi-mongodb-plugin.php内541行目あたりでzabbix_senderを呼んでいるパスをフルパスに変更(フルパスで呼んでいないのでPATHを通していない場合はzabbix_senderをフルパスで呼ぶように変更してください)

■Zabbixサーバへのテンプレート登録(Zabbixサーバ上で実施)
http://mikoomi.googlecode.com/svn/plugins/MongoDB%20Plugin/MongoDB_Plugin_template_export.xml
をダウンロードしてZabbixのWebUIからテンプレートを登録します
インポートできたテンプレートに対して監視対象のホストを追加します
テンプレートの設定からマクロタブを選択して
{$HOSTNAME}、{$PORT}、{$SERVER}
を追加します
{$HOSTNAME}と{$SERVER}に監視するmongoDB側のIP(またはホスト名)を入力し
{$PORT}にLISTENしているmongoのポートを入力します(test.phpでテストしたときのポート番号を入力します)

■ACL設定(ZabbixサーバとDBサーバ)
Zabbixサーバ -> tcp/27071 -> mongoDB
上記を満たすFWやiptablesの設定をしてください
replicaSet構成の場合は各ポートも通信できるようにしたほうがいいかもしれません
※公式だとmongosのプロセスを監視すれば良いと書いてあるようでしたが私はreplicaSetのPRIMARYポートを監視するようにしました(なのでfail overした場合は監視するポート変更する必要があります。。。)

■参考

以上で設定自体は完了です
あとは自分が設定した際のトラブルシューティングを記載しているので参考にしてみてください

●全体的な動きの流れ
全体的な動きとしては
シェル実行 -> php実行 -> mongoからデータ取得 -> zabbix_sender で 127.0.0.1にデータ登録
という流れとなっています
なのでzabbix_agentを使えないで監視ができるわけです
zabbix_senderは /tmp/mikoomi-mongodb-plugin.php_dbserver.data のデータを送っています
ちなみにphp内で送信しているzabbix_senderのコマンドは以下でした
/opt/zabbix/bin/zabbix_sender -vv -z 127.0.0.1 -i /tmp/mikoomi-mongodb-plugin.php_dbserver.data
上記を実行してエラーとならないことを確認する必要もあります
zabbix_sender自体のログも/tmp配下にあります

●トラブルシューティング
うまく取得できない場合はホストのアイテムの設定からMiscellaneous: Data Collectorのステータスを有効にしてください
その後zabbix_server.logを見るとシェルを実行した結果のログがでるのでそれを元に修正します

配置したシェルを直接叩いて動作を確認することもできます、以下は実行サンプルです
sh /opt/zabbix/share/zabbix/externalscripts/mikoomi-mongodb-plugin.sh -h dbserver -p 27071 -z dbserver
phpは以下のように実行します
php /opt/zabbix/share/zabbix/externalscripts/mikoomi-mongodb-plugin.php -h dbserver -p 27071 -z dbserver
シェルやphpをrootで実行した場合は/tmp配下のログの権限に気をつけてください
ログの所有者がrootになってしまいzabbixから実行した場合はzabbixユーザで実行することになりログへの権限がなくなりスクリプトがうまく動かなくなりますのでrootで直接スクリプトを実行した場合は権限の書き換えかファイルの削除をしてください

「timeout while executing a shell script」が出力される場合はzabbix_server.confのTimeoutの値を30に変更しzabbix_serverを再起動してください

「No Data Received in 5 minutes」でアラートが常にあがってしまう場合はトリガーの設定でnodateの引数を800くらいあげてください
どうやらZabbixトラッパーでのデータの取得が10分おきになっているのでデフォルトの300秒(5分)だと常にアラートがあがってしまうようです

最終的にzabbix_server.logに
8967:20131204:171621.274 item [db_server:mikoomi-mongodb-plugin.sh[-h {$SERVER} -p {$PORT} -z {$HOSTNAME}]] became supported
的なログが出力されれば完了です

2013年12月3日火曜日

apacheでリアルタイムに秒間リクエスト数を取得する方法

apachetopというコマンドを使用することでリアルタイムの値を取得することが可能です
apachetopはデフォルトではインストールされていませんので
yum -y install apachetop
でインストールしてください(CentOS 6.3の場合)
インストールしたらapacheのログを引数として以下のように実行します

apachetop -T 1 -d 1 -f /var/log/httpd/http+access.log

apachetopはアクセスログを元に現在のリクエスト数を取得することができます
「-T」はログ監視する間隔でこれを1秒にすることで1秒間の間に流れたログを元にアクセス数を算出してくれます

サーバ上のリソース状況を監視するtopコマンド同様で標準出力に出続けます
なのでリダイレクトなどを使ってファイルに出力したり、awkやgrepと組み合わせてコマンドを実行するたびに値を取得するのはちょっと難しいかもしれないです
監視データを永続的に持っておきたい場合にはzabbixを使ったapacheの監視方法を別記事で紹介してますのでそちらを参照してください
http://kakakikikeke.blogspot.jp/2013/06/chefzabbixapache.html