Snmpホストリソースデータ収集（Linux）

## CPU、メモリー、ディスク使用率 シェルスクリプト編

#### はじめに
Mrtgグラフを作成する場合、SNMPのTargetにOIDを指定する方法が一般的ですが、加工した情報を採るスクリプトを作成しグラフを作成する機会がありましたので書き残します。シェルスクリプトはmrtg.cfgのTargetに設定します。WindowsのVBスクリプト編は<a href="https://qiita.com/ossiansunny/items/f4ac31fa478b43450816">こちら</a>にあります。


#### CPU使用率の取得

```DOC
監視対象エージェントホストがWindowsまたはLinuxの場合

* OID .1.3.6.1.2.1.25.3.3.1.2　をsnmpwalkし、
HOST-RESOURCES-MIB::hrProcessorLoad.xの最大値を取得
```

#### Memory使用率の取得

```DOC
監視対象エージェントホストがWindowsの場合

* OID .1.3.6.1.2.1.25.2.3.1　をsnmpwalkし、
HOST-RESOURCES-MIB::hrStorageDescr.5 = STRING: Physical Memory
のPhysical Memoryのxの数値を取得、この数値同じSizeとUsedを探し
HOST-RESOURCES-MIB::hrStorageSize.5 = INTEGER: 260240
HOST-RESOURCES-MIB::hrStorageUsed.5 = INTEGER: 79706
Used/Sizex100で使用率を算出する（上記例 79706/260240x100=30%）

監視対象エージェントホストがLinuxの場合

* OID .1.3.6.1.2.1.25.2.3.1　をsnmpwalkし、
HOST-RESOURCES-MIB::hrStorageDescr.1 = STRING: Physical Memory
のPhysical Memoryのyの数値を取得、この数値同じSizeとUsedを探し
HOST-RESOURCES-MIB::hrStorageSize.1 = INTEGER: 3715376
HOST-RESOURCES-MIB::hrStorageUsed.1 = INTEGER: 1104480
Used/Sizex100で使用率を算出する（上記例 1104480/3715376x100=29%）
```

#### Disk使用率の取得

```DOC
監視対象エージェントホストがWindowsの場合

* OID .1.3.6.1.2.1.25.2.3.1　をsnmpwalkし、
HOST-RESOURCES-MIB::hrStorageDescr.1 = STRING: **C:\\ Label**
のC:\\ Labelのxの数値を取得、この数値同じSizeとUsedを探し
HOST-RESOURCES-MIB::hrStorageSize.1 = INTEGER: 60721838
HOST-RESOURCES-MIB::hrStorageUsed.1 = INTEGER: 28520672
Used/Sizex100で使用率を算出する（上記例 28520672/60721838x100=46%）

監視対象エージェントホストがLinuxの場合

* OID .1.3.6.1.2.1.25.2.3.1　をsnmpwalkし、
HOST-RESOURCES-MIB::hrStorageDescr.x = STRING: /
の/(root directory)のyの数値を取得、この数値同じSizeとUsedを探し
HOST-RESOURCES-MIB::hrStorageSize.x = INTEGER: 36682240
HOST-RESOURCES-MIB::hrStorageUsed.x = INTEGER: 2096449
Used/Sizex100で使用率を算出する（上記例 2096449/36682240x100=6%）
```

#### 使用パッケージ

- mrtg (/usr/bin/mrtg)
- Net-snmp (Snmp-Server, Snmp-Agent)
- Net-snmpコマンド(/use/bin/snmpget,snmpwalk)

#### スクリプト概要

1. CPU、Memory、Diskの使用率をsnmpで取得・加工するシェルスクリプトを作成します
2. スクリプトはホスト、OS、コミュニティの引数を受け入れ、２つの値を返します
3. ２つのうち、最初に返す値を使用し、２つ目はグラフの上限100%を返します
4. 以下のサンプルスクリプトはチェックおよびエラー処理等を省略しています

#### CPU使用率取得のシェルスクリプト snmpcpuget.sh

``` Bash
#!/bin/bash
host=$1;ostype=$2;comm=$3
cpuarr=`snmpwalk -v1 -c${comm} ${host} .1.3.6.1.2.1.25.3.3.1.2 2>/dev/null | awk 'BEGIN{FS=":"}{print $4}'`
maxcpu=0
for cpu in ${cpuarr[@]}
do
  if [ $cpu -gt $maxcpu ];then
    maxcpu=$cpu
  fi
done
echo $maxcpu;echo 100
```

#### Memory使用率取得のBashシェルクリプト snmpramget.sh

```　Bash
#!/bin/bash
host=$1;ostype=$2;comm=$3
if [ "$ostype" == 'windows' ];then
  snmp=`snmpget -v1 -c${comm} ${host} .1.3.6.1.2.1.25.2.3.1.5.5 2> /dev/null`
  rams=`echo $snmp | awk 'BEGIN{FS=":"}{print $4}'`
  ramu=`snmpget -v1 -c${comm} ${host} .1.3.6.1.2.1.25.2.3.1.6.5 | awk 'BEGIN{FS=":"}{print $4}'`
  echo `expr $ramu \* 100 / $rams`;echo 100
  fi
else
  snmp=`snmpget -v1 -c${comm} ${host} .1.3.6.1.2.1.25.2.3.1.5.1 2> /dev/null`
  rams=`echo $snmp | awk 'BEGIN{FS=":"}{print $4}'`
  ramu=`snmpget -v1 -c${comm} ${host} .1.3.6.1.2.1.25.2.3.1.6.1 | awk 'BEGIN{FS=":"}{print $4}'`
  echo `expr $ramu \* 100 / $rams`;echo 100
fi
```

