2009年6月25日木曜日

Nagiosプラグイン、check_snmp で閾値に下限を設定する

メモエントリ。
Nagiosプラグインの check_snmp について。
 

check_snmp を使って性能監視をしたいと思ったが、警告(WARNING) オプションで閾値を指定すると、取得した値が閾値を上回ったらWARNING で返ってくる。
下回った時はどうやって設定するんだろう。
 

とりあえずヘルプを見る。

# ./check_snmp --help
check_snmp v2021 (nagios-plugins 1.4.13)
Copyright (c) 1999-2007 Nagios Plugin Development Team

 
Check status of remote machines and obtain sustem information via SNMP
 
 
Usage:check_snmp -H -o [-w warn_range] [-c crit_range]
[-C community] [-s string] [-r regex] [-R regexi] [-t timeout] [-e retries]
[-l label] [-u units] [-p port-number] [-d delimiter] [-D output-delimiter]
[-m miblist] [-P snmp version] [-L seclevel] [-U secname] [-a authproto]
[-A authpasswd] [-X privpasswd]
 
Options:
-h, --help
Print detailed help screen
-V, --version
Print version information
-H, --hostname=ADDRESS
Host name, IP Address, or unix socket (must be an absolute path)
-p, --port=INTEGER
Port number (default: 161)
-n, --next
Use SNMP GETNEXT instead of SNMP GET
-P, --protocol=[1|2c|3]
SNMP protocol version
-L, --seclevel=[noAuthNoPriv|authNoPriv|authPriv]
SNMPv3 securityLevel
-a, --authproto=[MD5|SHA]
SNMPv3 auth proto
-C, --community=STRING
Optional community string for SNMP communication (default is "public")
-U, --secname=USERNAME
SNMPv3 username
-A, --authpassword=PASSWORD
SNMPv3 authentication password
-X, --privpasswd=PASSWORD
SNMPv3 privacy password
-o, --oid=OID(s)
Object identifier(s) or SNMP variables whose value you wish to query
-m, --miblist=STRING
List of MIBS to be loaded (default = none if using numeric oids or 'ALL'
for symbolic oids.)
-d, --delimiter=STRING
Delimiter to use when parsing returned data. Default is "=" Any data on the right hand side of the delimiter is considered
to be the data that should be used in the evaluation.
-w, --warning=INTEGER_RANGE(s)
Range(s) which will not result in a WARNING status

-c, --critical=INTEGER_RANGE(s)
Range(s) which will not result in a CRITICAL status
-s, --string=STRING
Return OK state (for that OID) if STRING is an exact match
-r, --ereg=REGEX
Return OK state (for that OID) if extended regular expression REGEX matches
-R, --eregi=REGEX
Return OK state (for that OID) if case-insensitive extended REGEX matches
-l, --label=STRING
Prefix label for output from plugin (default -s 'SNMP')
-u, --units=STRING
Units label(s) for output data (e.g., 'sec.').
-D, --output-delimiter=STRING
Separates output on multiple OID requests
-t, --timeout=INTEGER
Seconds before connection times out (default: 10)
-v, --verbose
Show details for command-line debugging (Nagios may truncate output)
 
This plugin uses the 'snmpget' command included with the NET-SNMP package.
if you don't have the package installed, you will need to download it from
http://net-snmp.sourceforge.net before you can use this plugin.
 
Notes:
- Multiple OIDs may be indicated by a comma- or space-delimited list (lists with
internal spaces must be quoted) [max 8 OIDs]
- Ranges are inclusive and are indicated with colons. When specified as
'min:max' a STATE_OK will be returned if the result is within the indicated
range or is equal to the upper or lower bound. A non-OK state will be
returned if the result is outside the specified range.
- If specified in the order 'max:min' a non-OK state will be returned if the
result is within the (inclusive) range.
- Upper or lower bounds may be omitted to skip checking the respective limit.
- Bare integers are interpreted as upper limits.
- When checking multiple OIDs, separate ranges by commas like '-w 1:10,1:,:20'
- Note that only one string and one regex may be checked at present
- All evaluation methods other than PR, STR, and SUBSTR expect that the value
returned from the SNMP query is an unsigned integer.
 
Send email to nagios-users@lists.sourceforge.net if you have questions
regarding use of this software. To submit patches or suggest improvements,
send email to nagiosplug-devel@lists.sourceforge.net

 

