Memo/Linux/Zabbix

http://dexlab.net/pukiwiki/index.php?Memo%2FLinux%2FZabbix
 

統合監視ソフト Zabbix

  • 書籍

Internal checks: 内部チェック

  • 2.8 Internal checks [Zabbix Documentation 3.0]
  • zabbix-server, zabbix-proxyが動作しているホストでのみ有効。zabbix-agentのみ動作してるホストに設定しても値は取れない。
  • zabbix[host,<type>,available]: hostとの通信状態が分かる。type: agent, jmx, ...

database is down

RDSが自動再起動後、以下のログが出た後に自動復旧しない事がある。
ただし、自動再接続する事もありbugなのか不明。

  • 環境
    • CentOS 7.x x86_64
    • nscd-2.17-157
    • Zabbix 3.0.8
    • AWS RDS MySQL 5.7
  • /var/log/zabbix/zabbix_server.log
    1. xxxxx:20180501:000000.000 watchdog: database is down    
  • 手動でzabbix-serverを再起動して復帰
    1. sudo service zabbix-server restart

memcachedの監視

  • /etc/zabbix/zabbix_agentd.d/userparameter_memcached.conf
    1. # memcached.stats[<name>]
    2. UserParameter=memcached.stats[*],[ -f '/usr/bin/memcached-tool' ] && /usr/bin/memcached-tool 127.0.0.1:11211 stats | perl -ane 'if($F[0] =~ /^$1$/){print "$F[1]\n";}'
  • テスト:
    1. zabbix_agentd -t 'memcached.stats[curr_connections]'
    2. memcached.stats[curr_connections]             [t|10]
    3.  
    4. zabbix_agentd -t 'memcached.stats[evictions]'
    5. memcached.stats[evictions]                    [t|0]

iptablesの有効/無効を検出する

iptablesは通常のプロセスとは違う(pid)が無く、modprobeで該当モジュールを読み込む事で有効/無効状態になるため、検出方法も異なる

  • Zabbix item: vfs.file.exists
    • vfs.file.exists[/proc/net/ip_tables_names] を使う。存在していれば1, 無ければ0
  • 「/proc/net/ip_tables_names」ファイルが存在していれば、iptablesが起動している。存在しなければiptablesは停止している。
  • CentOS 6/7 で検証、動作OK
    1. # iptables 起動している場合
    2. sudo service iptables start
    3.  
    4. stat /proc/net/ip_tables_names
    5.   File: `/proc/net/ip_tables_names'
    6.   Size: 0               Blocks: 0          IO Block: 1024   regular empty file
    7. Device: 3h/3d   Inode: 4026532488  Links: 1
    8. Access: (0440/-r--r-----)  Uid: (    0/    root)   Gid: (    0/    root)
    9. ...
    10.  
    11. # iptables 停止している場合
    12. sudo service iptables stop
    13.  
    14. stat /proc/net/ip_tables_names
    15. stat: cannot stat `/proc/net/ip_tables_names': No such file or directory

ダッシュボードでフィルタを使い、対応済みアラートを表示しない

  1. ダッシュボード右上のスパナアイコンをクリック
  2. ダッシュボードフィルター: 有効
  3. 障害の表示: 障害対応コメント未入力のみ
  4. 保存
  5. 障害対応した場合、ダッシュボードで「コメントあり」列のクリックして障害対応の内容と記述
  6. 障害対応済みとしてダッシュボードには表示されなくなる。全て表示したければフィルタを外す

IP/アクセス制限

  • apacheを使っている場合のIPレベルの制限。zabbix.confの中にIP制限の項目を書いても良い。
    1. sudo vim /usr/share/zabbix/.htaccess
    2. --
    3. Order deny,allow
    4. deny from all
    5. allow from 127.0.0.1
    6. allow from 192.168.
    7. ...
    8. --
    9.  
    10. sudo vim /etc/httpd/conf.d/zabbix.conf
    11. --
    12. <Directory "/usr/share/zabbix">
    13. ...
    14.     AllowOverride all
    15. --
    16. sudo service httpd graceful

データの保持期間(Housekeeping)でDBのディスク使用量を減らす

  • Zabbixのアップグレード時(2.0から3.0等)に無効になっていたので要確認
  • Zabbix 3.0
  1. 管理 > 一般設定 > データの保持期間
  2. 未チェック
    • アイテムのヒストリの保存期間を上書き
    • アイテムのトレンドの保存期間を上書き
  3. チェック
    • データの削除処理を有効
    • ユーザーセッション: 30日
    • 他: 365日
  4. 保存

zabbix_senderで複数の値を同時に送る

  • zabbix_agentd
    • zabbix_agentd経由でスクリプト等を実行し、結果をzabbix-server/proxyへ送信
    • zabbix_serverで間隔を指定できる
  • zabbix_sender
    • zabbix-server/proxyに直接結果を送信
    • cronやshell script等にから実行。バッチ処理の結果を送信するなど。
    • テキストファイルに指定の書式で記載する事で、複数の値を一度に送信できる

最新データ

  • 4 最新データ [Zabbix Documentation 2.2]

    Zabbix 2.2.4からは、デフォルトで、直近24時間に低下した値のみ表示されます。この制限は、大量の最新データのページを最初に読み込む時間を改善する目的で導入されました。

  • アイテムの間隔が24時間等だと、最新データでは出ない事がある。その場合、「ヒストリがないアイテムを表示」にチェックを入れ、グラフ > 右上の「値」や「最新の500個の値」から見る事ができる

単位記号


Dockerの監視

  • https://github.com/monitoringartist/zabbix-docker-monitoring
    • 2つの監視方法がある
    • zabbix_module_docker.so
      • ホストにインストールしたzabbix-agentにdocker監視モジュールを追加
      • ${libdir}/modules は /usr/lib64/zabbix/modules に展開されるので、そこに配置
        1. cat /etc/zabbix/zabbix_agentd.conf
        2. LoadModulePath=${libdir}/modules
        3. LoadModule=zabbix_module_docker.so
        4.  
        5. sudo gpasswd -a zabbix docker
        6. sudo service zabbix-agent restart
    • dockbix-agent-xxl
      • zabbix-agent自体をコンテナとして動かす
    • zabbixユーザをdockerグループに追加する必要がある
      1. sudo gpasswd -a zabbix docker
      2. sudo service zabbix-agent restart
    • テンプレートは「Zabbix-Template-App-Docker.xml」が良い。「Zabbix-Template-App-Docker-active.xml」はZabbixキューが異常に貯まる。

docker監視の課題

  • 監視ホスト上で、dockerコンテナ毎にNICの作成/削除を繰り返すような場合、zabbixのNIC監視のディスカバリにより、アイテムとグラフが増え続ける
    • 暫定対応:該当ホスト > Discovery > Network interface discovery > StatusをクリックしてDisabledにする

取得不可のアイテムの通知


累計チェック: ホストグループを指定して値の集計


fluentd(td-agent)でログ監視連携

  • zabbix単体だと
    • log[] + 計算item: logを一度zabbixに取り込んで計算するのでホストが増えた場合のzabbixの負荷が気になる
    • userparameter内で処理: ワンライナーやシェルスクリプトで可能だが件数/レート/含む/除外等の条件が増えると複雑になる

PostgreSQLの監視


SSL証明書の有効期限の監視

  • 理解しやすくしたスクリプト
    1. #!/bin/bash
    2.  
    3. check_ssl_expire(){
    4. local endpoint=$1
    5. local port=${2:-"443"}
    6. local timeout_sec=${3:-"3"}
    7. local enddate=$(timeout $timeout_sec openssl s_client -showcerts -connect $endpoint:$port < /dev/null 2>&1 | openssl x509 -enddate 2>/dev/null | perl -ne 'if(/^notAfter=(.+)/){print "$1";}')
    8. echo $(( $(( $(date -d "$enddate" +%s) - $(date +%s) )) / 86400 ))
    9. }
    10.  
    11. check_ssl_expire "$@"

ansibleでzabbixの設定を行う