#### Disk使用率取得のシェルスクリプト snmpdiskget.sh

``` Bash
#!/bin/bash
host=$1;ostype=$2;comm=$3
if [ "$ostype" == 'windows' ];then
  snmp=`snmpget -v1 -c${comm} ${host} .1.3.6.1.2.1.25.2.3.1.5.1 2> /dev/null`
  disks=`echo $snmp | awk 'BEGIN{FS=":"}{print $4}'`
  disku=`snmpget -v1 -c${comm} ${host} .1.3.6.1.2.1.25.2.3.1.6.1 | awk 'BEGIN{FS=":"}{print $4}'`
  echo `expr $disku \* 100 / $disks`;echo 100
else
  snmpwalk -v1 -c${comm} ${host} .1.3.6.1.2.1.25.2.3.1.3 &> /dev/null
  lastoid=`snmpwalk -v1 -c${comm} ${host} .1.3.6.1.2.1.25.2.3.1.3 | grep ': /$' | awk '{print $1}' | awk 'BEGIN{FS="."}{print $2}'`
  oid1=".1.3.6.1.2.1.25.2.3.1.5.$lastoid"
  oid2=".1.3.6.1.2.1.25.2.3.1.6.$lastoid"
  disks=`snmpget -v1 -c${comm} ${host} ${oid1} | awk '{print $4}'`
  disku=`snmpget -v1 -c${comm} ${host} ${oid2} | awk '{print $4}'`
  echo `expr $disku \* 100 / $disks`;echo 100
fi
```

#### mrtg.cfgの設定例

``` DOC
 1 EnableIPv6: no
 2 WorkDir: /mypath/mrtg
 3 #------------------------------------------------------#
 4 Target[sample.com.cpu]: `/mypath/bin/snmpcpuget.sh host ostype comm`
 5 MaxBytes[sample.com.cpu]: 100
 6 Options[sample.com.cpu]: gauge,growright
 7 YTicsFactor[sample.com.cpu]: 1
 8 Factor[sample.com.cpu]: 1
 9 Title[sample.com.cpu]: CPU Load
10 YLegend[sample.com.cpu]: CPU Load
11 #------------------------------------------------------#
12 Target[sample.com.disk]: `/mypath/bin/snmpdiskget.sh host ostype comm`
13 MaxBytes[sample.com.disk]: 100
14 Options[sample.com.disk]: gauge,growright
15 YTicsFactor[sample.com.disk]: 1
16 Factor[sample.com.disk]: 1
17 Title[sample.com.disk]: Disk Usage
18 YLegend[sample.com.disk]: Disk Usage
19 #------------------------------------------------------#
20 Target[sample.com.ram]: `/mypath/bin/snmpramget.sh host ostype comm`
21 MaxBytes[sample.com.ram]: 100
22 Options[sample.com.ram]: gauge,growright
23 YTicsFactor[sample.com.ram]: 1
24 Factor[sample.com.ram]: 1
25 Title[sample.com.ram]: Memory Usage
26 YLegend[sample.com.ram]: Memory Usage 

2,4,12,20行目のパス、ホスト、コミュニティは、環境に合わせて変更が必要
Targetの snmp{cpu,ram,disk}get.sh host:ホスト　ostype:{windows|unix} comm:コミュニティ
```

```DOC
* Path構成
/mypath
    |__ /bin
    |     |__ snmpcpuget.sh
    |     |__ snmpramget.sh
    |     |__ snmpdiskget.sh
    |__ /mrtg  
          |__ mrtg.cfgなど
```

```Bash
* 実行例
$ pwd
/mypath
$ bin/snmpcpuget.sh host {windows|unix} comm
$ bin/snmpramget.sh host {windows|unix} comm
$ bin/snmpdiskget.sh host {windows|unix} comm 
注意：unix,linuxは同じ意味、スクリプトは入力チェック、エラー処理等省略していますので、事前にsnmpコマンドでhost、ostype、commが実際に存在することを確認してから実行して下さい 

$ LANG=C /usr/bin/mrtg /mypath/mrtg/mrtg.cfg
  
$ crontab -e
0,30 * * * * LANG=C /usr/bin/mrtg /mypath/mrtg/mrtg.cfg

```
###### ソースとサンプルデータ
<a href="https://github.com/ossiansunny/visualmonitor">ここの</a>graphsample/linuxにあります。

#### サンプル画像
![mrtggraph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3714448/257e69a6-6fb3-5b66-f4e7-41b86e1d0151.png)

#### おわりに
グラフデータ収集スクリプトはグラフ作成以外に、サーバ監視システムの機能の中のCPU、Memory、Diask使用率の危険値、警告値超えをチェックする機能としても動作させています。興味ある方は<a href="https://github.com/ossiansunny/visualmonitor">ここから</a>どうぞ。