閾値はレンジだそうで、Note部分に色々書いてあるな、ちょっと試してみた。値はコロンで仕切ろう。
    設定例
  1. "-w 100" ⇒ 100を超えたら警告

  2. "-w :100" ⇒ 100を超えたら警告

  3. "-w 100:500" ⇒ 100から500の範囲からはみ出したら警告

  4. "-w 100:" ⇒ 100未満なら警告


 

という感じになる模様。

2009年6月20日土曜日

Windows コマンドラインから 「パスワードを無期限にする」を有効にする

何を言わんか、判る人にはわかるだろう。 net user コマンドにはこの機能がないのだ。
 

先日とある切欠で wmic の存在を思い出し、記事タイトルのことが出来るのかやってみた。
WMICodeCreator でWMIの中身をチェック、Win32_UserAccount の PasswordExpires を更新すればよい ことはわかっているので、WSHからは既にやっていたんだが、wmic を使えばコマンド1行でOKなのがいい。
 

wmic では Win32_UserAccount のエイリアスは useraccount だ。
なのでコマンドはこうなる。
 

wmic useraccount where (Name = "hogehoge") set PasswordExpires=False
 
 


では、コンピュータ名 "TESTPC" で ユーザー "hogehoge" のアカウントプロパティ「パスワードを無期限にする」にチェックを入れてみよう。
 

C:\>wmic useraccount where (Name = "hogehoge") set PasswordExpires=False
'\\TESTPC\ROOT\CIMV2:Win32_UserAccount.Domain="TESTPC",Name="hogehoge"' のプロパティを更新しています
プロパティは正しく更新されました。

 

C:\>wmic useraccount where (Name = "hogehoge") get PasswordExpires
PasswordExpires
FALSE

 

はいオッケィ。
これで、ユーザ管理画面を開かずにユーザ作成、グループに追加、パスワード無期限 をコマンドラインだけで出来て、あの面倒な「コンピュータの管理」を開かないで済むのだ。
 

2009年6月15日月曜日

社内検証LANをLinuxのiptablesでマスカレード

社内に検証用のLANを作ったとして、既存のLANにはくっつけたくないけど、ネットには繋ぎたいなという環境。
 

NIC2枚ざしのLinuxサーバを1台使って、検証用ネットワークをマスカレードしてしまうには、1行のiptablesルールでOKだったりする。
※使ったのはCentOS5.3でiptables は v1.3.5
 

接続としてはこんな感じ。
┼────┼
│Internet│
┼────┼

│ 社内LAN:192.168.1.0/24
├─┬──────



│eth0:192.168.1.10
┼───────┼
│ルータ用Linux │
┼───────┼
│eth1:10.48.1.254

│ 検証LAN:10.48.1.0/24
├────

 
 


事前にipv4のフォワードを有効にしておく必要があるので、 "/etc/sysctl/conf" を修正して再起動。
# Controls IP packet forwarding
#net.ipv4.ip_forward = 0
net.ipv4.ip_forward = 1

 

で、iptablesのルールを作成。

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
natテーブルのPOSTROUTINGチェインにルールを1つ、これでとりあえずマスカレードしてくれるようだ。
インターフェイスは環境によるので適宜書き換え、出る際のルールなので外側に。
 

FTPとかはPassiveを使わないと無理だろうけど、とりあえずで設定するなら簡単でいい。
 


ルールを出すとこんな感じ
# iptables -v -L -t nat
Chain PREROUTING (policy ACCEPT 573 packets, 67730 bytes)
pkts bytes target prot opt in out source destination
 
Chain POSTROUTING (policy ACCEPT 333 packets, 26739 bytes)
pkts bytes target prot opt in out source destination
12 861 MASQUERADE all -- any eth0 anywhere anywhere
 
Chain OUTPUT (policy ACCEPT 377 packets, 29918 bytes)
pkts bytes target prot opt in out source destination

 
 

不都合あったらルールに追記するって事で、とりあえず完了。
 

出来ない場合、 lsmod で ipt_MASQUERADE があるか確認。

2009年6月14日日曜日

Sun VirtualBox 2.2.4 上に WindowsServer2008 をインストールして 「Guest Additions」。いわゆるバーチャルマシン追加機能

WindowsVistaに 「Sun VirtualBox 2.2.4 」 を入れて、WindowsServer2008を仮想PC上にセットアップした。
 