チャットに通知

  • filezabbix-slack-notify.zip 通知スクリプト。CentOS 5/6対応。
    • スクリプトを /etc/zabbix/alertscripts/ に配置
      1. sudo chmod 755 /etc/zabbix/alertscripts/*.sh
    • 管理 > メディアタイプ > 作成
      • 説明:slack
      • スクリプト名:slack-notify.sh
      • スクリプトパラメータ: Zabbix3.0以上
        1. {ALERT.SENDTO}
        2. {ALERT.SUBJECT}
        3. {ALERT.MESSAGE}
    • 設定 > ユーザ > ユーザ名 > メディアでslackを追加
    • 設定 > アクション > アクション名 > アクションの実行内容タブ > 次のメディアのみ使用: slackに設定
    • CentOS5.x: curl 7.15.5 --data-urlencode 非対応
      1. payload="{
      2. ...
      3. "
      4. curl -d "$payload" ...
    • CentOS6.x: curl 7.19.7
      1. payload="payload={
      2. ...
      3. "
      4. curl --data-urlencode "$payload" ...

ネットワーク疎通確認

  • Zabbix Server => Agent
    1. zabbix_get -s <Agent IP> -k agent.ping
    2. 1
    3.  
    4. tail -f /var/log/zabbix/zabbix_server.log
    5. # エラーが無いか確認
    6.  
    7. tail -f /var/log/zabbix/zabbix_proxy.log
    8. # proxyを使用している場合も同様
  • Zabbix Agent => Server(Proxy)
    1. nc -zv <Server IP> 10051
    2.  
    3. tail -f /var/log/zabbix/zabbix_agentd.log
    4. # エラーが無いか確認

zabbix-agentのuserparameterスクリプトでsudoを使えるようにする

  • CentOS 6.x, Ubuntu 12.x
    1. sudo sh -c 'echo "zabbix ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/zabbix'
    2. sudo chmod 0440 /etc/sudoers.d/zabbix

Zabbix2.0.xでLBでSSLアクセラレーションをしている場合にページャーが動作しない

  • CentOS6.x Zabbix 2.0.13 (EPEL) にパッチを当てる場合
    1. cd ~/
    2. sudo cp /usr/share/zabbix/include/func.inc.php /usr/share/zabbix/include/func.inc.php.2.0.13
    3. cp /usr/share/zabbix/include/func.inc.php ./
    4. wget https://support.zabbix.com/secure/attachment/20605/basename.patch
    5. sudo patch < basename.patch
    6. patching file: /usr/share/zabbix/include/func.inc.php
    7. sudo cp func.inc.php /usr/share/zabbix/include/
    8. sudo service httpd restart

DBのクリーンアップ

長期間使用しているとDBサイズが肥大化してくる。
特にmysqlのインデックスファイルが大きくなりがち。

  • 対策
    • Housekeeperを有効にし、古いデータを定期的にクリーニングさせる。ただし、deleteするだけでOSから見たファイルサイズは減らない。DBの内部で空きを使い回す
    • アイテムの監視間隔を長くする
    • アイテムの保存期間を短くする
    • テーブル分割(パーティショニング)する
    • mysqlテーブル毎に OPTIMIZE TABLEを実行する。MySQL 5.6未満でALTER TABLE中はロックがかかるためアクセスができない
    • ALTER TABLEする時に「ROW_FORMAT=Compressed」を付ける。圧縮され、半分程度のサイズになる。(/etc/my.cnfでinnodb_file_format=Barracuda の場合)
    • mysqlのダンプ > 再インポート
  • /etc/my.cnfに最低限以下の設定が必要
    1. innodb_file_per_table=1
    2. innodb_file_format=Barracuda
    • テーブル毎にファイルができていればOK
      1. ls -lh /var/lib/mysql/zabbix/
  • alter tableで肥大化は収まるがテーブルサイズが巨大だと時間がかかる
    1. alter table history ENGINE=INNODB;
    2. alter table history_uint ENGINE=INNODB;
    3. alter table trends ENGINE=INNODB;
    4. alter table trends_uint ENGINE=INNODB;
  • filezabbix_cleanup
    • ALTER TABLEするシェルスクリプト
    • ログは /var/log/messages に出る
    • ALTER TABLE前
      1. ll -lh /var/lib/mysql/zabbix/ | grep -P 'M|G'
      2. 合計 433M
      3. -rw-rw---- 1 mysql mysql  64M  115 16:59 history.ibd
      4. -rw-rw---- 1 mysql mysql 168M  115 16:59 history_uint.ibd
      5. -rw-rw---- 1 mysql mysql  44M  115 16:44 trends.ibd
      6. -rw-rw---- 1 mysql mysql  92M  115 16:45 trends_uint.ibd
    • ALTER TABLE後
      1. less /var/log/messages
      2. zabbix_cleanup: [INFO] ALTER TABLE completed. Table: trends, 33 seconds.
      3. zabbix_cleanup: [INFO] ALTER TABLE completed. Table: trends_uint, 72 seconds.
      4. zabbix_cleanup: [INFO] ALTER TABLE completed. Table: history, 18 seconds.
      5. zabbix_cleanup: [INFO] ALTER TABLE completed. Table: history_uint, 47 seconds.
      6.  
      7. ll -lh /var/lib/mysql/zabbix/ | grep -P 'M|G'
      8. 合計 361M
      9. -rw-rw---- 1 mysql mysql  56M  115 17:07 history.ibd
      10. -rw-rw---- 1 mysql mysql 124M  115 17:07 history_uint.ibd
      11. -rw-rw---- 1 mysql mysql  40M  115 17:02 trends.ibd
      12. -rw-rw---- 1 mysql mysql  76M  115 17:03 trends_uint.ibd
    • ALTER TABLE ROW_FORMAT=Compressed KEY_BLOCK_SIZE=8 後
      1. less /var/log/messages
      2. Jan 15 17:11:43 mistel zabbix_cleanup: [INFO] ALTER TABLE completed. Table: trends, 17 seconds.
      3. Jan 15 17:12:14 mistel zabbix_cleanup: [INFO] ALTER TABLE completed. Table: trends_uint, 31 seconds.
      4. Jan 15 17:13:17 mistel zabbix_cleanup: [INFO] ALTER TABLE completed. Table: history, 63 seconds.
      5. Jan 15 17:16:38 mistel zabbix_cleanup: [INFO] ALTER TABLE completed. Table: history_uint, 201 seconds.
      6.  
      7. ll -lh /var/lib/mysql/zabbix/ | grep -P 'M|G'
      8. 合計 220M
      9. -rw-rw---- 1 mysql mysql  31M  115 17:19 history.ibd
      10. -rw-rw---- 1 mysql mysql  64M  115 17:19 history_uint.ibd
      11. -rw-rw---- 1 mysql mysql  20M  115 17:11 trends.ibd
      12. -rw-rw---- 1 mysql mysql  40M  115 17:12 trends_uint.ibd

fluentd(td-agent)からメトリクスを登録


グラフの時刻を変更する

  • [おすすめ] httpdの設定を変更する
    1. vim /etc/httpd/conf.d/zabbix.conf
    2. ----
    3. php_value date.timezone Asia/Tokyo
    4. ----
    5. service httpd restart
  • phpの設定を変更する
    1. vim /etc/php.ini
    2. ----
    3. date.timezone = Asia/Tokyo
    4. ----
    5. service httpd restart

管理画面のパスワードをリセットする

  • 管理方法がユーザ、パスワード認証の場合
  • Adminユーザのパスワードをリセット
    1. # 空のパスワードを作成
    2. echo -n "" | md5sum
    3. d41d8cd98f00b204e9800998ecf8427e
    4.  
    5. # DBName, DBUser, DBPassword, DBHost を確認
    6. sudo less /etc/zabbix/zabbix_server.conf
    7.  
    8. # mysqlに接続
    9. mysql -u zabbix -p -h 127.0.0.1 zabbix
    10.  
    11. # ユーザの確認
    12. mysql> select alias from users;
    13.  
    14. # Adminユーザのパスワードを変更
    15. mysql> update users set passwd = 'd41d8cd98f00b204e9800998ecf8427e' where alias = 'Admin';

memcachedの監視

  • ncを使って uptimeを取得する場合
    1. echo -e "stats\nquit" | nc 127.0.0.1 11211 | grep 'STAT uptime' | cut -d' ' -f 3
    2. 1393

windows上でpowershellを実行する場合

windowsのコマンドプロンプトで以下のようにpowershellを許可しても、zabbix_getからだとエラーが出る

  1. powershell Set-ExecutionPolicy RemoteSigned
  • 解決方法
    • zabbix_agentd.userparams.confに書く時に"-ExecutionPolicy? ByPass?"を付ける
      1. UserParameter=example.test,powershell -ExecutionPolicy ByPass C:\zabbix\example.ps1 test

タイムアウト秒数変更

デフォルト3秒なので、実行に時間のかかるアイテムだとタイムアウトする。
server, agentそれぞれに設定がある。ログに出るのでチェック

  • zabbix server:/var/log/zabbix/zabbix_server.log
    1.   5011:20140816:164601.847 Zabbix agent item [hdd.smart.discovery] on host [win.example.com] failed: first network error, wait for 15 seconds
    2.   5014:20140816:164619.180 Zabbix agent item [hdd.smart.discovery] on host [win.example.com] failed: another network error, wait for 15 seconds
  • zabbix agent:/var/log/zabbix/zabbix_agentd.log
  • zabbix server側設定変更
    1. vim /etc/zabbix/zabbix_server.conf
    2. ----
    3. Timeout=10
    4. ----
    5. service zabbix-server restart
  • zabbix agent側設定変更
    1. vim /etc/zabbix/zabbix_agentd.conf
    2. ----
    3. Timeout=10
    4. ----
    5. service zabbix-agent restart

ユーザグループと権限

  • 権限はユーザグループに割り当てる
  • 1ユーザに複数のユーザグループを割り当て出来るが、read/writeのユーザグループとreadのユーザグループが重複した場合、readが優先される。そのため、read/writeのグループだけをユーザに割り当てる必要がある。

ローレベルディスカバリ LLD(low level discovery)

HDDやNIC等、1台のPCに同じ種類だが複数台搭載してある機器を自動で取得し、監視に追加できる。

  • 手順
  1. テンプレートに新規ディスカバリを作成。例:SMART discovery
    • 機器の変更ペースに会わせて、期間は長め3600秒程度が良いだろう
  2. UserParameter?.confに台数を取得し、JSONフォーマットで出力するスクリプトを追加
    • linuxならawkやperl等のワンライナーで書ける。
    • windowsはPowerShell?が楽。awk, perlはインストールの手間がちょっと面倒かも。
  3. UserParameter?.confに詳細情報を取得するスクリプトを追加
  4. エージェント側で値が取得できるかテスト。
    1. zabbix_agentd -t 'hdd.smart.discovery'
    2. zabbix_agentd -t 'hdd.smart[/dev/sda,Power_On_Hours]'
  5. テンプレートにディスカバリ用アイテム、トリガー、グラフ等を作成
    • 名前の最後に「on {#DEVICENAME}」等識別できる情報を追加すると良い
  6. しばらく待って情報が取得できれば成功

異常時にアラート音を出す


javaプロセスの監視

  • EPEL版にはzabbix-java-gatewayは無いので、Zabbix Official Repository を使ってインストールした方が良い。
  • 既にEPEL版を使っている場合は、zabbix公式リポジトリのSPECファイルを書き換えてビルド
  • 1ホスト内で複数javaプロセスをjmxで監視する場合の問題
    • 同じホストに同一キーは使えない(jmx[])
    • テンプレートにポートやインタフェースを定義できない
    • ホストに直接アイテムを追加すればインタフェースを変更できるが、同一キーの制限にひっかかる
    • 複数プロセスのJMX監視について | ZABBIX-JP

log型アイテムのグラフ化

log[]やlogrt[]は直接グラフ化できない。
そのため、ログ型アイテムの値を元に、計算型のアイテムを追加する

  • 元となるログ型のアイテム
    1. タイプ: Zabbixエージェント(アクティブ)
    2. キー: log[/var/log/messages,error|warning]
    3. データ型: ログ
    4. 更新間隔(): 60
  • 新しく追加する計算型アイテム(設定間違えているのか値がおかしい。1しか帰ってこない)
    • キーはホスト内でユニークな名前をつける。
    • 条件式ではサポートされているトリガー関数の関数が使える。ログの中身が数値だけであればlast()で計算できる。log[],logrt[]の場合はcount()
    • count("キー名",60) のように"..."で括る。キーに「"」が含まれる場合は、エスケープする「\"」
      1. タイプ: 計算
      2. キー: count_log[/var/log/messages,error|warning]
      3. : count("log[/var/log/messages,error|warning]",60)
      4. データ型: 数値(整数)
      5. 更新間隔(): 60

zabbix-proxy

  • 4 Zabbix プロキシ [Zabbix]
    • zabbix-serverの負荷軽減。分散監視。zabbix-serverとホストの距離が離れている場合、同じ場所にzabbix-proxyを構築する事で安定する。
    • zabbix-proxyがzabbix-agentのデータを保持しているため、zabbix-severのアップグレード時のデータ欠損を最小にできる。
  • 必要プロトコル/ポート
    • zabbix-server: TCP/10051 zabbix-proxyから送信
    • zabbix-proxy: TCP/10051 zabbix-agentから送信
    • zabbix-agent: TCP/10050 zabbix-proxyのアクティブチェックで使用
  • Zabbix Proxyの設定
  1. /etc/zabbix/zabbix_proxy.conf
    1. Server=<zabbix server ip>
    2. Hostname=zabbix30-proxy # zabbix-serverから名前で引けるようにDNSやhostsに設定する必要あり
    3. ConfigFrequency=300 # zabbix-serverと同期する間隔。デフォルトの1時間は長すぎる
    4. Timeout=3 # デフォルト3秒
    5. DBPassword=********
  • Zabbix Proxyホスト上のZabbix Agentの設定
  1. /etc/zabbix/zabbix_proxy.conf
    1. Server=192.168.1.10 # zabbix-proxyのprivate IP
    2. ListenIP=192.168.1.10 # zabbix-proxyのprivate IP。0.0.0.0としないのは、ホストの自動登録時にIPアドレスが必要なため。
    3. ServerActive=192.168.1.10 # zabbix-proxyのprivate IP
  • Zabbix Server側の設定
  1. 管理 > 分散管理 > プロキシの作成
    • プロキシ名: (/etc/zabbix/zabbix_proxy.confのHostnameの値) IPではうまくいかなかった。Zabbix Proxyとこの名前で疎通できる必要がある。
    • プロキシモード: アクティブ
  • ログ
    • /var/log/zabbix/zabbix_proxy.log

リモートコマンドでSupport for SSH scripts was not compiled on

コンパイル時に以下のオプションが必要

  1. --with-libssh2

アラートメールの破棄

  • ZabbixはDBにアラートメールの送信ステータスを持っているため、postfixを止めても送信される。DBを直接更新する必要があるようだ
  1. zabbix serverが使用してるメールサーバを停止する
    1. service postfix stop
  2. zabbix DBのアラート送信ステータスを"送信済み"に変更する。また、alertsテーブルに登録する処理は時間がかかるケースもあるため、しばらく放置して処理が終わるのを待った方が良い。
    1. echo "update alerts set status=1 where status=0;" | mysql -u zabbix -p zabbix
  3. メールサーバ再開
    1. service postfix start

Zabbix SererのMySQLパスワードの変更

以下手順で復帰後もアラートメールは送信されることは無かった

  1. zabbixサーバを対象にメンテナンス期間を作成
  2. 各サービス停止
    1. service httpd stop
    2. service zabbix-server stop
    3. service postfix stop
  3. MySQLパスワード変更
    1. mkpasswd -l 16 > .mysql-root
    2. mkpasswd -l 16 > .mysql-zabbix
    3. mysqladmin -u root -p password $(cat ~/.mysql-root)
    4. echo "SET PASSWORD FOR 'zabbix'@'localhost' = PASSWORD('$(cat ~/.mysql-zabbix)');" | mysql -u root -p$(cat ~/.mysql-root) mysql
  4. zabbix設定変更
    1. vim /etc/zabbix/zabbix_server.conf
    2. ----
    3. DBPassword=****
    4. ----
    5.  
    6. vim /etc/zabbix/web/zabbix.conf.php
    7. ----
    8. $DB['PASSWORD'] = '****';
    9. ----
  5. 各サービス再開
    1. service zabbix-server start
    2. service httpd start
    3. service postfix start

グラフ


Zabbix2.0のデフォルトテンプレートには無いMemoryグラフを追加

  1. 設定 > テンプレート > Template OS Linux > グラフ
  2. 右上からグラフの作成
    • 名前: Memory
    • 幅: 600
    • 高さ: 340
    • グラフのタイプ: ノーマル
    • 凡例を表示: チェック
    • トリガーを表示: チェック
    • Y軸の最大: Total memory
    • アイテム
      • Template OS Linux: Total memory, 平均, グラフ形式:面, 左, C80000
      • Template OS Linux: Available memory, 平均, グラフ形式:面, 左, 00C800

nginxのモニタリング


パフォーマンスチューニング

  • 管理 > キュー 右上の選択で:概要 で遅いキューが無いか確認
    • Itemのタイプが「Zabbixエージェント(アクティブ)」だとキューに貯まる場合があった。使用はlog[]等の必要最小限が良い。
  • Zabbixのグラフで「Zabbix data gathering process busy %」を見て、poller prcessの割合いが高い場合、増やす。
    1. vim /etc/zabbix/zabbix_server.conf
    2. ----
    3. # default:5 むやみに増やすと逆に遅くなるため注意。マニュアルには30以上にすべきではないとある
    4. StartPollers=10
    5. ----

SNMPで監視

  • Zabbix 2.0.x のテンプレートは複数あるが、以下だけ使えば良い。他はリンクされている
    • Template SNMP OS Linux : Linuxだと分かる場合
    • Template SNMP OS Windows : Windowsだとわかる場合
    • Template SNMP Device : その他SNMP搭載ハードウェア
  • SNMPデフォルトコミュニティ名: public
    • 管理 > 一般設定 > 右上の選択ボックスからマクロ > {$SNMP_COMMUNITY} : public
  • コミュニティ名を指定する
  1. 設定 > ホスト > 対象ホストを選択
  2. マクロタブを選択
    • {$SNMP_COMMUNITY} : public
  3. 保存
  • ルーターのIPアドレスを 192.168.1.1 とする場合
    1. sudo yum -y install net-snmp net-snmp-utils
    2. snmpwalk -v 1 -c public 192.168.1.1 > v1.txt
    3. snmpwalk -v 2c -c public 192.168.1.1 > v2.txt
    4. snmpwalk -v 3 -c public 192.168.1.1 > v3.txt

TCP/UDP

  • TCPコネクション TCP-MIB
    1. snmptranslate -Tp RFC1213-MIB::tcp
    2.  
    3. snmpwalk -v 1 -c public 192.168.1.1 RFC1213-MIB::tcp
    • TCPコネクション数
      RFC1213-MIB::tcpActiveOpens.0
      RFC1213-MIB::tcpPassiveOpens.0
      RFC1213-MIB::tcpAttemptFails.0
      RFC1213-MIB::tcpEstabResets.0
      RFC1213-MIB::tcpCurrEstab.0
  • UDPコネクション UDP-MIB
    1. snmptranslate -Tp RFC1213-MIB::udp
    2.  
    3. snmpwalk -v 1 -c public 192.168.1.1 RFC1213-MIB::udp

Windows

  • Windows Server 2008, Windows7
    • SNMP
    • Win7 Pro 64bitでSNMP監視を入れると各アプリケーションが数十秒応答なしになる場合があった(うちの場合だけかもしれないが)
  • Windows Server 2003 R2
    • [HOWTO] Windows Server 2003 で簡易ネットワーク管理プロトコル (SNMP) サービスを構成する方法
    • コントロール パネル > 管理ツール > コンピュータの管理
    • サービスとアプリケーション > サービス
    • 右ウィンドウのSNMP Service
      • 全般タブ: スタートアップの種類:自動、サービスの状態が開始になっていない場合は開始
      • トラップタブ: コミュニティ名: public > 一覧に追加
      • セキュリティタブ: checked: 認証トラップを送信する、受け付けるコミュニティ名: public, 読み取りのみ
      • セキュリティタブ: これらのホストからSNMPパケットを受け付ける: 192.168.1.100

Cisco


NETGEAR

  • NETGEAR RN10200 ReadyNAS OS 6.4.2: private MIBを表示。NAS本体のIPを192.168.1.10とする
    1. wget --no-check-certificate https://192.168.1.10/READYNASOS-MIB.txt
    2. sudo mv READYNASOS-MIB.txt /usr/share/snmp/mibs/
    3.  
    4. snmpwalk -v 2c -c public 192.168.1.10 READYNASOS-MIB::netgear
  • NETGEAR ReadyNAS 1xxx: private MIBを表示
    1. wget http://www.readynas.com/download/SNMP/READYNAS-MIB.txt
    2. sudo mv READYNAS-MIB.txt /usr/share/snmp/mibs/
    3.  
    4. snmpwalk -v 2c -c public 192.168.1.10 READYNAS-MIB::netgear
  • NETGEAR ReadyNAS 1xxx 例: 本体: 192.168.1.10, SNMPホスト: 192.168.1.100
    • https://192.168.1.10/admin/ > システム > 警告 > SNMPタブ
    • cheked: SNMPサービスを有効にする
    • コミュニティ: public
    • アクセスを許可するホスト: 192.168.1.100
    • 温度がMIBではINTEGERで定義されているが、実際はSTRING(10℃/)で返ってくるためそのままではzabbixには取り込めない
      1. snmpwalk -v 2c -c public 192.168.1.10 READYNAS-MIB::netgear
      2. ...
      3. READYNAS-MIB::temperatureValue.1 = Wrong Type (should be INTEGER): STRING: "51.0C/123.8F"

BUFFALO

  • 記事
  • BS-xxxxx 法人向けスイッチ 例: 本体: 192.168.1.10, SNMPホスト: 192.168.1.100
    • http://192.168.1.10/ > 基本設定 > SNMP設定
    • SNMPコミュニティテーブル: Public, GET, SET, TRAP
    • SNMPホストテーブル:
      • ホスト認証: 有効
      • earth, 192.168.1.100, public
    • SNMPトラップイベント: Community認証: 有効

YAMAHA

  • RTX1x00(ルーター) 例: 本体: 192.168.1.1, SNMPホスト: 192.168.1.100
    • http://192.168.1.1/admin/ > 運用サポート機能 > 保守 > コマンドの入力
      1. snmp host 192.168.1.100 public
      2. snmpv2c host 192.168.1.100 public
      3. snmp yrifppdisplayatmib2 on
  • private MIBを表示
    1. wget http://www.rtpro.yamaha.co.jp/RT/docs/mib/yamaha-private-mib.tar.gz
    2. tar xvfz yamaha-private-mib.tar.gz
    3. sudo mv yamaha-*.txt /usr/share/snmp/mibs/
    4.  
    5. snmpwalk -v 2c -c public 192.168.1.1 YAMAHA-SMI::yamahaRT

SNMPツール

  • CentOS6.x
    • インストール
      1. yum install net-snmp net-snmp-utils
    • MIBファイル: /usr/share/snmp/mibs/
  • OID to Name
    1. snmptranslate .1.3.6.1.2.1.1.5.0
    2.  
    3. SNMPv2-MIB::sysName.0
  • Name to OID
    1. snmptranslate -On SNMPv2-MIB::sysName.0
    2.  
    3. .1.3.6.1.2.1.1.5.0
  • MIBツリーの表示。[OID|Name]を省略すると全体を表示
    1. snmptranslate -Tp [OID|Name]
    2.  
    3. snmptranslate -Tp SNMPv2-MIB::system
    4. +--system(1)
    5.    |
    6.    +-- -R-- String    sysDescr(1)
    7.    |        Textual Convention: DisplayString
    8.    |        Size: 0..255
    9. ...
  • 各ベンダのprivate MIBファイルを指定
    • 個別指定オプション '-m'
      1. mkdir ~/.snmp
      2. echo -e "mibdirs /usr/share/snmp/mibs\nmibs all" > ~/.snmp/snmp.conf
      3.  
      4. # 例yamahaルーターのprivate MIB
      5. wget http://www.rtpro.yamaha.co.jp/RT/docs/mib/yamaha-private-mib.tar.gz
      6. tar xvfz yamaha-private-mib.tar.gz
      7. sudo mv yamaha-*.txt /usr/share/snmp/mibs/
      8.  
      9. # OID to Name
      10. snmptranslate .1.3.6.1.4.1.1182.2.1.6.0
      11. YAMAHA-RT-HARDWARE::yrhCpuUtil1min.0
      12.  
      13. # private MIBツリー
      14. snmptranslate -Tp YAMAHA-SMI::yamahaRT
      15. +--yamahaRT(2)
      16.    |
      17.    +--yamahaRTHardware(1)
      18.    |  |
      19.    |  +--yamahaRTHardware#(0)
      20.    |  |  |
      21.    |  |  +--yrhMemoryUtilTrap(1)
      22.    |  |  |
      23.    |  |  +--yrhCpuUtilTrap(2)
      24.    |  |  |
      25.    |  |  +--yrhSystemAlarmTrap(3)
      26.    |  |
      27.    |  +-- -R-- EnumVal   yrhCpuType(1)
      28.    |  |        Values: i386(1), i486(2), pentium(3), sh3(4), msp2000(5), ixp1200(6), ad6846(7), msp2100(8), powerQuick3(9), ixp422(10), cn5010(12), c1000(13), qorIQP2(14)
      29. ...
      30.  
      31. # 特定の値だけ取得 例: yrhCpuType
      32. snmpwalk -v 2c -c public 192.168.1.1 YAMAHA-SMI::yamahaRT.yamahaRTHardware.yrhCpuType                                                                  
      33. YAMAHA-RT-HARDWARE::yrhCpuType.0 = INTEGER: cn5010(12)

HTTP,HTTPSのWeb監視

Zabbix標準機能として用意されているので簡単。トップページから認証画面を通じるシナリオも作れる。

  • アイテムとして取得可能なもの
    • 応答時間
    • ダウンロード速度(1秒あたり)
    • 応答コード
    • 失敗したステップ(0:正常)
  • ドキュメント
    • 8. Web監視 [Zabbix Documentation 2.2]
    • Zabbix2.2からaccess_tokenを取る機能が追加されている
    • Zabbix3.0からweb監視のテンプレート化ができるようになった。しかし、インポート/エクスポートはZabbix3.4から。
    • HEADだけ取得も可能。その場合はスピードグラフは出なくなる。
  • zabbixにログインできるかチェック
  1. 設定 > ウェブ : グループとホストを選択 > シナリオの作成
    • アプリケーション: zabbix server
    • 名前: Zabbix GUI
    • 認証: なし
    • 更新間隔: 300
    • エージェント: 適当
    • 変数:
      1. {user}=user
      2. {password}=password
  2. ステップタブ > 追加
  3. ステップタブ > 追加 Zabbix3.0ではURL変わったため不要
  4. アイテムを追加すると、モニタリング > 最新データで値が見える
  5. トリガーを作成する場合
    • 名前: zabbix login failed on {HOST.NAME}
    • 条件: 連続3回以上あったらアラート発生(ステップの成功:0)
      1. {localhost:web.test.fail[localhost zabbix GUI].count(#3,0,gt)}>2
    • 深刻度: 適切に
  • ログインページにハッシュ等の文字列が入っており、1回でログインできない場合、2ステップに分ける。
  1. ログインページ取得
  2. ユーザID、パスワードを入力

web監視のアイテム/トリガー

  • 指定のシナリオ、ステップのhttp statusが5xxだったらトリガー発生
    1. {Template name:web.test.rspcode[シナリオ名,ステップ名].count(#3,499,gt)}>2

web監視で「error: error doing curl_easy_perform: Problem with the SSL CA cert」

  • /var/log/zabbix/zabbix_server.log に以下のログが出る場合。
    1. error: error doing curl_easy_perform: Problem with the SSL CA cert (path? access rights?)
  • /etc/pki/tls/certs/ca-bundle.crt が古いと発生するようだ。
    1. sudo yum update ca-certificates
    2. sudo service zabbix-agent restart

Zabbix2.0で「zabbixサーバが動作していません」

ダッシュボードで「zabbixサーバが動作していません」が出続け、「Zabbixサーバーの起動: いいえ」の場合。

  • zabbix-serverが起動していない場合、起動する
    1. service zabbix-server restart
    2. service zabbix-server status
  • 明示的にzabbix serverのIPを指定する
    1. sudo vim /etc/zabbix/web/zabbix.conf.php
    2. ----
    3. $ZBX_SERVER      = '192.168.1.5';
    4. ----
    5. sudo service httpd restart
  • SELinuxを無効
    1. # 確認 DisabledならOK
    2. getenforce
    3. Disabled
    4.  
    5. # 無効にする
    6. vim /etc/sysconfig/selinux
    7. ----
    8. SELINUX=disabled
    9. ----
    10. reboot

認証方法を変えてログインできなくなった時、元に戻す

  • zabbix 2.0.6
  • 管理 > 認証 > Internalに戻す場合。(internal:0, LDAP:1)
    1. echo "update config set authentication_type=0;" | mysql -u zabbix -p zabbix

ログ中に指定文字列を含む監視設定

  • zabbix 2.0.6
  • 監視したいログファイルに zabbix ユーザで読み取り可能な権限がある事
  • ステータスが変化する時にメールが送信される。nodata()=0 条件を加え、指定時間経過後にステータスを変化させる
    • 正規表現(例:error|warning)とした場合、nodata(10m)=0としても、"error","warning"が記録された時点でnodata()の条件に一致するため、10分待たずにトリガーが正常に戻る
  • 例: /var/log/messages を1分間隔で監視。"error","warning" が発生したらトリガーとする。その後10分間データがなければ解除
    • zabbix agent側
      1. sudo gpasswd -a zabbix wheel
      2. sudo chown :wheel /var/log/messages
      3. sudo chmod 640 /var/log/messages
      4. sudo service zabbix-agent restart
    • zabbix server アイテム設定
      1. タイプ: Zabbixエージェント(アクティブ)
      2. キー: log[/var/log/messages,error|warning]
      3. データ型: ログ
      4. 更新間隔(): 60
    • zabbix server トリガー設定
      1. 条件式: ({host1:log[/var/log/messages,error|warning].iregexp(error|warning)}=1)
      2. &({host1:log[/var/log/messages,error|warning].nodata(600)}=0)
      3. 障害イベントを継続して生成: 未チェック
      4. 深刻度: 警告 (適切に)
    • テスト
      1. logger error
      2. logger warning
  • 指定文字列を除外する場合。例:"test","debug"が入ってる場合は除外する
    1. 条件式: ({host1:log[/var/log/messages,error|warning].iregexp(error|warning)}=1)
    2. &({host1:log[/var/log/messages,error|warning].iregexp(test|debug)}=0)
    3. &({host1:log[/var/log/messages,error|warning].nodata(600)}=0)
  • 発生回数を考慮する場合: 1時間に5回以上errorが出た時
    1. 条件式: ({host1:log[/var/log/messages,error|warning].count(1h,"error","like")}>4)
    2. &({host1:log[/var/log/messages,error].nodata(600)}=0)

discoveryグラフが表示されない場合

1.8から2.0へアップグレードした場合、discoveryグラフが表示されないので調べた。

  • 管理 > 一般設定 > 正規表現 に以下が設定されているか? 1.8 から2.0へのアップグレードだと手動設定の必要があった
    • 名前 File systems for discovery
      テスト文字列 ext3
      
      条件式                                                                          期待値      大文字小文字を区別
      ^(btrfs|ext2|ext3|ext4|jfs|reiser|xfs|ffs|ufs|jfs|jfs2|vxfs|hfs|ntfs|fat32)$    結果が真    いいえ
    • 名前 Network interfaces for discovery
      テスト文字列 eth0
      
      条件式                          期待値    大文字小文字を区別
      ^lo$                            結果が偽    はい
      ^Software Loopback Interface    結果が偽    はい
    • 名前 Storage devices for SNMP discovery
      テスト文字列 /boot
      
      条件式                                                                        期待値      大文字小文字を区別    変更
      ^(Physical memory|Virtual memory|Memory buffers|Cached memory|Swap space)$    結果が偽    はい
  • ホストのテンプレートチェック
    • Template OS Linuxがリンクされ、ディスカバリに"Mounted filesystem discovery"が設定されており、有効になっているか?無効ならクリックして有効に変える
  • zabbix server上で値が取得できているかチェック
    1. zabbix_get -s localhost -k vfs.fs.discovery
    2.  
    3. {
    4.         "data":[
    5.                 {
    6.                         "{#FSNAME}":"\/",
    7.                         "{#FSTYPE}":"rootfs"},
    8. ...
  • zabbix サーバログにエラーが出ていないかチェック
    • /var/log/zabbix/zabbix_server.log

日本語環境でグラフの文字化けを修正

zabbix 2.0.6 で プロファイルから言語を日本語(ja_JP)にしているとグラフの文字化けが起きるので修正。

zabbix-2.x-mojibake-befor.jpg

  • 環境
    • CentOS 5.8 x86_64 / CentOS 6.3 x86_64
    • PHP 5.4.17 / php 5.3.3
    • Zabbix 2.0.6 (yumでインストール)
  • 日本語フォントの検索
    1. yum search ipafont
    2. ipa-gothic-fonts.noarch : Japanese Gothic-typeface OpenType font by IPA
    3. ipa-mincho-fonts.noarch : Japanese Mincho-typeface OpenType font by IPA
    4. ipa-pgothic-fonts.noarch : Japanese Proportional Gothic-typeface OpenType font by IPA
    5. ipa-pmincho-fonts.noarch : Japanese Proportional Mincho-typeface OpenType font by IPA
  • IPAフォント
    1. yum -y install ipa-pgothic-fonts.noarch
    2.  
    3. ls -lh /usr/share/fonts/ipa-pgothic/
    4. total 6.0M
    5. -rw-r--r-- 1 root root 6.0M Nov 11  2009 ipagp.ttf
  • CentOS 6.xの場合、defines.inc.php中のZBX_FONTPATHを変更するとグラフ横軸の時刻が表示されなくなるため、シンボリックリンクで対応
    1. ln -s /usr/share/fonts/ipa-pgothic/ipagp.ttf /usr/share/fonts/dejavu/ipagp.ttf

zabbix2.0-centos6.3-graph-bug.jpg

  • zabbix側の設定変更
    1. vim /usr/share/zabbix/include/defines.inc.php
    2. ----
    3. // CentOS6.x
    4. define('ZBX_FONTPATH',                  '/usr/share/fonts/dejavu');
    5. define('ZBX_GRAPH_FONT_NAME',           'ipagp'); // default: DejaVuSans
    6.  
    7. // CentOS5.x
    8. define('ZBX_FONTPATH',                  '/usr/share/fonts/ipa-pgothic'); // default: /usr/share/fonts/dejavu
    9. define('ZBX_GRAPH_FONT_NAME',           'ipagp'); // default: DejaVuSans
    10. ----
  • グラフの再描画で修正を確認できます

zabbix-2.x-mojibake-after.jpg


userparameter:ユーザパラメータで任意の項目を監視

zabbix agent側の設定ファイルに追加する事で、任意のコマンドを実行して値を取得できる。

  • ファイルの存在を初めにチェックした方が良い。ファイルが存在しない場合はアイテムが「取得不可」になり、DBの使用量やモニタリング対象のアイテムが減る。特に監視間隔が短いアイテムだと影響が大きい
    1. # log.count[<file path>,<last lines>,<include>]
    2. UserParameter=log.count[*],[ -f "$1" ] && tail -n "$2" "$1" | grep "$3" -c
  • 一度取得不可になったアイテムも、zabbix_serverが数分後にポーリングするようで、その時に取得可能になれば復活する。よって失敗の場合は空白("")、成功の場合は値を返せば良さそうだ。
  • デフォルトではzabbix ユーザで実行されるため、permissionがあるものに限られる。もしくはzabbixユーザをグループに追加したり、sudoを使えるように設定する
  • agent自体をrootユーザで実行したい場合
    1. vim /etc/zabbix/zabbix_agentd.conf
    2. ----
    3. AllowRoot=1
    4. ----
  • コマンド1行で指定出来るものは単体で実行可能
    1. vim /etc/zabbix/zabbix_agentd.d/userparameter_example_monitor.conf
    2. ----
    3. UserParameter=key,command
    4. ----
    5.  
    6. # テスト
    7. sudo -u zabbix zabbix_agentd -t "key"
  • パラメータ"*"を指定できる。それぞれ$1, $2として取得可能
    1. UserParameter=wc[*],cat $1 | wc -l
    2.  
    3. # テスト
    4. sudo -u zabbix zabbix_agentd -t "wc[/tmp/test]"
  • 複数行になるような複雑なコマンドは別スクリプトに書いて、指定
  • awk等コマンド内で'$'を使う場合は、エスケープ('$$' または '$ 1')が必要。ただし、パラメータを受け取る必要が無い(UserParameter?=command)場合は不要
    1. UserParameter=sum[*],cat $1 | awk '{sum+=$$1} END {print sum}'
    2.  
    3. # テスト
    4. sudo -u zabbix zabbix_agentd -t "sum[/tmp/test]"
  • awk等コマンド内で任意のパラメータ番号を指定する場合は '$$$1' のように書く
    1. echo "100 200 300" > /tmp/test
    2.  
    3. UserParameter=test[*],cat /tmp/test | awk '{print $$$1}'
    4.  
    5. # テスト
    6. sudo -u zabbix zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf -t 'test[2]'
    7. ...
    8. [t|200]

NTPのoffset/delay等を取得

  • 時刻のずれを検出するのに fuzzytime()関数もあり、Template OS Linux にトリガーを追加するだけで利用できる。
    • 名前: Local time is not in sync on {HOST.NAME}
    • 条件式: {Template OS Linux:system.localtime.fuzzytime(300)}=0
    • 深刻度: 重度の障害
  • ntpqを使う
  • 同期済みサーバ(*)マークのついたntp行から取得する
  • /etc/zabbix/zabbix_agentd.d/userparameter_example.conf
    1. # NTP: ntp[<host>,<column number>]
    2. UserParameter=ntp[*],ntpq -pn $1 | grep -P '^\*' | awk '{print $$$2}'
  • 実行例
    1. ntpq -pn 127.0.0.1
    2.      remote           refid      st t when poll reach   delay   offset  jitter
    3. ==============================================================================
    4. *133.243.238.164 .NICT.           1 u  178 1024  377    4.835   29.296   6.560
    5. +210.173.160.57  172.29.1.50      2 u  191 1024  377    2.600   28.339   6.392
    6.  133.243.237.36  .INIT.          16 u    - 1024    0    0.000    0.000   0.000
    7.  
    8. # delay取得
    9. zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf -t 'ntp[127.0.0.1,8]'
    10. ntp[ntpq -pn 127.0.0.1 | grep -P '^\*' | awk '{print $8}'] [t|4.835]
    11.  
    12. # offset取得
    13. zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf -t 'ntp[127.0.0.1,9]'
    14. ntp[ntpq -pn 127.0.0.1 | grep -P '^\*' | awk '{print $9}'] [t|29.296]

HDDのS.M.A.R.T.情報を取得


  • Linuxの場合
  • smartctlを監視対象のHDDのホストにインストール
    • CentOS
      1. sudo yum install smartmontools
      2.  
      3. sudo /usr/sbin/smartctl -A /dev/sda
    • Ubuntu
      1. sudo aptitude install smartmontools
      2.  
      3. sudo /usr/sbin/smartctl -A /dev/sda
  • smartctlはroot権限が必要なコマンドなので、zabbixユーザから実行できるように設定
    1. sudo /usr/sbin/visudo
    2. ----
    3. Defaults !requiretty
    4. ----
    5.  
    6. zabbix ALL=(ALL) NOPASSWD: /usr/sbin/smartctl
  • /etc/zabbix/zabbix_agentd.d/userparameter_app_smart.conf
    1. # SMART HDD Monitoring discovery. Parameter: hdd.smart.discovery
    2. UserParameter=hdd.smart.discovery,sudo smartctl --scan | awk 'BEGIN {f=1;print "{\"data\":["} {if(!f){print ","};f=0;gsub(/\//,"\\/",$1);print "{ \"{#DEVICENAME}\":\""$1"\",\"{#DEVICETYPE}\":\""$3"\" }"} END {print "]}"}'
    3.  
    4. # SMART HDD Monitoring. Parameter: hdd.smart[<device name>,<smartctl attribute name>]
    5. UserParameter=hdd.smart[*],sudo smartctl -A $1 | awk '{if($$2 == "$2") print $$10;}'

  • Windowsの場合
  1. S.M.A.R.T. Monitoring Tools から smartmontools-6.2-1.win32-setup.exe をダウンロードしてインストール
  2. 試しに手動で実行して、情報を取得できるかテスト
    1. "C:\Program Files\smartmontools\bin\smartctl" --scan
    2. /dev/sda -d ata # /dev/sda, ATA device
    3. /dev/sdb -d ata # /dev/sdb, ATA device
    4.  
    5. "C:\Program Files\smartmontools\bin\smartctl.exe" -A /dev/sda
  3. PowerShell?が実行できるようにコマンドプロンプト(cmd.exe)から許可する
    1. powershell Set-ExecutionPolicy RemoteSigned
  4. C:\zabbix\smart-win.ps1 を配置
  5. 取得(特に--scan)に時間がかかるのでzabbix agentdのタイムアウトを延長
    • C:\zabbix\zabbix_agentd.conf
      1. Timeout=10
      2. Include=c:\zabbix\zabbix_agentd.userparams.conf
    • C:\zabbix\zabbix_agentd.userparams.conf
      1. # SMART HDD Monitoring discovery. Parameter: hdd.smart.discovery
      2. UserParameter=hdd.smart.discovery,powershell -ExecutionPolicy ByPass C:\zabbix\smart-win.ps1 discovery
      3.  
      4. # SMART HDD Monitoring. Parameter: hdd.smart[<device name>,<smartctl attribute name>]
      5. UserParameter=hdd.smart[*],powershell -ExecutionPolicy ByPass C:\zabbix\smart-win.ps1 get $1 $2
  6. zabbix agentd再起動
    1. zabbix_agentd.exe --config C:\zabbix\zabbix_agentd.conf --stop
    2. zabbix_agentd.exe --config C:\zabbix\zabbix_agentd.conf --start

プロセスの経過時間を取得

  • 同じ条件に複数プロセスがある場合、初めの1つめの値を取得する。よって、一つに絞り込むように条件を指定する
  • プロセス名は15文字までを指定する。
  • プロセス名、ユーザ名だけで絞りきれない場合、<cmdline>にコマンド実行時の引数等を指定して絞り込む
  • /etc/zabbix/zabbix_agentd.d/userparameter_e .mysql-zabbix mysqladmin -u root -p password $(cat ~/.mysql-root) echo xample.conf
    1. # elapsed time by process. Parameter: process.etime[<process name>,<user>,<cmdline>]
    2. UserParameter=process.etime[*],ps -eo comm,user:32,etime,args h | grep -P "^$1\s+$2" | grep -P "$3" | head -n 1 | perl -ane '@t=reverse split(/[:-]/,$F[2]); $s=$t[0]+$t[1]*60+$t[2]*3600+$t[3]*86400; print $s;'
  • 例: hogeユーザでcronで動作する「example.sh param1 param2」の実行時間を取得
  • zabbixアイテム
    • 名前: Elapsed time by process
    • タイプ: Zabbixエージェント
    • キー: process.etime[example.sh,hoge,param1]
    • データ形式: 10進数
    • 単位: s

nginxのアクセスログから指定HTTP Status Codeの件数

  • /etc/zabbix/zabbix_agentd.d/userparameter_example.conf
    1. # nginx.log.status.count[<file path>,<last lines>,<http status code>,<include>,<exclude>]
    2. UserParameter=nginx.log.status.count[*],[ -f "$1" ] && tail -n "$2" "$1" | grep -v "$5" | grep "$4" | grep "$(LANG=C date '+%d/%b/%Y:%H:%M' -d '1 min ago')" | awk -F' ' '{print $$9}' | grep -P "$3\d+" | wc -l
  • Zabbix Item: 更新間隔(秒): 60
    • 1分間の総件数: nginx.log.status.count[/var/log/nginx/access.log,10000,,,DUMMY]
    • 1分間のHTTP Status 5XX、/index.htmlを含む、testを除外した件数: nginx.log.status.count[/var/log/nginx/access.log,10000,5,/index.html,test]

プロセス毎のRSS(物理メモリ使用量)

  1. # Real memory(KB) by process. Parameter: process.rss[<process name>,<user>]
  2. UserParameter=process.rss[*],ps -eo comm,user,rss h | grep -P "$1\s+$2\s+" | awk 'BEGIN {sum=0} {sum+=$$3} END {print sum}'
  3.  
  4. # テスト
  5. sudo -u zabbix zabbix_agentd -t "process.rss[httpd,apache]"

プロセス毎の%CPU

  • topを使う。topで長いユーザ名だと省略されるのでtop -uオプションで指定している。
    1. # %CPU by process. Parameter: process.pcpu[<process name>,<user>]
    2. UserParameter=process.pcpu[*],top -b -d1 -n1 -u "$2" 2>/dev/null | perl -ne 'BEGIN { $sum=0; } if($. > 7) { $_ =~ s/^\s+//g; @l=split(/\s+/, $_); if($l[11] =~ m#$1#){ $sum+=$l[8]; } } END { print $sum; }'
    3.  
    4. # テスト
    5. sudo -u zabbix zabbix_agentd -t "process.pcpu[httpd,apache]"
  • psを使う。※デュアルコア以上だと値が異常
    1. # %CPU by process. Parameter: process.pcpu[<process name>,<user>]
    2. UserParameter=process.pcpu[*],ps -eo comm,user,pcpu h | grep -P "$1\s+$2" | awk '{sum+=$$3} END {print sum}'

パスワードの初期化

  • User: Admin , Password: なし に初期化
    1. echo "update users set passwd = 'd41d8cd98f00b204e9800998ecf8427e' where alias = 'Admin';" | mysql -u root zabbix

LDAP認証

  1. sudo yum install php-ldap openldap-clients
  • Zabbix 2.0 > 管理 > 認証
    • デフォルトの認証: LDAP
    • LDAPホスト: ldaps://ldap.example.com:636
    • ポート: 0
    • Base DN: ou=users,dc=example,dc=com
    • 検索の属性: uid
    • Bind DN: cn=connector,ou=administration,dc=example,dc=com
    • Bind Password: ****
  • LDAP認証に失敗する場合のチェックポイント
    • ldapコマンドで接続できるか確認
      1. ldapsearch -x -b 'dc=my-domain,dc=com' '(uid=hoge)' \
      2.   -H ldaps://localhost:636 \
      3.   -D "cn=Manager,dc=my-domain,dc=com" \
      4.   -W
    • phpでldap, ldapsをサポートしているか確認
      1. php -i | grep -i ldap
    • Zabbix 2.0.13で「ldap_bind(): Unable to bind to server: Can't contact LDAP server...」
      • 標準ポートではない時は、ホスト側にポートを指定(ldaps://ldap.example.com:636)し、ポート(0)にすると接続できた。

日本語入力の文字化けの解消

障害対応のコメント等で日本語を入力すると"?"に化けてしまう場合、インストール時にDBの文字コードの設定が"latin1"になっているので"utf8"に変更する

  • MySQL 5.1のデフォルト文字コードを変更
    1. vim /etc/my.cnf
    2. ----
    3. [mysqld]
    4. skip-character-set-client-handshake
    5. character-set-server=utf8
    6. # init-connect="SET NAMES utf8"
    7. default-table-type=InnoDB
    8.  
    9. [mysql]
    10. default-character-set=utf8
    11.  
    12. [client]
    13. default-character-set=utf8
    14.  
    15. [mysqldump]
    16. default-character-set=utf8
    17. ----
    18. service mysqld restart
  • zabbix mysqlの文字コードをutf8に変更
    1. cat > zabbix-modify-mysql-charset-utf8.sql << EOS
    2. alter database zabbix default character set utf8;
    3. alter table zabbix.acknowledges charset=utf8;
    4. alter table zabbix.actions charset=utf8;
    5. alter table zabbix.alerts charset=utf8;
    6. alter table zabbix.applications charset=utf8;
    7. alter table zabbix.auditlog charset=utf8;
    8. alter table zabbix.auditlog_details charset=utf8;
    9. alter table zabbix.autoreg_host charset=utf8;
    10. alter table zabbix.conditions charset=utf8;
    11. alter table zabbix.config charset=utf8;
    12. alter table zabbix.dchecks charset=utf8;
    13. alter table zabbix.dhosts charset=utf8;
    14. alter table zabbix.drules charset=utf8;
    15. alter table zabbix.dservices charset=utf8;
    16. alter table zabbix.escalations charset=utf8;
    17. alter table zabbix.events charset=utf8;
    18. alter table zabbix.expressions charset=utf8;
    19. alter table zabbix.functions charset=utf8;
    20. alter table zabbix.globalmacro charset=utf8;
    21. alter table zabbix.graph_theme charset=utf8;
    22. alter table zabbix.graphs charset=utf8;
    23. alter table zabbix.graphs_items charset=utf8;
    24. alter table zabbix.groups charset=utf8;
    25. alter table zabbix.help_items charset=utf8;
    26. alter table zabbix.history charset=utf8;
    27. alter table zabbix.history_log charset=utf8;
    28. alter table zabbix.history_str charset=utf8;
    29. alter table zabbix.history_str_sync charset=utf8;
    30. alter table zabbix.history_sync charset=utf8;
    31. alter table zabbix.history_text charset=utf8;
    32. alter table zabbix.history_uint charset=utf8;
    33. alter table zabbix.history_uint_sync charset=utf8;
    34. alter table zabbix.hostmacro charset=utf8;
    35. alter table zabbix.hosts charset=utf8;
    36. alter table zabbix.hosts_groups charset=utf8;
    37. alter table zabbix.hosts_profiles charset=utf8;
    38. alter table zabbix.hosts_profiles_ext charset=utf8;
    39. alter table zabbix.hosts_templates charset=utf8;
    40. alter table zabbix.housekeeper charset=utf8;
    41. alter table zabbix.httpstep charset=utf8;
    42. alter table zabbix.httpstepitem charset=utf8;
    43. alter table zabbix.httptest charset=utf8;
    44. alter table zabbix.httptestitem charset=utf8;
    45. alter table zabbix.ids charset=utf8;
    46. alter table zabbix.images charset=utf8;
    47. alter table zabbix.items charset=utf8;
    48. alter table zabbix.items_applications charset=utf8;
    49. alter table zabbix.maintenances charset=utf8;
    50. alter table zabbix.maintenances_groups charset=utf8;
    51. alter table zabbix.maintenances_hosts charset=utf8;
    52. alter table zabbix.maintenances_windows charset=utf8;
    53. alter table zabbix.mappings charset=utf8;
    54. alter table zabbix.media charset=utf8;
    55. alter table zabbix.media_type charset=utf8;
    56. alter table zabbix.node_cksum charset=utf8;
    57. alter table zabbix.nodes charset=utf8;
    58. alter table zabbix.opconditions charset=utf8;
    59. alter table zabbix.operations charset=utf8;
    60. alter table zabbix.opmediatypes charset=utf8;
    61. alter table zabbix.profiles charset=utf8;
    62. alter table zabbix.proxy_autoreg_host charset=utf8;
    63. alter table zabbix.proxy_dhistory charset=utf8;
    64. alter table zabbix.proxy_history charset=utf8;
    65. alter table zabbix.regexps charset=utf8;
    66. alter table zabbix.rights charset=utf8;
    67. alter table zabbix.screens charset=utf8;
    68. alter table zabbix.screens_items charset=utf8;
    69. alter table zabbix.scripts charset=utf8;
    70. alter table zabbix.service_alarms charset=utf8;
    71. alter table zabbix.services charset=utf8;
    72. alter table zabbix.services_links charset=utf8;
    73. alter table zabbix.services_times charset=utf8;
    74. alter table zabbix.sessions charset=utf8;
    75. alter table zabbix.slides charset=utf8;
    76. alter table zabbix.slideshows charset=utf8;
    77. alter table zabbix.sysmaps charset=utf8;
    78. alter table zabbix.sysmaps_elements charset=utf8;
    79. alter table zabbix.sysmaps_link_triggers charset=utf8;
    80. alter table zabbix.sysmaps_links charset=utf8;
    81. alter table zabbix.timeperiods charset=utf8;
    82. alter table zabbix.trends charset=utf8;
    83. alter table zabbix.trends_uint charset=utf8;
    84. alter table zabbix.trigger_depends charset=utf8;
    85. alter table zabbix.triggers charset=utf8;
    86. alter table zabbix.user_history charset=utf8;
    87. alter table zabbix.users charset=utf8;
    88. alter table zabbix.users_groups charset=utf8;
    89. alter table zabbix.usrgrp charset=utf8;
    90. alter table zabbix.valuemaps charset=utf8;
    91. EOS
    92. cat zabbix-modify-mysql-charset-utf8.sql | mysql -u root zabbix
    93.  
    94. # 確認
    95. echo "show variables like 'character_set_%';" | mysql -u root zabbix
    96. Variable_name   Value
    97. character_set_client    utf8
    98. character_set_connection        utf8
    99. character_set_database  utf8
    100. character_set_filesystem        binary
    101. character_set_results   utf8
    102. character_set_server    utf8
    103. character_set_system    utf8
    104.  
    105. echo "show create table zabbix.valuemaps;" | mysql -u root zabbix
    106. Table   Create Table
    107. valuemaps       CREATE TABLE `valuemaps` (\n  `valuemapid` bigint(20) unsigned NOT NULL DEFAULT '0',\n  `name` varchar(64) CHARACTER SET latin1 NOT NULL DEFAULT '',\n  PRIMARY KEY (`valuemapid`),\n  KEY `valuemaps_1` (`name`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8

マクロ

使える箇所と使えない箇所がある。またバージョンによっても異なる

  • マクロ使える
    • Zabbix Agent
  • マクロ使えない
    • Zabbix Trapper

アイテム

監視対象を設定する

  • 例:java tomcatプロセスのメモリ使用量(VSZ:仮想メモリ)。javaはプロセス名が同じで、ユーザやパラメータが異なるのでそれを指定する。
    1. proc.mem[java,user1]
  • 例:httpdプロセスのメモリ使用量(VSZ:仮想メモリ), RSS:物理メモリ はv1.8のアイテムでは取れないようだ
    1. proc.mem[httpd]
  • 例:httpdプロセスの数
    1. proc.num[httpd]
  • 例:rubyで動いているtd-agent(fluentd), puppet
    1. zabbix_agentd -t 'proc.num[ruby,,,td-agent]'
    2. proc.num[ruby,,,td-agent]                     [u|2]
    3.  
    4. # td-agentが停止している場合に0を返して欲しい時、以下はNOT_SUPPORTEDになり値が取れない。
    5. zabbix_agentd -t 'proc.num[ruby,td-agent]'

テンプレートを変更した場合

  • キーがテンプレート変更前と同じなら、テンプレートを変更しても、データは引き継がれる。同一ホストに同じキーが存在するとエラーになる。
    • 例:"Template test1"をホストから削除、"Template test2"を追加した場合、データは引き継がれる
    • Template test1
      • Key: system.uptime
    • Template test2
      • Key: system.uptime

ゾンビ/スリーププロセスの数

  • zombie
    Name: Number of zombie processes
    Key: proc.num[,,zomb]
    Update interval: 60
    Keep history: 7
    Keep trends: 365
    Description: Number of processes in zombie state.
  • sleep
    Name: Number of sleep processes
    Key: proc.num[,,sleep]
    Update interval: 60
    Keep history: 7
    Keep trends: 365
    Description: Number of processes in sleep state.

DenyHosts?の件数を監視

  • DenyHosts はssh等で指定した回数ログインに失敗したIPを /etc/hosts.deny に記録する。これを監視に入れたい。
  • Zabbix Agent
    1. vim /etc/zabbix/zabbix_agentd.conf
    2. ----
    3. EnableRemoteCommands=1
    4. ----
    5. service zabbix-agent restart
  • Zabbix Item
    1. 名前: Number of DenyHosts
    2. キー: system.run["grep -c DenyHosts /etc/hosts.deny"]
    3. 更新間隔: 3600

vm.memory.size

  • 記事
    • Page not found | Zabbix Weblog vm.memory.size[shared] はkernel 2.6では常に0が返ってくるため廃止。値が取れる kernel2.4 で限定的にサポート

ログ監視


ホストの登録でDNS名が63文字までしか使えない

AWS RDSのDNSを入力しようとして発覚

  • Zabbix 1.8.13, 2.0.13, 3.0.6 で確認
    • Configuration > Hosts > Crete Host > DNS nameに63文字しか登録できない。それ以上入力しても、後ろの文字が切断される
    • 対処:DNSで63文字以下のCNAMEを付ける

External checks/外部チェック

Zabbix server上で外部スクリプトを実行して結果をZabbixに取り込める
やり過ぎるとZabbixのパフォーマンスが悪化するため注意

  • スクリプト内でタイムアウトは必ず設定する。server/proxyの「Timeout=3」より実行時間が長いと、アイテムが「取得不可」になる。この場合、トリガーでnodata()を使っても発生しない。(Zabbix2.2以上はアクションで取得不可を知る事ができる)
  • 4 Configuration Zabbix1.8 Zabbix1.8系では第一引数にHost:DNS name/IP addressが必ず入る
    1. # itemに設定した値
    2. check_oracle.sh[-h 192.168.1.4]
    3.  
    4. # zabbixから実行される値
    5. check_oracle.sh www1.company.com -h 192.168.1.4
  • 11 External checks Zabbix2.0 Zabbix2.0ではカンマ区切りに変わっている。ホスト情報が欲しい場合は{HOST.CONN}等が使える。"パラメータ名","引数"と分けて記述する必要がある。"パラメータ名 引数"とすると引数に空白が含まれる場合の実行に失敗する。
    1. # itemに設定した値
    2. check_oracle.sh["-h","{HOST.CONN}"]
    3.  
    4. # zabbixから実行される値
    5. check_oracle.sh "-h" "192.168.1.4"

用語

ITサービス
監視項目単位でグループを作成し、稼働率(SLA)を算出できる。apache+mysqlで可動してるサービスを登録し、サービス全体としての稼働率を計算してくれる。
ディスカバリ
指定したIPアドレス範囲(192.168.1.1〜255)を一定時間毎に探索し、自動的に監視対象に追加したり、その他アクションをとる事ができる
ホストの自動登録
zabbix-agentのアクティブチェックを利用して、一定条件を満たすzabbix-agentから受信した場合にzabbix-serverに自動登録できる
アクション
障害発生時や復旧時に実行する動作設定。トリガーステータスが変化しイベントが生成された時に、管理者へ通知、自動復旧、特定スクリプトの実行等できる
WEB監視
HTTP/HTTPSを使ってWebページが正常に表示できるかチェックできる。basic認証、POST変数、ステータスコード等を指定可能。ログイン可能かをチェックもできる。
IPMI
Intelligent Platform Management Interface。SNMPやDMI等のサーバー管理ソフトウェアが、特定のハードウェアシステムやOSに依存することなく、サーバーハードウェアをモニタ可能にするための標準インターフェイス仕様
Discovered hosts
検出されたホスト
アイテム
監視項目
アプリケーション
アイテムをグループ化する機能
ヒストリ
収集した生データが保存されている期間。デフォルト90日
トレンド
収集したデータのうち、グラフ表示用に30分の最小/平均/最大/個数を保存する期間。デフォルト365日
監視タイプ
Zabbixエージェント
zabbix-serverからzabbix-agentにリクエストを投げて、データを取得する。デフォルト
Zabbixエージェント(アクティブ)
zabbix-agentからzabbix-serverにリクエストを投げる。スタンドアロンのみで、xinetd経由では利用できない。
シンプルチェック
zabbix-agentなしで監視可能。ping, ポートチェック
SNMP v1/v2/v3エージェント
zabbix-serverからSNMP機器へリクエストが投げられる
Zabbixトラッパー
zabbix-agentに付属するzabbix_senderを用いてzabbix-serverへ送信する。手動やスクリプトに組み込んで実行する。
Zabbixインターナル
zabbix-server内部のアイテムやトリガー数、監視キュー等の監視
Zabbixアグリゲート
同じホストグループに属するホストの同じキーを持つアイテムを集計し、平均/最大を計算できる。zabbix-serverのDBのみを参照するためagentと通信しない
外部チェック
zabbix-server上に置いたスクリプトを実行し、結果を取得する。
  1. vi /etc/zabbix/zabbix_server.conf
  2. ----
  3. ExternalScripts=/usr/lib/zabbix/externalscripts
  4. ----
データベースモニタ
zabbix-serverからunixODBC,iODBCを利用してDBサーバにSQLクエリを発行し、結果を取得する
IPMIエージェント
zabbix-serverからIPMIを利用してハードウェアのステータスを取得する
SSHエージェント
zabbix-serverからSSHサーバへログインしてコマンドを実行し、結果を取得。公開鍵認証の場合は公開鍵/秘密鍵のパスをzabbix_server.confに記載。
  1. vi /etc/zabbix/zabbix_server.conf
  2. ----
  3. SSHKeyLocation=/etc/zabbix/sshkeys
  4. ----
TELNETエージェント
zabbix-serverからtelnetサーバへログインしてコマンドを実行し、結果を取得。

ホストの自動登録

ホストの自動登録/削除/無効化等がZabbixの機能だけで実現できる。

  • 例としてLinuxサーバをzabbix-serverに自動登録する。
    • zabbix-agentのHostnameに"agent"が含まれる場合に
    • 1.ホスト追加
    • 2."Linux servers"グループに追加
    • 3. "Template OS Linux"テンプレートを追加
  • zabbix-agent側
    • アクティブチェックを有効にしておく
    • zabbix_agentd.conf
      • ホスト名を自動設定にする場合:「#Hostname=」にすると、「HostnameItem?=system.hostname」が使われる。値の確認は「zabbix_agent -t 'system.hostname'」
      • ホスト名を任意の値にする場合:「Hostname="linux agent 02"」等に変える
  • zabbix-server側
    • 10051/tcpポートを開放
    • 設定 > アクション > 右上のイベントソース:自動登録 > アクションの作成
    • アクションタブ:
      • 名前:Linuxサーバの自動登録
      • デフォルト件名:デフォルト
      • デフォルトのメッセージ:デフォルト
    • アクションの実行条件タブ:
      • "ホスト名" + "含まれる" + "agent" > 追加
    • アクションの実行内容
      • ホストを追加
      • ホストグループに追加: Linux servers
      • テンプレートとリンク: Template OS Linux
    • 保存

バックアップ/リストア

  1. DBが更新されないようにサービス停止
    1. sudo service zabbix-server stop
    2. sudo service httpd stop
  2. 設定ファイル。/etc/zabbix以下がsymlinkの事もある(EPEL版)のため、hオプションを付けてバックアップ
    1. tar cfzh zabbix.conf.$(date +%Y%m%d).tar.gz /etc/zabbix/
  3. mysqlバックアップ
    1. mysqldump -u root --opt --single-transaction --default-character-set=utf8 --database zabbix | gzip > zabbix.mysql.`date +%Y%m%d`.gz
  • mysqlリストア
    1. service zabbix-server stop
    2. mysqladmin -u root drop zabbix
    3. mysql -u root -e 'CREATE DATABASE zabbix CHARACTER SET utf8;'
    4. zcat zabbix.mysql.YYYYMMDD.gz | mysql -u zabbix zabbix

メンテナンス

  • ホストやホストグループのメンテナンスのため、一時的にアラートメール等を止める
    • 設定 > メンテナンス
  • メンテナンス(左上)
    • 名前: 適当
    • メンテナンスタイプ: データ収集あり
    • 開始日時: この設定が有効な期間
    • 終了日時: この設定が有効な期間
  • メンテナンス期間(左下) ※これを設定しないと機能しない
    • 期間のタイプ:一度限り
    • 日付: メンテナンス開始日時
    • メンテナンス期間: メンテナンスに費やす日時
  • zabbiz-server自体のwebインタフェースをメンテナンスモードにする
    • 2.0
      1. /etc/zabbix/web/maintenance.inc.php
    • 1.8

メンテナンス時にアラートメールを送信しないようにするには

デフォルトではメンテナンス期間を作成してもアラートメールが送信される。

  1. 設定 > アクション > アクションを選択
  2. and条件の時には、コンディションに 「メンテナンスの状態」「期間外」を追加する

トラブル対応

  • zabbix-serverからzabbix-agentへの通信に失敗する、全て"[m|ZBX_NOTSUPPORTED]"になる場合、zabbix-agentが設定ファイルを読んでいないケースがあるので起動スクリプトを確認
    1. vim /etc/rc.d/init.d/zabbix-agent
    2. ----
    3. daemon --user zabbix $exec -c /etc/zabbix/zabbix_agentd.conf
    4. ----
    5. service zabbix-agent restart
  • アクションが実行されない時
    • 対象ホストにアクセスできる権限(読み取り専用以上)が管理 > ユーザ > ユーザグループに付与されている必要がある。ユーザがグループに入る必要がある。
  • zabbix_getで値が0になり, zabbix_agentdでは値が取得できる場合。Permission deniedになっていないかzabbixユーザでzabbix_agentdを実行して確かめる。
  • zabbix_get, zabbix_agentd実行時に"ZBX_NOTSUPPORTED"が発生する場合
    • アクセスするファイルへのパーミッションが無い。zabbixユーザがアクセスできるファイルに限られる。もしくは zabbix_agentd.conf で "AllowRoot?=1" にする
    • zabbix_get -k の値と zabbix_agentd.d/userparameter_*.confで指定されたキー名が一致しない
    • [zabbix1.8?] zabbix_agentd.d/userparameter_*.conf 中でパイプ"|"を使っているコマンドの前後にスペースが入っている
  • 外部のagentに対してコマンドを発行(zabbix-getパッケージが必要)
    1. zabbix_get -s [TARGET IP] -p [AGENT PORT:10050(省略可)] -k "[キー]"
    2.  
    3. 例:loadを取得
    4. zabbix_get -s localhost -k "system.cpu.load[,avg1]"
  • zabbix-agentから取得できるか確認。rootユーザとzabbixユーザで結果が異なるので注意。
  1. sudo -u zabbix zabbix_agentd -t "キー"
  2.  
  3. 例:loadを取得
  4. sudo -u zabbix zabbix_agentd -t "system.cpu.load[,avg1]"

見積もり

  • windows cuiコマンド
    1. # システム情報の取得
    2. systeminfo
    3.  
    4. # パフォーマンスカウンタから取得
    5. typeperf -qx
    6.  
    7. # サービス一覧の取得
    8. sc query
    9.  
    10. # ポート(state=LISTENING)
    11. netstat
  • linux
    1. # OS,アーキテクチャ
    2. uname -a
    3.  
    4. # ディストリビューションの確認
    5. # RedHat, CentOS
    6. cat /etc/redhat-release
    7. # Debian
    8. cat /etc/debian_version
    9. # Ubuntu
    10. cat /etc/lsb-release
    11.  
    12. # CPU
    13. cat /proc/cpuinfo
    14.  
    15. # ネットワーク
    16. ifconfig -a
    17.  
    18. # メモリ
    19. free -m
    20.  
    21. # ディスク
    22. df -h
    23.  
    24. # プロセス
    25. ps -ef
    26. # プロセスツリー
    27. pstree -p
    28.  
    29. # ネットワークポート
    30. netstat -anp | grep LISTEN | grep tcp

管理 > メディアタイプ > スクリプト

トリガー発生時にメールを飛ばすように、zabbix-server上のスクリプトを実行できる

  • zabbix-server
    • 管理 > メディアタイプ > 新規作成 > タイプ:スクリプト
    • 以下の場所にスクリプトを置き、管理画面上でスクリプトファイル名を指定する
      1. vi /etc/zabbix/zabbix_server.conf
      2. ----
      3. AlertScriptsPath=/usr/lib/zabbix/alertscripts
      4. ----

日本語アラートスクリプト


アクション


リモートコマンド

  • 設定 > アクション > リモートコマンド

ワンライナーで取得できる値を簡単に取り込める

  • zabbix-server
    • 設定 > アクション > アクションの実行内容 > 実行内容のタイプ:リモードコマンド
  • zabbix-agentの設定変更
    1. vi /etc/zabbix/zabbix_agentd.conf
    2. ----
    3. EnableRemoteCommands=1
    4. LogRemoteCommands=1
    5. ----
    6. service zabbix-agent restart
  • sudoで実行させたいコマンドの場合
    1. visudo
    2. ----
    3. #Defaults    requiretty
    4. zabbix ALL=(ALL) NOPASSWD: ALL
    5. ----
  • アクション:リモートコマンドの書式
    ホスト名:コマンド
    ホストグループ名#コマンド
  • 例:アイテム:ファイル数を数える
    system.run["ls /var/log/*.log | wc -l"]
  • 例:アクション:OSを再起動させる。1行目Linux, 2行目:Windows
    host1:sudo /sbin/reboot
    host2:c:\windows\system32\shutdown.exe -r -f
  • うまく実行できない場合、ログを見る。sudoがうまく行かない場合、visudoの設定を再確認
    /var/log/zabbix/zabbix_agentd.log
    • CentOS
      /var/log/secure
    • Ubuntu
      /var/log/auth.log

トリガー

  • 障害イベント
    • 正常 > 障害
    • 正常 > 不明 > 正常
  • 復旧イベント
    • 障害 > 正常
    • 障害 > 不明 > 正常
  • トリガーステータス
    • 障害:条件式が真
    • 正常:条件式が偽
    • 不明:ホストが"不明"や、アイテムが"取得不可"、トリガー条件式が評価できない場合
  • テキストエリア内の改行はOK
  • ping応答ない場合にチェック
    {host1:icmpping.last(0)}=0
  • WEB 80/tcpポート開放チェック
    {host1:http.last(0)}=0
  • プロセスが可動しているかチェック。例:syslogd
    {host1:proc.num[syslogd].last(0)}=0
  • ファイルの存在(0/1)をチェック
    {host1:vfs.file.exists[/tmp/hoge]}>0
  • ファイルが更新された場合をチェック
    {host1:vfs.file.cksum[/etc/passwd].diff(0)}>0
  • windowsサービスの可動チェック。例:WindowsTime?サービス
    {host1:service_state[W32Time].last(0)}>0
  • 過去3回連続1以上の値が、3回以上続いたらアラート
    {test:test.trapper.count(#3,1,ge)}>2
  • 過去1時間以内に4回以上loadが10を越えた場合を検知
    {host1:system.cpu.load[,avg1].count(3600,10,gt)}>3
  • 過去30分のCPU使用率の平均が90%以上の場合に検知
    {host1:system.cpu.util[idle,avg1].avg(1800)}<10
  • ログに特定の文字列が含まれていたら検知。例:/var/log/messageに"error"が含まれていた場合。正規表現はregexp()
  • 2重化されているSMTPサーバの両方が停止した場合を検知
    ({host1:smtp.last(0)}=0) & ({host2:smtp.last(0)}=0)

ディスカバリアイテムへのトリガー追加

  1. 設定 > テンプレート > Template OS Linux > ディスカバリ
  2. Network interface discovery > トリガーのプロトタイプ
    1. Outgoing network traffic on {#IFNAME} > 300Mbps
    2. {Template OS Linux:net.if.out[{#IFNAME}].count(#3,300M,gt)}>2
    3.  
    4. Incoming network traffic on {#IFNAME} > 300Mbps
    5. {Template OS Linux:net.if.in[{#IFNAME}].count(#3,300M,gt)}>2

過去データと比較

トリガーで過去のデータと現在のデータを比較できる

  • item.last(0,1d) # 前日のデータ
  • item.sum(1h, 1d) # 前日の1時間のデータを集計
  • 例:webテストで前日より1時間の転送量が2倍を超えたらアラート
    1. {Template name:web.test.in[Scenario,,bps].sum(1h)}
    2. > 
    3. {Template name:web.test.in[Scenario,,bps].sum(1h,1d)}*2

データが無い場合にトリガー

  • 10分データが無かったら1
    • [zabbix 3.0] item statusがトリガーの中で使えないため、アイテムが無効な場合でも1になる
      {item.nodata(10m)}=1
  • アイテムが無効な場合に、トリガーを発生させたくない
    • データが1件以上あり、データが10分間無い場合に1。ただし、意図的にアイテムを無効化しても、データはあるため1になる
    • 条件を過去1日等指定する場合は、count(1d) に変える。期間が長すぎるとDBの負荷が気になる。
      (({item.count(#1)}>0 and {item.nodata(10m)}=1))

指定時間対のトリガーを無効にする

  • Zabbix2.4の場合は、「|」「&」の代わりに「or」「and」を使う
  • 例: 04:00-05:00の「Processor load is too high on {HOST.NAME}」を無効にする
    1. ({Template OS Linux:system.cpu.load[percpu,avg1].last(0)}>5) & (({Template OS Linux:system.cpu.load[percpu,avg1].time(0)}<040000) | ({Template OS Linux:system.cpu.load[percpu,avg1].time(0)}>050000))

トリガーでホスト名を条件にいれる

  • 環境: Zabbix2.0
  • やりたい事
    • 複数ホストに同一テンプレートを指定するが、トリガーでホスト名を条件にいれたい。
  • できなかった事
    • 複数のテンプレートを跨いだトリガーの作成。(ホストに直接トリガーを設定すれば可能だが、保守性が悪い)
    • {HOST.NAME}をトリガーの条件式で使う
    • {Template OS Linux:system.hostname.iregexp(web01)}=1 を Template OS Linux 以外のテンプレートで使う
  • 例:「batch01.result nodata >= 25h」のトリガーの条件に Hostname:web01を含む条件をいれる
    • Hosts: web01, web02, db01, db02がある
    • Template: Template My Linux
    • Item: my.hostname
      • タイプ: Zabbixエージェント
      • キー: system.hostname[host]
        (system.hostnameは Template OS Linuxと重複するため別名を使う。[type]はWindows以外は無視される)
      • 更新間隔(秒): 3600
      • ヒストリの保存期間: 1
    • Item: batch01.result
      • タイプ: Zabbixトラッパー
      • キー: batch01.result
      • ヒストリの保存期間: 7
    • Trigger: batch01.result nodata >= 25h
      • 条件式:
        1. ({Template My Linux:system.hostname[host].iregexp(web01)}=1)
        2. &({Template My Linux:batch01.result.nodata(25h)}=1)

テンプレート

  • zabbix-agent用ユーザスクリプト
    1. /etc/zabbix/zabbix_agentd.d/
  • インポート
  1. Zabbixの設定 > テンプレート > 右上のインポート

Apache

  1. zabbix-agent側の設定
    1. vi /etc/httpd/conf/httpd.conf
    2. ----
    3. ExtendedStatus On
    4.  
    5. <Location /server-status>
    6.     SetHandler server-status
    7.     Order deny,allow
    8.     Deny from all
    9.     Allow from 127.0.0.1
    10.     Allow from localhost
    11. </Location>
    12. ----
    13. service httpd restart
  2. Apache Monitoring Script [Zabbix] に説明があり3つの例がある。1.cronを使う, 2.zabbix-serverから直接/server-statusを参照する, 3.agent側にbashスクリプトを置く。(3)がスマートなので採用
  3. filezapache filezapache_export.xml をダウンロード
  4. zapacheをagent側にコピー
    1. mkdir /etc/zabbix/bin
    2. cp /tmp/zapache /etc/zabbix/bin
    3. chmod 755 /etc/zabbix/bin/zapache
    4.  
    5. cat > /etc/zabbix/zabbix_agentd.d/userparameter_apache.conf << 'EOS'
    6. UserParameter=apache[*],/etc/zabbix/bin/zapache \$1
    7. EOS
    8.  
    9. service zabbix-agent restart
  5. 設定 > -hテンプレート > 右上のインポートで「zapache_export.xml」を指定
  6. Template_Apache_Stats が追加される。アイテムしかないのでトリガーやグラフは任意で追加
  • 例:秒間リクエスト数グラフの追加
  1. 設定 > テンプレート > Template_Apache_Stats > グラフを選択
  2. 右上のグラフの作成
  3. 名前:Apache - Requests Per Second
  4. アイテム:Template_Apache_Stats: Apache/ReqPerSec?
  5. 保存

MySQL

  • Zabbix 2.0/2.2標準の「Template App MySQL」を使う
    • Zabbix Agent側の設定
    1. MySQLにzabbixユーザを作成(Zabbix Serverの場合は不要)
      1. echo "grant process on *.* to 'zabbix'@'localhost' identified by 'zbxpasswd';flush privileges;" | mysql -u root -p -h localhost mysql
      2.  
      3. # ステータスを取得できるか確認
      4. mysqladmin status -u zabbix -p
    2. /etc/zabbix/zabbix_agentd.d/userparameter_mysql.conf にHOME=/var/lib/zabbixとあるので /var/lib/zabbix/.my.cnfを作成
      1. cp /usr/share/doc/zabbix20-agent-2.0.13/userparameter_mysql.conf /etc/zabbix/zabbix_agentd.d/
      2.  
      3. vim /var/lib/zabbix/.my.cnf
      4. ----
      5. [client]
      6. host=127.0.0.1
      7. user=zabbix
      8. password=********
      9. default-character-set=utf8
      10. ----
      11. chmod 600 /var/lib/zabbix/.my.cnf
      12. chown zabbix:zabbix /var/lib/zabbix/.my.cnf
      13.  
      14. # statusが取れるか確認
      15. sudo -u zabbix mysqladmin status
    3. zabbix_agentdから値が読めるかテスト
      1. sudo -u zabbix zabbix_agentd -t 'mysql.uptime'
    4. zabbix_serverから値が読めるかテスト
      1. zabbix_get -s localhost -k 'mysql.uptime'
    • Zabbix Server側の設定
    1. 設定 -> ホスト -> ホスト名
    2. テンプレートタブ -> 「Template App MySQL」を追加

ユーザの追加

  • Zabbix2.x
    • ユーザの種類「Zabbix特権管理者」のみ「管理タブ」が表示される
  1. 管理 > ユーザ
  2. 右上のセレクトボックスで「ユーザ」に切り替え
  3. エイリアス「Admin」がデフォルトユーザなのでパスワードを変更しておく
  4. 右上の「ユーザの追加」で追加可能
  5. 「権限」タブで「ユーザ」「管理者」「特権管理者」と選択ができる
  6. 保存

通知用のメール設定

  • Zabbix2.x
  1. 管理 > メディアタイプ > Email
    • SMTPサーバ: localhost
    • SMTP helo: localhost
    • 送信元メールアドレス: zabbix@localhost
    • 有効:チェック
  2. 保存
  1. 設定 > アクション > Report problems to Zabbix administrators
    • デフォルトの件名(マクロが使えるので適当に):例 ホスト名を追加
      1. {HOSTNAME}: {TRIGGER.STATUS}: {TRIGGER.NAME}
    • デフォルトのメッセージ(マクロが使えるので適当に):例 ホスト名とイベント発生日時を追加
      1. Hostname: {HOSTNAME}
      2. Event: {EVENT.DATE} {EVENT.TIME}
      3. ...
    • リカバリメッセージ:チェック
    • リカバリ件名・メッセージも上記と同様
  • bullist

添付ファイル: filezabbix-slack-notify.zip 325件 [詳細] filezabbix_cleanup 608件 [詳細] fileTemplate_App_SMART_Windows_LLD.xml 496件 [詳細] filesmart-win.ps1 643件 [詳細] fileTemplate SNMP YAMAHA RTX1200.xml 742件 [詳細] fileTemplate_App_SMART_Linux_LLD.xml 510件 [詳細] fileyamaha-rt-status.sh 714件 [詳細] fileTemplate SNMP YAMAHA RTX810.xml.xml 424件 [詳細] filezabbix2.0-centos6.3-graph-bug.jpg 749件 [詳細] filezabbix-2.x-mojibake-after.jpg 873件 [詳細] filezabbix-2.x-mojibake-befor.jpg 833件 [詳細] filezapache_export.xml 499件 [詳細] filezapache 495件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-06-20 (水) 19:40:15 (1d)