概要
意識低めに自動化というか、アラートなった後のサーバ状況の確認で使えそうなfabricのユースケース。
ディスク使用率を取る
df -hの結果。
...
def df_stat():
with hide('everything', 'status'):
print green(run("df -h"))
...
$ 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で時間指定した結果
...
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))
...
$ 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とかでよしなにカウント。
...
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
...
$ 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には便利かも
実際のコードとしては以下な感じ。
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使ってみた。
意識の低い自動化という話もあるし。
fabric、結構いろいろできるよ!とかチュートリアルは見るけど、
イマイチ具体的なユースケースって結構ないなと思っていたのでまとめてみた。
ちなみに監視ならfluentdとnorikraが便利そうだから使ってみようよとかで
アプリケーションログ見たり。
chef - 次世代監視ツール Sensu リファレンス - Qiitaとかでサーバ状況見ればいいとは思う。
ただそういうものにも欲しいものが用意されて無いときはままあるわけで...
それに反射的に指がサーバに入ってコマンド打って、直接確認してしまう...
またserverspecは意識が高すぎるので一旦fabricで。
python(というかサーバのシェルコマンドそのまま)の方が慣れてるし。
ただ普段sshしてコマンド叩くのを簡単にできるだけでも結構便利だなと。
以上。