OSセットアップ直後には、仮想PCのGUIを触るとマウスが捕えられてちょっと不便、マウスをシームレスにするため Guest Additions というのを入れる。
実は WindowsServer2008 にも対応していると思ってなかったのでちょっと感心した。
 
大体はVRDPでも事足りるんんだけど、追加しといて損はなさそう。
 
 

インストールは非常に簡単、早い話がVirtualPC/VirtualServerのバーチャルマシン追加機能と機能も導入の仕方も同じ。(※多少の差異はアリで)
 


[caption id="attachment_1349" align="alignnone" width="300" caption="画像:VirtualBox の Guest Additions"]画像:VirtualBox の Guest Additions[/caption]
 

以降、迷うとこも無いので再起動まで流す。
 

[caption id="attachment_1350" align="alignnone" width="300" caption="画像:CDを入れたような感じになる"]画像:CDを入れたような感じになる[/caption]
 

[caption id="attachment_1351" align="alignnone" width="300" caption="画像:Guest Additionsセットアップ開始"]画像:Guest Additionsセットアップ開始[/caption]
 

[caption id="attachment_1352" align="alignnone" width="300" caption="画像:専用のドライバが入る"]画像:専用のドライバが入る[/caption]
 


[caption id="attachment_1353" align="alignnone" width="300" caption="画像:再起動を促される"]画像:再起動を促される[/caption]
 
ここで再起動が入るので注意。
 
 

[caption id="attachment_1354" align="alignnone" width="383" caption="画像:マウス統合の説明"]画像:マウス統合の説明[/caption]
 

ゲストの起動を尻目にメッセージボックスが現れる、背後では着々とOSの起動は進行。
 

[caption id="attachment_1355" align="alignnone" width="300" caption="画像:マウス統合後"]画像:マウス統合後[/caption]
 

マウス統合の証アイコンが右下にあるのが判るだろうか。

2009年6月12日金曜日

Windows PowerShell でイベントログをリアルタイム監視

The PowerShell Guy が教えてくれた、WindowsServerでイベントログをリアルタイムで監視する方法。
 
 


.Net FrameWorkで最新のイベントログをキャッチ


.Net FrameWork を使えるPowerShellなら、色々楽勝...といっても結局はWMIに問い合わせるみたい、某所で使っているイベントログ監視スクリプトはVBSで作ってあるけど、あれもWMIだったな。
 

ただ、system.management.ManagementEventWatcher クラスをいきなり使えるということでだいぶ違うように見える。
実はクラスとかあまり理解してないが、なんとも便利になったと思う。
 
 

PowerShellプロンプトでやってみる


イベントを待つには3行ですっきりOK、表示用にもう一行。
手っ取り早く効果を試せるので、下記をPSのプロンプトに張り付けてみる。

[sourcecode language='sh']$ew = new-object system.management.ManagementEventWatcher
$ew.query = "Select * From __InstanceCreationEvent Where TargetInstance ISA 'Win32_NTLogEvent'"
$e = $ew.WaitForNextEvent()
$e[/sourcecode]

ManagementEventWatcher パブリック メソッド の WaitForNextEvent() を使っている、張り付けたスクリプトはいったんここで止まる。
 

PS C:\>$ew = new-object system.management.ManagementEventWatcher
PS C:\>$ew.query = "Select * From __InstanceCreationEvent Where TargetInstance ISA 'Win32_NTLogEvent'"
PS C:\>$e = $ew.WaitForNextEvent()
PS C:\>$e
_←点滅カーソル


何かイベントが発生するまで待機するので、他のシェルからテスト用に eventcreate コマンドでイベントログを書き込み。
 

C:\>EVENTCREATE /T ERROR /ID 1000 /L APPLICATION /D "wait test"
 
成功: 種類が 'ERROR' のイベントが、'APPLICATION' ログ内に、'EventCreate' をソースとして作成されました。

 
すると、 $e に発生したイベントのオブジェクトが代入され、 直後で指定しているので $e が表示される
 

はい出た。
__GENUS : 2
__CLASS : __InstanceCreationEvent
__SUPERCLASS : __InstanceOperationEvent
__DYNASTY : __SystemClass
__RELPATH :
__PROPERTY_COUNT : 3
__DERIVATION : {__InstanceOperationEvent, __Event, __IndicationRelated, __SystemClass}
__SERVER :
__NAMESPACE :
__PATH :
SECURITY_DESCRIPTOR : {1, 0, 20, 128...}
TargetInstance : System.Management.ManagementBaseObject
TIME_CREATED : 128892011594751253

 

