JavaからPatlite社やアイエスアイ社の警子ちゃんを操作するクラスを書いたので、公開。
SNMPでやってます(rshでも書いたけど、Linuxから動かしたらPermission deniedになってしまったので)。
https://github.com/doitnow420/snmp-tool
あ、snmp4jのフリー版使ってます。
http://www.snmp4j.org/
赤、黄色、緑とブザーしか対応してません。
それぞれにON/OFFのステータスを持ってて、状態変化がなければSNMPは発行しない。
秒数対応もなし。
いろいろ足りないと思うので、適当にひな形というかサンプル程度と思って使ってください。
2012年8月23日木曜日
Ciscoの設定ファイルを自動SVN管理
Ciscoの設定をいじって、あとあと「しまった!」と思うことがあったりする。
何をどう変えたか分からなくなってしまったり…。
変更ごとにtftpでローカルに落として、自分で世代管理して、とかやってたけど、やっぱり面倒。
世代管理はSVNに任せられるから、リポジトリを作ってみた。
そうすると欲が出てきて、なんとか自動的にできないかなぁ、と思ってきた。
Linuxサーバからなんらかの方法でconfigが取れれば、あとはSVNのワーキングディレクトリに突っ込めばどうとでもなる。 ここがどうにかならないか、と調べて分かったのが、PerlのNet::Telnet::Ciscoモジュール。 Perlで、Ciscoデバイスにtelnet接続し、任意のコマンドを実行できるモジュールらしい。 これで入って、show running-config でも show startup-config でも実行すれば求めるものは取れる。 ということで、簡単なPerlスクリプトを書いてみた。 とりあえずget_config.plと命名。
/home/foo/networks/trunk
にした
シェルスクリプトを実行すれば、指定したCiscoデバイスの設定ファイルを取って、SVNのワークディレクトリに書き込み。 で、SVNコミットさせる。 違いがあれば、コミットするし、なければコミットしない。 とそんな仕様のスクリプト。
手動実行でちゃんとコメント付けてコミットしたいときは、
./checkciscoconfig.sh manual
とか、とにかく引数を与えてやれば設定ファイルだけをとってくるようになってます。
そうすると欲が出てきて、なんとか自動的にできないかなぁ、と思ってきた。
Linuxサーバからなんらかの方法でconfigが取れれば、あとはSVNのワーキングディレクトリに突っ込めばどうとでもなる。 ここがどうにかならないか、と調べて分かったのが、PerlのNet::Telnet::Ciscoモジュール。 Perlで、Ciscoデバイスにtelnet接続し、任意のコマンドを実行できるモジュールらしい。 これで入って、show running-config でも show startup-config でも実行すれば求めるものは取れる。 ということで、簡単なPerlスクリプトを書いてみた。 とりあえずget_config.plと命名。
./getconfig.pl -h <ホスト名> -p <パスワード> -e <特権モードパスワード> で、sh run 結果を返してくれる。 まぁ、最初と最後に若干情報が出るけど…。#!/usr/bin/perl # オプション解析モジュールのロード use Getopt::Long; # Ciscoコマンド操作モジュールのロード use Net::Telnet::Cisco; # IPアドレス my $host = ''; # ユーザ名 my $username = ''; # vtyログインパスワード my $password = ''; # ENABLEモード パスワード my $epassword = ''; GetOptions( 'host=s' => \$host, 'username=s' => \$username, 'password=s' => \$password, 'epassword=s' => \$epassword ); # Cisco.pm用オブジェクトの作成 -> ルータに接続 my $obj_Session= Net::Telnet::Cisco->new( Host => $host ); # vtyパスワードを用いてログイン $obj_Session->login($username, $password, ); # enable $obj_Session->enable( $epassword ); # コマンドの実行 @cmd_output = $obj_Session->cmd('show running-config'); # コマンド実行結果のアウトプット print "Last command: <", $obj_Session->last_cmd, ">\n"; print "Last error: <", $obj_Session->errmsg, ">\n"; print "Cmd output: <", @cmd_output, ">\n"; exit 0;
$ ./get_config.pl -h 172.xxx.xxx.xxx -p password -e enable_passwordここからシェルスクリプトの出番。 最初3行と最後1行は不要なので、続くシェルスクリプトで削る。 あと、やってみると分かるけどntp clock-periodはよく変わるので、有用な情報とは言えないので削る。 Ciscoデバイスの名前、IPアドレス、ログインパスワード、特権モードパスワードをスペース区切りでテキストファイルに保存。 cisco_file.txtとしよう。 こんな感じ。
Last command:
Last error: <> Cmd output: Current configuration : 18623 bytes ! ! Last configuration change at 11:58:40 JST Fri Aug 17 2012 ! NVRAM config last updated at 11:05:37 JST Sat Aug 11 2012 ! ~(省略)~ end
>
SVNのワークディレクトリを作っておく とりあえず
cisco_router1 172.xxx.xxx.xxx password1 enable_password1
cisco_router2 172.yyy.yyy.yyy password2 enable_password2
/home/foo/networks/trunk
にした
シェルスクリプトを実行すれば、指定したCiscoデバイスの設定ファイルを取って、SVNのワークディレクトリに書き込み。 で、SVNコミットさせる。 違いがあれば、コミットするし、なければコミットしない。 とそんな仕様のスクリプト。
#!/bin/bash
# Cisco機器のstartup-configファイルを取得し、リポジトリと違っていればコミットしておく
REPO=http://<リポジトリ>/networks/trunk
WORK_DIR=/home/foo/networks/trunk
PNAME=$( basename $0 )
# Cisco機器の名前、IPアドレス、ログインパスワード、Enableパスワードをスペース区切りで
CISCO_FILE=/home/foo/cisco_file.txt
get_config()
{
typeset HOSTNAME=$1
typeset HOST=$2
typeset PASSWD=$3
typeset ENABLE_PASSWD=$4
./get_config.pl -h $HOST -p $PASSWD -e $ENABLE_PASSWD | sed '/^ntp clock-period/d' | sed -e '1,3d' | sed -e '$d' > $WORK_DIR/${HOSTNAME}.config
}
while read LINE
do
get_config $LINE
done < $CISCO_FILE
if [ "$1" != "" ]
then
echo "You can commit by $ svn commit -m \"comments\" $WORK_DIR"
else
svn commit --username --password -m "Change detected. Automatically commited by $PNAME" $WORK_DIR
fi
これをcheckciscoconfig.shと命名して、crontabで毎晩23:30とかに仕込んでおけば、その日の変更は必ずコミットされる。30 23 * * * /home/foo/checkciscoconfig.sh > /dev/nullコメントは実態を反映していないけど、「忘れた!」よりマシという考え。
手動実行でちゃんとコメント付けてコミットしたいときは、
./checkciscoconfig.sh manual
とか、とにかく引数を与えてやれば設定ファイルだけをとってくるようになってます。
2012年8月21日火曜日
TeraTerm Menuのリストを移行
TeraTerm Menuを便利に使ってます。
サーバ情報がそれなりにあるので、これはかなり便利。
なんだけど、PCを移行しようとしたらレジストリに保存していることが分かった。
レジストリをエクスポートしてインポートすれば行けるのかもしれないが、あんまりやりたくないなぁ…。
調べていたら、ttpmenu.iniをttpmenu.exeと同じディレクトリに作れば、テキストファイルで管理できる、とあった。
「それは便利じゃん!」と思ったが、もう少し調べると、それをやっちゃったら設定全部消える。
http://es.sourceforge.jp/ticket/browse.php?tid=11329&group_id=1412
http://www.trapon.jp/log/201205/teraterm_menu.html
まだサーバ情報何も入れていない新しいPCでttpmenu.iniを作成。
TeraTerm Menuを起動して、適当に情報を入れてみる。
で、ttpmenu.iniを確認。
古いPCのレジストリも確認。
当たり前だけど、フォーマットはほぼ同じ。
あ、これ変換スクリプトとか書けそうかも、と思い、作ってみました。
レジストリからttpmenu.iniへの変換になります。
1. regeditで「HKEY_CURREN_USER\Software\ShinpeiTools\TTermMenu」以下をエクスポート(仮にttermmenu.regとする)
2. シェルスクリプトが動かせる環境で以下を作成(仮にmake_ttpmenu.shと命名)
3. 上記スクリプトにエクスポートした*.regファイルを与えると、標準出力に吐き出すので、リダイレクトさせてttpmenu.iniを作成#!/bin/bash while read LINE do echo $LINE | sed s/\"//g | sed s/://g | sed "s/,/ /g" | sed s/dword//g | sed s/hex//g done < <( nkf --utf8 $1 | sed -e '1,2d' | sed "s/HKEY_CURRENT_USER\\\Software\\\ShinpeiTools\\\//g" | sed "s/TTermMenu\\\//g" )
$ make_ttpmenu.sh ttermmenu.reg > ttpmenu.ini
4. これを新しいPCのttpmenu.exeと同じフォルダに置けば移行完了。
見ての通り、適当に作ったので「うまく引き継がれていない」等あるかと思うけど、自己責任でお願いします。
2012年8月17日金曜日
EIGRPあれこれ
EIGRPで分かったこと
詳しい人から見たら当たり前なんだろうけど…。
- インターフェイスの遅延と帯域幅
EIGRPのデフォルトでメトリック計算に使われる。
誤解していたんだが、「遅延」は実際のパケットの到達時間とかで自動的に割り出してくれるものではない。
両方とも静的。
管理者の裁量である程度変えてもよさそう。
- VLAN上のインターフェイスの遅延と帯域幅
VLAN上にインターフェイスを乗っけていたら、いくらインターフェイスの帯域幅と遅延をいじってもメトリックが変わらなかった。
なんで?と調べてみたら、こういう場合はインターフェイスをいじっても仕方ないのね。
該当のVLANを変えないと。
int vlan
でdelay 500
とかやったらすぐに反映された。
Nagios備忘録
Nagiosを3.0rc3から3.2.3にした。
これでも古いけど、rpmが見つからなかったのでとりあえず。
- 設定ファイル
3.0:
/usr/local/nagios/etc/nagios.cfg
/usr/local/nagios/etc/minimal.cfg
(やり方によるんだろうが、自分はminimal.cfgで設定してた)
3.2.3:
/etc/nagios/nagios.cfg
/etc/nagios/objects/以下
- プラグイン
3.0:
/usr/local/nagios/libexec
3.2.3:
/usr/lib/nagios/plugins
- ホスト追加
/etc/nagios/objects/ホスト名.cfg で
define host {...}
を埋める
- サービス追加
/usr/lib/nagios/plugins に新サービスとなるプログラム、スクリプトを作成
/etc/nagios/objects/commands.cfg で
define command {...}
を埋める
- 追加対象のホストのファイル
/etc/nagios/nagios.cfg で
cfg_file=/etc/nagios/objects/ホスト名.cfg
を追加
- 設定ファイルのチェック
/usr/bin/nagios -v /etc/nagios/nagios.cfg
でチェック可能
- メール通知先の変更
/etc/nagios/objects/contacts.cfg で
email nagios@localhost
部分を任意のアドレスに変更
- 通知メールの文面変更(メール本文)
/etc/nagios/objects/commands.cfg の
'notify-service-by-email'のcommand_line部分を変更
デフォルトでは、Additional Infoだとブラウザで見たときに見える詳細が見えない。
わざわざ参考になる情報を出すようにスクリプトを組んだのに、通知メール→ブラウザで確認するんじゃワンアクションもったいない。
なので、ここを変えてみる。
command_line /usr/bin/printf "%b" "***** Nagios *****\n\nNotification Type: $NOTIFICATIONTYPE$\n\nService: $SERVICEDESC$\nHost: $HOSTALIAS$\nAddress: $HOSTADDRESS$\nState: $SERVICESTATE$\n\nDate/Time: $LONGDATETIME$\n\nAdditional Info:\n\n$SERVICEOUTPUT$\n\n$LONGSERVICEOUTPUT" | /bin/mail -s "** $NOTIFICATIONTYPE$ Service Alert: $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$ **" $CONTACTEMAIL$
$LONGSERVICEOUTPUTを足しただけ。
こちらが参考になった。
http://www.marsandares.jp/tools/nagios-config.html
2012年2月17日金曜日
BitNami Redmineの自動起動
便利だけどインストールまでにいろいろすることが多いRedmine。
その面倒なところを全部やってくれるのでBitNamiでインストールしてみた。
メニューで選択していくだけなんで、ものすごく簡単。
「こりゃあ快適~」なんて悦に入っていたけど、サーバを再起動したら動いてない…。
「どこから起動するんだっけ?」と思い、調べてみると
# /opt/redmine-<バージョン>/ctlscript.sh startでOK。
でも、毎回起動するのメンドイなぁ。
ctlscript.shを/etc/init.d/に持ってきてchkconfig -addでうまく行くか?と思ったけど、chkconfigから「サポートしてない形式」、と言われてしまった。
ってことでさらに調べてみるとここにあたった。
http://bitnami.org/article/how-to-install-services-on-linux
上の例はdrupalだけど、redmineでも他のでも応用可能なはず。
# cp /opt/redmine-<バージョン>/ctlscript.sh /etc/init.d/bitnami-redmineとしただけではダメで、ちょっと編集しないといけないらしい。
最初の4行がこうなるように
#!/bin/shrunラベルが2345のときは起動して、起動の優先度を80、停止の優先度を30にしてくれるはず。
#
# chkconfig: 2345 80 30
# description: BitNami Service
これで
# chkconfig --add bitnami-redmine
# chkconfig --list bitnami-redmine
bitnami-redmine 0:off 1:off 2:on 3:on 4:on 5:on 6:off
素晴らしい!
再起動してみても、ちゃんと自動起動してくれました!
一応、/etc/rc.d/rc3.dを見てみるとちゃんとS80で動いてる
# ll /etc/rc.d/rc3.d/*bitnami*さらにrc0.dを見るとK30となってました
lrwxrwxrwx 1 root root 25 2月 17 16:33 /etc/rc.d/rc3.d/S80bitnami-redmine -> ../init.d/bitnami-redmine
# ll /etc/rc.d/rc0.d/*bitnami*
lrwxrwxrwx 1 root root 25 2月 17 16:33 /etc/rc.d/rc0.d/K30bitnami-redmine -> ../init.d/bitnami-redmine
これで楽々!
2012年2月14日火曜日
HP-UXのシェルスクリプトで親プロセスのIDを取得する
GNUコマンドがふんだんに使えるLinuxが好きだけど、職務上HP-UXも使ったりする。
シェルスクリプトで親プロセスを取得したくて、いろいろ調べた時に分かったのでちょっと書いておきます。
#!/bin/sh PID=$$ PPID=$( UNIX95="" ps -o ppid -p $PID | tail -1 ) PCOMM=$( UNIX95="" ps -o comm -p $PPID | tail -1 ) echo PID: $PID echo PPID: $PPID echo PPCOM: $PCOMM
実行結果
% sh ./test.sh
PID: 27324
PPID: 25107
PPCOM: -zsh
と一致しているので大丈夫でしょう。
分かりにくいのはここ。
PPID=$( UNIX95="" ps -o ppid -p $PID | tail -1 )
というのもpsもmanを見てみると、-o format とあるものの「UNIX標準の構文」の部分。
英語だとXPG4の部分。
普通に
ps -o pidとしても
ps: オプションが正しくありません。-- oとか出てくる。
なにこれ、どうすんの?と思ったら、ここを見つけた。
http://d.hatena.ne.jp/cartooh/20050611
要は環境変数UNIX95がセットしてあればいいらしい。値はダミーでもいいみたい。
% UNIX95="dummy" ps -o pid
PID
26857
25107
…やっぱりLinuxが好きだなぁ~。
2012年2月8日水曜日
DELL PowerEdgeのRAID状態を監視
RAID1で組んでいたDELLのLinuxサーバで、ディスクが片方死んでいたのに気付かず、片肺のまま放置されていた。
再起動をきっかけに死んでいたディスクが一時的に復活し、数週間前の状態に両方のディスクを同期してくれた…。
つまりは、ここ数週間にあった更新が全て消えた…。
バックアップは取っていたけど、一世代前しかなくて、さらにそれも同期された後に気付いた。
どうしようもない…。
実話だけど、二度とこんなことがないようにバックアップ先を複数にして、さらに世代化した。
で、RAIDが死んでたのに気付かない、なんてことがないように監視をしたい。
DELLサーバなので、Open Manage Server Administratorを使えばいいらしい。
参考にしたのはこの辺り。
http://d.hatena.ne.jp/kno1020/20081007/1223387709
http://satospo.sakura.ne.jp/blog_archives/tech/hardware/r210_omsa.html
http://linux.dell.com/wiki/index.php/Repository/OMSA
yumでインストールするために、リポジトリを追加
# wget -q -O - http://linux.dell.com/repo/hardware/latest/bootstrap.cgi | bashコマンドだけあればいいので、srvadmin-baseとsrvadmin-storageservicesをyumでインストール
# yum install srvadmin-base srvadmin-storageservicesインストール完了後、勇んでコマンドを打ってみる
# omreport「あれ?」と思い、ログを見たら
-bash: omreport: command not found
**********************************************************としっかり書いてありました。
After the install process completes, you may need
to log out and then log in again to reset the PATH
variable to access the Dell OpenManage CLI utilities
**********************************************************
一回ログアウトして、ログインし直したら、ちゃんとUsageが出た。
よしよし、いい調子。
試しにちょっとやってみよう。
# omreport chassis memoryえ、メモリが見えないって…。
Memory Information
Error : Memory object not found
他にもポートもプロセッサもやってみたけど、どれもnot found。
CentOSのバージョン?PowerEdge T100はサポートされない?インストールの問題?とかいろいろ考えたけど、ちょっと調べてみたら、OMSAが起動してない、と。
では、OMSAを起動する方法は?と調べたところ、以下でいいらしい
# /opt/dell/srvadmin/sbin/srvadmin-services.sh startあら、何かエラーだ。
Starting Systems Management Device Drivers:
Starting dcdbas: [ OK ]
Starting dell_rbu: [ OK ]
Starting Systems Management Data Engine:
Starting dsm_sa_datamgrd: [ OK ]
Starting dsm_sa_eventmgrd: [ OK ]
Starting DSM SA Shared Services: [ OK ]
libstdc++.so.5 is required to run the Inventory Collector.
libstdc++がないならインストールしてやればいいだけか。
# yum install compat-libstdc++-33サービスの再起動
# /opt/dell/srvadmin/sbin/srvadmin-services.sh restartエラーもなし。毎回ここで起動するのも面倒。
Shutting down DSM SA Shared Services: [ OK ]
Stopping Systems Management Data Engine:
Stopping dsm_sa_eventmgrd: [ OK ]
Stopping dsm_sa_datamgrd: [ OK ]
Stopping Systems Management Device Drivers:
Stopping dcdbas: [ OK ]
Stopping dell_rbu: [ OK ]
Starting Systems Management Device Drivers:
Starting dcdbas: [ OK ]
Starting dell_rbu: [ OK ]
Starting Systems Management Data Engine:
Starting dsm_sa_datamgrd: [ OK ]
Starting dsm_sa_eventmgrd: [ OK ]
Starting DSM SA Shared Services: [ OK ]
あ、enableすればそれでいいらしい
# /opt/dell/srvadmin/sbin/srvadmin-services.sh enable
instsvcdrv 0:on 1:off 2:off 3:on 4:on 5:on 6:on
dataeng 0:off 1:off 2:off 3:on 4:on 5:on 6:off
dsm_om_shrsvc 0:off 1:off 2:off 3:on 4:on 5:on 6:off
# omreport storage pdisk controller=0
List of Physical Disks on Controller SAS 6/iR Adapter (Slot 2)
Controller SAS 6/iR Adapter (Slot 2)
ID : 0:0
Status : Ok
Name : Physical Disk 0:0
State : Online
~(略)~
ID : 0:1
Status : Ok
Name : Physical Disk 0:1
State : Online
~(略)~
うまく行った!!
あとはこれをNagiosかなんかで定期的に実行してステータス確認すればよさそう。
コマンドのマニュアルはこちら
http://support.dell.com/support/edocs/software/svradmin/5.4/ja/cli/report.htm
登録:
投稿 (Atom)