389dsサーバの監視(SNMP)

## エージェント(監視される)側
* OS: CentOS8 ☞ [構築手順](https://qiita.com/bwitch/items/7942ec30e2445acaca49)（ただし[ツールを使った場合](https://qiita.com/bwitch/items/2e54bb088d0e56098c0e)）
* IPアドレス: 192.168.11.100

### net-snmpのインストールと設定
```sh
sudo -s

dnf install net-snmp net-snmp-utils -y

#全て見えるようにする("view ... .1"だけにする)
sed -ri '0,/^view/ s/^(view.+) \..*/\1 .1/;/^view.+ \.1\./d' /etc/snmp/snmpd.conf

systemctl restart snmpd

#確認
snmpwalk -v 2c localhost -c public

#ポートを開けておく
firewall-cmd --add-service=snmp --permanent
firewall-cmd --reload
```

### 389dsのSNMP対応
```sh
#AgentXプロトコル(?)を有効にする
echo 'master agentx' >> /etc/snmp/snmpd.conf
systemctl restart snmpd

#ldap-agentのインストール
yum install 389-ds-base-snmp -y
#インスタンスを指定
echo 'server slapd-localhost' >> /etc/dirsrv/config/ldap-agent.conf
#SELinuxが有効だと何故か動作しない
setenforce 0
#起動
systemctl start dirsrv-snmp

#確認
snmpwalk -v 2c localhost -c public .1.3.6.1.4.1.2312.6.1.1 -m /usr/share/dirsrv/mibs/redhat-directory.mib
```
↓

```
RHDS-MIB::dsAnonymousBinds.389 = Counter64: 0
RHDS-MIB::dsUnAuthBinds.389 = Counter64: 0
RHDS-MIB::dsSimpleAuthBinds.389 = Counter64: 161
RHDS-MIB::dsStrongAuthBinds.389 = Counter64: 0
RHDS-MIB::dsBindSecurityErrors.389 = Counter64: 0
RHDS-MIB::dsInOps.389 = Counter64: 13938
RHDS-MIB::dsReadOps.389 = Counter64: 0
RHDS-MIB::dsCompareOps.389 = Counter64: 0
RHDS-MIB::dsAddEntryOps.389 = Counter64: 6753
RHDS-MIB::dsRemoveEntryOps.389 = Counter64: 6753
RHDS-MIB::dsModifyEntryOps.389 = Counter64: 99
RHDS-MIB::dsModifyRDNOps.389 = Counter64: 0
RHDS-MIB::dsListOps.389 = Counter64: 0
RHDS-MIB::dsSearchOps.389 = Counter64: 11
RHDS-MIB::dsOneLevelSearchOps.389 = Counter64: 0
RHDS-MIB::dsWholeSubtreeSearchOps.389 = Counter64: 11
RHDS-MIB::dsReferrals.389 = Counter64: 0
RHDS-MIB::dsChainings.389 = Counter64: 0
RHDS-MIB::dsSecurityErrors.389 = Counter64: 0
RHDS-MIB::dsErrors.389 = Counter64: 12241
RHDS-MIB::dsConnections.389 = Counter64: 0
RHDS-MIB::dsConnectionsInMaxThreads.389 = Counter64: 0
RHDS-MIB::dsMaxThreadsHits.389 = Counter64: 1
```
---------------------------------------------------------------------------------

## マネージャ(監視する)側
* OS: CentOS7 (CenOS8のepelがおかしいので)
* IPアドレス: 192.168.11.200

### SNMP接続を確認
```sh
sudo -s

yum install net-snmp-utils -y
snmpwalk -v 2c 192.168.11.100 -c public
```

### (zabbixのための)epelインストール
```sh
yum install epel-release -y
#grep enabled /etc/yum.repos.d/epel.repo

yum list "zabbix40*"
```

↓

```
利用可能なパッケージ
zabbix40.x86_64                     4.0.17-1.el7     epel
zabbix40-agent.x86_64               4.0.17-1.el7     epel
zabbix40-dbfiles-mysql.noarch       4.0.17-1.el7     epel
zabbix40-dbfiles-pgsql.noarch       4.0.17-1.el7     epel
zabbix40-dbfiles-sqlite3.noarch     4.0.17-1.el7     epel
zabbix40-proxy.noarch               4.0.17-1.el7     epel
zabbix40-proxy-mysql.x86_64         4.0.17-1.el7     epel
zabbix40-proxy-pgsql.x86_64         4.0.17-1.el7     epel
zabbix40-proxy-sqlite3.x86_64       4.0.17-1.el7     epel
zabbix40-server.noarch              4.0.17-1.el7     epel
zabbix40-server-mysql.x86_64        4.0.17-1.el7     epel
zabbix40-server-pgsql.x86_64        4.0.17-1.el7     epel
zabbix40-web.noarch                 4.0.17-1.el7     epel
zabbix40-web-mysql.noarch           4.0.17-1.el7     epel
zabbix40-web-pgsql.noarch           4.0.17-1.el7     epel
```

### zabbixインストール
```sh
yum install zabbix40-server-mysql zabbix40-web-mysql -y

#(警告を出さないための)タイムゾーンの設定
sed -ri 's|^.*(php_value +date.timezone).*|\1 Asia/Tokyo|' /etc/httpd/conf.d/zabbix.conf
systemctl restart httpd

#管理画面のためのポートを開ける
firewall-cmd --add-service=http --permanent
firewall-cmd --reload
```

### データベースの準備
```sh
#MySQLのインストール
yum install mariadb-server -y
systemctl start mariadb

#データベースの作成
mysql -uroot -e "create database zabbix charset utf8"
#上データベースの管理者の設定
mysql -uroot -e "delete from mysql.user where Host<>'localhost' or User<>'root'"
mysql -uroot -e "grant all on zabbix.* to zabbix"
mysql -uroot -e "flush privileges"

#初期データを投入
mysql -uzabbix zabbix < /usr/share/zabbix-mysql/schema.sql
mysql -uzabbix zabbix < /usr/share/zabbix-mysql/images.sql
mysql -uzabbix zabbix < /usr/share/zabbix-mysql/data.sql
```

### 環境設定

* セットアップ
    * http\://192.168.11.200/zabbix  
    * "Next step"(5回)
    * "Finish"
* ログイン
    * Username: admin
    * Password: zabbix
    * "Sign in"  
* 日本語
    * ヘッダ右端の人アイコン
    * Language: Japanese
    * "Update"

### zabbixサーバーを起動
```sh
setenforce 0
systemctl restart zabbix-server
```

### ホストの追加

* 設定 > ホスト > ホストの作成
	* ホスト名: CentOS8 389ds
	* グループ: Linux servers
	* エージェントのインターフェース (使わないけど必須なので)
		* IPアドレス: 192.168.11.100
		* ポート: 10050
	* SNMPインターフェース
		* IPアドレス: 192.168.11.100
		* ポート: 161
* "テンプレート"タブ (とりあえずそれっぽい監視項目を設定してみる)
	* 新規テンプレートをリンク > 選択
	* 「Template OS Linux SNMPv2」と「Template App Ldap Service」を選択 > 追加
* "マクロ"タブ ("Template OS Linux SNMPv2"用)
	* マクロ: {$SNMP_COMMUNITY}
	* 値: public
* どこかのタブの"追加"ボタン

### 389ds用の監視

#### 監視項目のリストを作る
```sh
#389ds用のMIBファイルをコピー
scp hoge@192.168.11.100:/usr/share/dirsrv/mibs/redhat-directory.mib .

#MIB→OIDの対応表
snmptranslate -Tz -m ./redhat-directory.mib | grep -F '1.3.6.1.4.1.2312.6.1.1.' | sed 's/"//g;s/$/.389/' > items
```

#### [Zabbix API](https://www.zabbix.com/documentation/2.2/manual/api) で設定
```sh
#JSONパーサをインストール
yum install jq -y

#curlのエイリアスを設定
alias curl='curl -sS -XPOST -H Content-Type:application/json-rpc http://localhost/zabbix/api_jsonrpc.php'

#ログイン
auth=$(curl -d '{"jsonrpc":"2.0", "id":1, "method":"user.login", "params":{"user":"admin","password":"zabbix"}}' | jq -r ".result")

#テンプレートのグループID
group=$(curl -d '{"jsonrpc":"2.0", "id":1, "auth":"'$auth'", "method":"hostgroup.get", "params":{"filter":{"name":"Templates"}}}' | jq -r ".result[0].groupid")

#新しく作ったホストID
host=$(curl -d '{"jsonrpc":"2.0", "id":1, "auth":"'$auth'", "method":"host.get", "params":{"filter":{"name":"CentOS8 389ds"}}}' | jq -r ".result[0].hostid")

#テンプレートを作成
tmpl=$(curl -d '{"jsonrpc":"2.0", "id":1, "auth":"'$auth'", "method":"template.create", "params":{"host":"389ds SNMP", "groups":[{"groupid":'$group'}], "hosts":[{"hostid":'$host'}]}}' | jq -r ".result.templateids[0]")

#各監視項目を追加
cat items | while read mib oid; do
 curl -d '{"jsonrpc":"2.0", "id":1, "auth":"'$auth'", "method":"item.create", "params":{"hostid":'$tmpl', "name":"'$mib'", "key_":"'$mib'", "type":4, "value_type":3, "delay":30, "snmp_community":"public", "snmp_oid":"'$oid'"}}' | jq
done

unalias curl
```