アラートがなったのでfabricで意識低めにサーバ情報を取得

## 概要
意識低めに自動化というか、アラートなった後のサーバ状況の確認で使えそうなfabricのユースケース。

## ディスク使用率を取る 
df -hの結果。

```py:fabfile.py
...
def df_stat():
	with hide('everything', 'status'):
		print green(run("df -h"))
...
```

```bash:

$ fab df_stat -H server1,server2
[server1] Executing task 'df_stat'
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        20G  2.8G   16G  15% /
devtmpfs        240M     0  240M   0% /dev
tmpfs           246M     0  246M   0% /dev/shm
tmpfs           246M   29M  217M  12% /run
tmpfs           246M     0  246M   0% /sys/fs/cgroup
[server2] Executing task 'df_stat'
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        20G  2.8G   16G  15% /
devtmpfs        240M     0  240M   0% /dev
...

```

## CPU負荷を時間指定で取る
sar -u,-qの-sと-eで時間指定した結果

```py:fabfile.py
...
def cpu_stat(start_time, end_time):
	with hide('everything', 'status'):
		print green(run("sar -q -s " + start_time + " -e " + end_time))
		print green(run("sar -u -s " + start_time + " -e " + end_time))
...
```


```bash:

$ fab cpu_stat:start_time="08:50:00",end_time="09:10:00" -H server1,server2,server3
[server1] Executing task 'cpu_stat'
08:50:01 AM   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15   blocked
08:51:01 AM         1       116      0.00      0.01      0.05         0
08:52:01 AM         1       116      0.00      0.01      0.05         0
08:53:01 AM         1       116      0.00      0.01      0.05         0
08:54:01 AM         1       116      0.00      0.01      0.05         0
...
08:50:01 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle
08:51:01 AM     all      0.08      0.00      0.07      0.02      0.00     99.83
08:52:01 AM     all      0.07      0.00      0.05      0.00      0.00     99.88
08:53:01 AM     all      0.03      0.00      0.05      0.00      0.00     99.92
08:54:01 AM     all      0.08      0.00      0.03      0.00      0.00     99.88
08:55:01 AM     all      0.05      0.00      0.05      0.00      0.00     99.90
08:56:01 AM     all      0.07      0.00      0.05      0.02      0.00     99.87
...
[server2] Executing task 'cpu_stat'
08:50:01 AM   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15   blocked
08:51:01 AM         1       116      0.00      0.01      0.05         0
...


```

## apacheのaccess_logの統計を取る
access_logをcutとかsort | unic -cとかでよしなにカウント。

```py:fabfile.py
...
def access_log_report(hour):
	base = "/var/log/hoge/logs/"
	with cd(base):
		with hide('everything', 'status'):
			ip_cmd = "cat access_log |grep `date +%Y`:" + hour + ":| cut -f 1 -d ' ' | sort | uniq -c | sort -nr | head -10"
			contents_cmd = "cat access_log |grep `date +%Y`:" + hour + ":| cut -f 7 -d ' ' | sort | uniq -c | sort -nr | head -10"
			
			print "#### top ip"
			ip = run(ip_cmd, shell_escape=False)
			print ip
			print "#### top contents"
			contents = run(contents_cmd, shell_escape=False)
			print contents
...
```

```bash:

$ fab access_log_report:hour=17 -H server1,server2
[server1] Executing task 'access_log_report'
#### top ip
      20 XXX.XXX.XXX.XXX
      10 YYY.YYY.YYY.YYY
#### top contents
      15 /
      15 /hoge
[server2] Executing task 'access_log_report'
...

```

## まとめ
sarの別のオプションなり、psなり、freeなり好きな物を指定すれば、
普段だいたいサーバに入ってコマンド叩いてるところは確認できそう。

ポイントとしては、
* 普段サーバで打ってるコマンドはあるなと気づいたらタスクを作る癖をつける
* 毎回変わる所は引数で指定(対象サーバ、コマンドオプション無いの時間指定など)
* 出力抑制して必要なのだけ変数で受け取って整形して表示
* fabric.colorで色変えると見やすい
* awkというか"がコマンド内にあると干渉しやすいので簡単なことならcutがいい
* 出力結果が長くなるなら>でリダイレクトしてできたファイルとlessとかしてもいい
* 確認系コマンドはだいたい平ユーザでもできるのでsudo使うfabricには便利かも


実際のコードとしては以下な感じ。

```py:fabfile.py

from fabric.colors import *
from fabric.api import run, env, hide

env.warn_only=True

def access_log_report(hour):
	base = "/var/log/hoge/logs/"
	with cd(base):
		with hide('everything', 'status'):
			ip_cmd = "cat access_log |grep `date +%Y`:" + hour + ":| cut -f 1 -d ' ' | sort | uniq -c | sort -nr | head -10"
			contents_cmd = "cat access_log |grep `date +%Y`:" + hour + ":| cut -f 7 -d ' ' | sort | uniq -c | sort -nr | head -10"
			
			print "#### top ip"
			ip = run(ip_cmd, shell_escape=False)
			print ip
			print "#### top contents"
			contents = run(contents_cmd, shell_escape=False)
			print contents

def df_stat():
	with hide('everything', 'status'):
		print green(run("df -h"))

def cpu_stat(start_time, end_time):
	with hide('everything', 'status'):
		print green(run("sar -q -s " + start_time + " -e " + end_time))
		print green(run("sar -u -s " + start_time + " -e " + end_time))


```

## ポエム

諸般の事情でなかなかサーバに入らず、自動でよしなにサーバ管理するのが難しい。
(というか自動化っていろいろ考えることあるし、だいたい既存の仕組みがすでにある場合は自動化をそれに適応するのって結構たいへんだよねと)

なのでとりあえず一旦普段コンソール越しでやっていることを
自動化?してみたというかそのようにfabric使ってみた。

[意識の低い自動化](http://www.slideshare.net/greenasparagus/ss-42424543)という話もあるし。

fabric、結構いろいろできるよ!とかチュートリアルは見るけど、
イマイチ具体的なユースケースって結構ないなと思っていたのでまとめてみた。

ちなみに監視なら[fluentdとnorikraが便利そうだから使ってみようよ](http://www.slideshare.net/aratatanaka31/dark-vol3-v1)とかで
アプリケーションログ見たり。
[chef - 次世代監視ツール Sensu リファレンス - Qiita](http://qiita.com/spesnova/items/f9a8c9661861cc453ead)とかでサーバ状況見ればいいとは思う。

ただそういうものにも欲しいものが用意されて無いときはままあるわけで...
それに反射的に指がサーバに入ってコマンド打って、直接確認してしまう...

またserverspecは意識が高すぎるので一旦fabricで。
python(というかサーバのシェルコマンドそのまま)の方が慣れてるし。
ただ普段sshしてコマンド叩くのを簡単にできるだけでも結構便利だなと。

以上。