が、えらくメタな情報だな。
 
 

今回目的のイベントログは TargetInstance ってプロパティに格納されているので表示する、この辺はWMI。
PS C:\> $e.targetinstance
 
 
__GENUS : 2
__CLASS : Win32_NTLogEvent
__SUPERCLASS :
__DYNASTY : Win32_NTLogEvent
__RELPATH : Win32_NTLogEvent.Logfile="Application",RecordNumber=13539
__PROPERTY_COUNT : 16
__DERIVATION : {}
__SERVER :
__NAMESPACE :
__PATH :
Category : 0
CategoryString :
ComputerName : ********
Data :
EventCode : 1000
EventIdentifier : 1000
EventType : 1
InsertionStrings : {wait test}
Logfile : Application
Message : wait test
RecordNumber : 13539
SourceName : EventCreate
TimeGenerated : 20090********.000000-000
TimeWritten : 20090********.000000-000
Type : エラー
User : ********\sawano

 
OK、イベントソース、コードなど、おなじみのものが表示されている。
 
 



監視をループさせる


それではイベントログをリアルタイムで監視させる。
特に芸も無く、ループで回すだけだ。
[sourcecode language='sh']$a = 0

$ew = new-object system.management.ManagementEventWatcher
$ew.query = "Select * From __InstanceCreationEvent Where TargetInstance ISA 'Win32_NTLogEvent'"

do
{
$e = $ew.WaitForNextEvent()
$e.TargetInstance
}
while ($a -ne 1)
[/sourcecode]

While にずっと達成できない条件を指定して、ずっと回ってもらう。
 
これをPSプロンプトに流すと、Whlieの後で、カーソル点滅。 最後はDoの>>が消えるまでEnterの入力が必要。
 

--snip--
>> $e.TargetInstance
>> }
>> while ($a -ne 1)
>>
_←点滅カーソル

 

さて、この状況でほっといてみよう、EventCreateで試してもいい。
Vistaでやっていたら、意外と色々ログが上がって来て面白かった。
 
 

おわりに


さて、これをやってどうするか。
イベントをキャッチして、mixi や wassr に投稿するBotも捨てがたいが、通常は警告(Warning)、エラー(Error)もしくは特定のイベント発生を管理者に通知したい。
手段として妥当なところでは、メールだろうか。
 

今度はメール通知部分をくっつけてみよう、起動はタスクマネージャからだな。
 

2009年6月11日木曜日

WindowsServer2003、SP1のサポートは2009年4月で終わってる

今月もMicrosoftUpdateの時期が来たわけだが、ある所から『WindowsServer2003のSP1 にパッチが落ちてこないよー』、と聞こえてきた。
 

マイクロソフト プロダクト サポート ライフサイクル を見ると...
 
製品名 / サービス パック サポート終了日
Windows Server 2003 Service Pack 1 / 2009/04/14

 

アラヤダ、先月はサーバ用のパッチが無かったので気づかなかったのね。
 
 

という事で、SP1の状態ではもうパッチが落ちてきませんよー。

Nagios に pnp を合体させたが、グラフだけ出なかった

適当に新規でインストールした CentOS5.3 に、Nagios と アドオンのグラフツール pnp (pnp4nagios) を入れてみた。
 

公式のドキュメントどおりに、Bulk Mode with NPCD でセットアップ、rrdtoolをフェッチするとちゃんと値が入ってるのを確認したので、WEBから見に行ったらグラフが出ない。。。
 
 

httpdのエラーログを見たらフォントがネーヨだって。

No fonts found; this probably means that the fontconfig
library is not correctly configured. You may need to
edit the fonts.conf configuration file. More information
about fontconfig can be found in the fontconfig(3) manual
page and on http://fontconfig.org

 


ああ、 rrdtool がグラフ書くには、フォントがいるんだなぁ
fc-list したら何も無い、そういえばX入れてないもの、フォント空っぽだわ。
 


とりあえずyumでghostscriptを入れといたらちゃんとグラフ出力された。
 

2009年6月9日火曜日

cron で サービス監視ワンライナー

linuxやUNIXサーバで、取り合えず起動していて欲しいサービスがある場合。
堅くやりたければ daemontools や monitやらを使い、nagiosなどで外部から監視させたい。
 
そこまで不要だけどとりあえず、って時は cron にやらせるのも手軽でアリ。
nagios プラグインと組み合わせることで意外と柔軟な設定もできる。
 
 

では linux版、pidofを使ってみる。
*/10 * * * * root /sbin/pidof hoge > /dev/null || /sbin/service hoge start
 

たとえばこんなの。10分おきにpidof を叩いて、正常終了しなかったら実行の "||" を使って エラーがあれば通知(デフォルトならroot宛)もしてくれる。
 
 


ちょっと応用して、Nagios の check_procs プラグインを使ってプロセスの状態による動作設定をしてみる。

# /usr/local/nagios/libexec/check_procs -w 1:10 -a 'httpd'
PROCS OK: 9 processes with args 'httpd'


check_procs の結果コードは 正常終了が0・Warningが1を返すので、そのまま "&&" や "||" に渡せばOK。
例ではhttpd のプロセス数が 1から10 の間に入ってないとWarning だ。
 
 

ほかにも、check_http で応答が悪かったら、再起動するなり止めるなりするという使い方もできそうだ。
(止める場合は、適当にsleep コマンドをはさんで再開なども)
 

Solarisでも使える、(check_procはコンフィグオプションがややこしいが動作はする)、その場合は service を svcadmに変えればよい。
 
 

で、用があるので IRCプロキシの tiarra を監視した。
*/15 * * * * root /usr/local/nagios/libexec/check_procs -w 1:5 -a 'tiarra' >/dev/null || /usr/bin/screen -d -m /usr/l
ocal/tiarra/tiarra --config=/usr/local/tiarra/tiarra.conf

 

tiarra は daemon で動かしたかったんだけど、制御端末からうまく切り離せなかったので断念。 daemon 関数で普通に呼ぶだけじゃ無理なんかな?
 
ってことで、15分おきに tiarra 関連プロセス数が 1-5 の間にあるかチェック、無かったらscreen のデタッチ退却モードで tiarra を動作させるという仕組みで作成。
 

軽くテストはしたので多分動くと思うが、、まだ事故でtiarraが止まってないのでどうなるか。
 
 

プラグインでなくても、「ps -eo 'comm args」の出力辺りから何とかできないかなあ。
 

Solaris10、sdの番号割当をリセットする

Solars10を使っていて、某SCSIのディスクデバイスをつけたりはずしたりしていたら、インスタンス番号※が徐々に増えていった。
※sd00 の 00部分
 

sd90 を超えてきたので、いくらなんでも気持ち悪いと思い、リセットすることにした。
 
 


確認のため、"/etc/path_to_inst" を見るとずらずらとインスタンス定義振られているのがわかる。
 

さてどうしたものかと、マニュアルをちらちら読んでもリセットのやり方がよくわからん。。。
"devfsadm -C" ? ーCオプションはクリアとあるが、"path_to_inst" は特に変化無し。
 
 

で、「Open Solaris and Solaris 10 Forums」見つけた情報。
http://www.solarisforums.com/e107_plugins/forum/forum_viewtopic.php?421
 

消せってか、こいつはシンプル。
 
 

という事で、"/etc/path_to_inst" のバックアップを取った後、中身を空っぽにして再起動してみた。
 

起動中に現れたメッセージには。。。
--snip--
WARNING: /etc/path_to_inst empty or not found
NOTICE: rebuilding device instance data
--snip--

 

OK、うまくいった。
このファイルがおかしいと、平気でSolarisが起動不能に陥るので十分に注意が必要だ。
(失敗したら?OpenSolarisとかをCD起動して、バックアップから直してあげればOK、…多分)
 

かくしてsd90~のデバイスたちはsd1,sd2に若返りするさせることが出来た。
ついでにZFSのデバイスとしては、SD番号が変わるのに何の問題も無い。GUIDがあるから

2009年6月2日火曜日

Gratuitous ARP を捕まえて 機器に設定されたIPアドレスを見る

使っていなかった機器が倉庫から出てきた。
設定など見ようとしたが、IPアドレスの設定情報が無い。
 
 

手元のPCとその機器を適当なスイッチに接続、PC側でWireshark を起動して機器を起動する。
※スイッチは念のため社内LANからは切り離そうね。
 

[caption id="attachment_1339" align="alignnone" width="300" caption="画像:Gratuitous ARPの取得"]画像:Gratuitous ARPの取得[/caption]
 

Gratuitous ARP を飛ばしてくれたのでIPアドレスが判明した。
DHCPなこともあるが。
 
 

linuxがあれば"tcpdump arp" で事足りる。