CentOS
zabbix

Zabbix構築・運用ガイド

More than 1 year has passed since last update.

Zabbix構築・運用ガイド

1.概要

1-1. 説明すること

Zabbixの構築・設定・運用について記載する。

  • 構築について
    単一サーバ上にWebサーバ(Apache httpd)・APLサーバ(Zabbix Server)・DBサーバ(MySQL)を全乗せする構成で構築する。
  • 設定について
    Zabbixの設定は、設定箇所をなるべく局所化/ルール化しないとカオスになるため、可能な限り設定作業を自動化するよう、Zabbixの機能を活用する。
  • 運用について
    実運用で遭遇したトラブルシュートや経験談も都度追記していく。

1-2. 今回の構築環境

OS:CentOS 6.8
Version:Zabbix 2.4

1-2. 参考にしたサイト

2. Zabbix構築

2-1. Zabbixインストール

  1. Zabbixリポジトリ登録
    yum install http://repo.zabbix.com/zabbix/2.4/rhel/6/x86_64/zabbix-release-2.4-1.el6.noarch.rpm
    
  2. パッケージインストール
    yum install zabbix-server-mysql zabbix-web-mysql zabbix-agent zabbix_get
    yum install httpd mysql-server
    yum install php-mysql php-gd php-xml php-bcmath 
    
  3. 設定ファイルのバックアップ
    cp -pi /etc/my.cnf /etc/my.cnf.org
    cp -pi /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.org
    cp -pi /etc/zabbix/zabbix_server.conf /etc/zabbix/zabbix_server.conf.org
    
  4. MySQL設定
    1. my.cnf
      vi /etc/my.cnf
      utfを有効にする
      character-set-server=utf8 を追加
      
    2. サービス起動
      service mysqld start
      
    3. chkconfig設定
      chkconfig mysqld on
      
    4. mysql_secure_install設定
      mysql_secure_installation
      
    5. DB作成
      mysql -u root -p
      mysql> create database zabbix; 
      
    6. 権限付与/パスワード設定
      ここでは例としてパスワードを'password'とした。
      mysql> grant all privileges on zabbix.* to zabbix@'localhost' identified by 'password'; 
      mysql> grant all privileges on zabbix.* to zabbix@'%' identified by 'password'; 
      mysql> flush privileges; 
      mysql> \q
      
  5. httpd設定
    1. php.ini設定
      vi /etc/php.ini
      timezoneを"Asia/Tokyo"にする
      vi zabbix_server.conf
      
    2. サービス起動
      service httpd start
      
    3. chkconfig設定
      chkconfig httpd on
      
  6. Zabbixサーバ設定
    1. 初期設定をする
      DBのパスワードは先ほど設定したものと合わせる。
      vi /etc/zabbix/zabbix_server.conf
      DBHost=localhost
      DBPassword=password
      
    2. データをインポートする
      cd /usr/share/doc/zabbix-server-mysql-2.4.8/create/
      mysql -u root -p zabbix < schema.sql 
      mysql -u root -p zabbix < images.sql 
      mysql -u root -p zabbix < data.sql 
      
    3. Zabbixサーバを起動する
      service zabbix-server start
      
    4. iptablesの許可設定
      コマンドは環境にあわせて変更する。直接 /etc/sysconfig/iptables を修正してもよい。 今回はiptablesの5行目にルールを追加する。
      iptables -I INPUT 5 -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
      service iptables save
      
  7. WebブラウザからZabbixサーバにアクセス
    http://IPアドレス/zabbix
    初期ID: Admin
    初期パスワード: zabbix
    

2-2. 任意の導入

  1. フォント設定(グラフ描画で日本語が表示されない場合)
    1. IPAゴシックのパッケージをインストール
      yum install ipa-pgothic-fonts
      
    2. IPAゴシックのフォントの優先度を高くする
      alternatives --install /usr/share/zabbix/fonts/graphfont.ttf zabbix-web-font /usr/share/fonts/ipa-pgothic/ipagp.ttf 1000
      
    3. 設定反映
      alternatives --display zabbix-web-font
      
  2. メールの外部配送設定(通知メールを外部配送する場合)
    1. パッケージをインストール
      yum install postfix cyrus-sasl-plain mailx
      
    2. main.cfに設定を追加
      vi /etc/postfix/main.cf
      relayhost = [smtp.nifty.com]:587
      smtp_sasl_auth_enable = yes
      smtp_sasl_mechanism_filter = plain
      smtp_sasl_password_maps = hash:/etc/postfix/nifty_passwd
      smtp_sasl_security_options = noanonymous
      smtp_sasl_tls_security_options = noanonymous
      smtp_use_tls = yes
      
    3. パスワードファイルを作成
      touch /etc/postfix/nifty_passwd
      
    4. パスワードファイルに各種情報を記載
      vi /etc/postfix/nifty_passwd
      [smtp.nifty.com]:587 xxxxx@nifty.com:パスワード
      
    5. パスワードファイルを Berkeley DB形式に変換
      postmap /etc/postfix/nifty_passwd
      
    6. 返還後のファイル形式を確認
      file /etc/postfix/nifty_passwd.db 
      nifty_passwd.db: Berkeley DB (Hash, version 9, native byte-order)
      
    7. ファイルの中身を確認
      db_dump -p /etc/postfix/nifty_passwd.db 
      VERSION=3
      format=print
      type=hash
      h_nelem=4097
      db_pagesize=4096
      HEADER=END
      [smtp.nifty.com]:587\00
      xxxxx@nifty.com:パスワード\00
      DATA=END
      
    8. postfixを再起動
      service postfix restart
      
    9. テストメールを送信
      echo "This mail is test" | mail -s "test mail" -r メールアカウント名@nifty.com メールアカウント名@nifty.com
      
  3. SNMPトラップ受信設定(SNTPのトラップ監視を用いる場合)
    1. パッケージをインストールする
      yum install net-snmp net-snmp-perl net-snmp-utils snmptt
      
    2. 設定ファイルをバックアップする
      cp -pi /etc/snmp/snmpd.conf /etc/snmp/snmpd.conf.org
      cp -pi /etc/snmp/snmptrapd.conf /etc/snmp/snmptrapd.conf.org
      cp -pi /etc/snmp/snmptt.ini /etc/snmp/snmptt.ini.org
      
    3. snmptrapd.confの設定
      ここでは例としてコミュニティ名は'public'とした。
      vi /etc/snmp/snmptrapd.conf
      authCommunity   log,execute,net public
      traphandle default /usr/sbin/snmptthandler
      
    4. snmptrapdの設定
      vi /etc/sysconfig/snmptrapd
      OPTIONS="-On -Lsd -p /var/run/snmptrapd.pid"
      
      vi /etc/init.d/snmptrapd
      OPTIONS="-On -Lsd -p /var/run/snmptrapd.pid"
      
    5. snmptt.iniの設定
      vi /etc/snmp/snmptt.ini
      date_time_format = %Y/%m%d %H:%M:%S
      
    6. snmptt.confの設定
      vi /etc/snmp/snmptt.conf
      EVENT general .* "General event" Normal
      FORMAT ZBXTRAP $aA $*
      
    7. サービス起動
      service snmptt start
      service snmptrapd start
      
    8. chkconfig設定
      chkconfig snmptt on
      chkconfig snmptrapd on
      
    9. Zabbixサーバ再起動
      service zabbix-server restart
      
    10. iptablesの許可設定
      iptables -I INPUT 5 -p udp -m state --state NEW -m udp --dport 162 -j ACCEPT 
      service iptables save
      
    11. 自ホストへsnmptrapを送信
      snmptrap -v 2c -c public localhost '' .1.3.6.1.4.1.8072.9999 .1.3.6.1.4.1.8072.9999 s 'TEST'
      
    12. snmptt.logにトラップログの出力確認
      cat /var/log/snmptt/snmptt.log
      2016/08/25 23:05:35 .1.3.6.1.4.1.8072.9999 Normal "General event" localhost - ZBXTRAP 127.0.0.1 TEST
      

3.Zabbix設定

3-1. 設定する順番

以下の順で設定を行っていく
1. メディアタイプ作成
2. ユーザグループ作成
3. ユーザ作成
4. ホストグループ作成
5. ディスカバリルール作成
6. テンプレート作成
7. アプリケーション作成
8. アイテム作成
9. アクション(トリガー)作成
10. グラフ作成
11. アクション(ディスカバリ)作成

3-2. 設定の流れについて

まず、メディアタイプ・ユーザグループ・ユーザの設定を行う。
これらの情報は監視対象のホスト情報と切り離されているため変更しやすい。

次に、監視対象のホスト・ネットワーク機器の登録設定から、監視内容、通知条件、グラフの作成を行う。
前述したが、これらは可能な限り自動登録、変更箇所を局所化しないと運用してから泣くことになる。

流れとしては、IPアドレスベースにディスカバリルールを作成、ICMP Pingで発見後、あらかじめ作成した定義をもとに監視対象(物理サーバ、ネットワーク機器、VMなど)の自動登録、監視項目(アイテム)の設定、障害時の通知設定、グラフの作成まで自動で行うようにすることで、あとから監視対象が追加になったときもIPアドレスを追加することで自動設定されるようになる。

一方、Zabbixエージェントレスでの監視の場合、どうしても手動で設定しなければいけない箇所があるため、そこは諦めて手動でポチポチする。

3-3. Zabbix設定手順

  1. メディアタイプ作成
    Zabbixサーバからメールを送信するため、SMTPサーバとSMTP heloをlocalhost.localdomainとする。
    今回メディアタイプの名前は Email としているが、宛先が複数になる場合は、 メールアドレスを名前に設定することが望ましい。
    [管理]->[メディアタイプ]->[メディアタイプの作成]からメディアタイプを作成する
    
    例)外部メールサーバを中継しない場合(Zabbixサーバから直接送信する場合)
    名前:Email
    タイプ:メール
    SMTPサーバ:localhost.localdomain
    SMTP helo:localhost.localdomain
    送信元メールアドレス:zabbix@example.com
    
    例)外部メールサーバを中継する場合
    @niftyのメールアカウントを用いて、@niftyのメールアドレスへ送信する。 外部メールサーバを中継する場合、Zabbixサーバ上のメールサーバの設定が必要(後述)。
    名前:Email
    タイプ:メール
    SMTPサーバ:localhost.localdomain
    SMTP helo:localhost.localdomain
    送信元メールアドレス:xxxxx@nifty.com
    
  2. ユーザグループ作成
    [管理]->[ユーザ]->[ユーザグループ]からユーザグループを作成する
    
    例)管理者権限
    グループ名:Administrator
    Webインタフェースへのアクセス:システムデフォルト
    有効:チェック
    
    例)ユーザ権限
    グループ名:Users
    Webインタフェースへのアクセス:システムデフォルト
    有効:チェック
    
  3. ユーザ作成
    1. ユーザタブ
      [管理]->[ユーザ]->[ユーザ]からユーザを作成する
      
      例)鈴木一郎
      今回は以下のユーザの追加を例とする
      名前:Ichiro
      名字:Suzuki
      メールアドレス:ichiro-suzuki@example.com
      権限:管理者
      
      エイリアスはメールのアドレス部分(ここではichiro-suzuki)としておき、初期パスワードと同一としておくと初期パスワードの設定に悩まなくて済む。初期パスワードは速やかに変更してもらう。
      エイリアス:ichiro-suzuki
      名前:Ichiro
      名字:Suzuki
      グループ:Administrator
      パスワード:ichiro-suzuki
      言語:日本語(ja_JP)
      
    2. メディアタブ
      [追加]から新規メディアを追加する
      
      例)新規メディアの追加
      タイプ:Email
      送信先:ichiro-suzuki@example.com
      ステータス:有効
      
    3. 権限タブ
      ユーザの種類:Zabbix特権管理者
      
  4. ホストグループ作成
    ホストグループ
    ホストグループ:sample hosts
    
  5. ディスカバリルール作成
    ネットワーク機器や稼働中のサーバなど、Zabbixエージェントがインストールできない監視対象に対してはディスカバリで シンプルチェック(ICMP Ping・ポートチェック・SNMPポーリングなど)で監視対象を発見し、監視対象に組み込む。
    Zabbixエージェントがインストールされている監視対象に対しては、Zabbixエージェントを選択する。 作成するルールは、以下のルールごとに作成するとよい。
    • チェック方法ごと(シンプルチェック or Zabbixエージェントチェック)
    • サーバやネットワーク機器ごと(Cisco Router, Cisco Catalyst, Fujitsu primergy)
    • OSごと(Linux, Windows)
      例)シンプルチェックでのルール設定
      ディスカバリ名:Home network appliance
      IPアドレスの範囲:192.168.1.1,192.168.1.24-64
      チェック:ICMP ping
      
      例)Zabbixエージェントでのルール設定
      ディスカバリ名:Fujitsu primergy
      IPアドレスの範囲:192.168.1.65-128
      チェック:Zabbixエージェント
      キー:Linux
      デバイスの固有性を特定する基準:Zabbixエージェント "Linux"
      
  6. テンプレート作成
    監視項目ごとにテンプレートを作成する
    監視項目の例(死活監視、サービス監視、インタフェース監視)
    1. 死活監視
      デフォルトでICMP用のテンプレートが用意されているので複製して使用する デフォルトのテンプレートは今後使用することを考えてそのまま残しておき、使用する場合は複製して使用する 作成したテンプレートをグループ(今回は sample hosts)に紐付けることで、使用するテンプレートをわかりやすくしている
      テンプレート名:ICMP Ping(Template ICMP Pingを複製して作成)
      所属グループ:sample hosts
      
    2. サービス監視
      テンプレート名:HTTP Service(Template App HTTP Serviceを複製して作成)
      所属グループ:sample hosts
      
    3. インタフェース監視
      Template SNMP Devicesのテンプレートを元にテンプレートを作成する。 Template SNMP Devicesは、Template SNMP GenericとTemplate SNMP Interfacesに紐付いているため、同様にそれぞれ元のテンプレートから複製して作成する。 作成後は、SNMP Devicesのテンプレートに2つのテンプレートを紐付けする。
      テンプレート名:SNMP Device(Template SNMP Deviceを複製して作成)
      テンプレート名:SNMP Generic(Template SNMP Genericを複製して作成)
      テンプレート名:SNMP Interfaces(Template SNMP Interfacesを複製して作成)
      
  7. アプリケーション作成
    アプリケーションはテンプレートと同一名でユニークにする。 SNMPはポーリングとトラップによる監視があるため、ポーリング用をSNMP poling、 トラップ用をSNMP trapとする。 例)死活監視
    アプリケーション:ICMP Ping
    
    例)サービス監視
    アプリケーション:HTTP Service
    
    例)インタフェース監視(SNMP polig)
    アプリケーション:SNMP poling
    
    例)インタフェース監視(SNMP trap)
    アプリケーション:SNMP trap
    
  8. アイテム作成
    アイテムは監視方法ごとに増やす 例)HTTP Service
    名前:HTTP service is running
    タイプ:シンプルチェック
    キー:net.tcp.service[,,80]
    アプリケーション:HTTP Service
    
  9. アクション(トリガー)作成
    トリガーはテンプレートの作成ルールと同様に、監視方法ごとに作成する 例)死活監視通知
    名前:死活監視通知
    アクションの実行条件:メンテナンスの状態 期間外 メンテナンス、テンプレート = ICMP Ping
    アクションの実行内容:ユーザグループ or ユーザ (または両方)に送信
    
  10. グラフ作成
    テンプレートに対してグラフを作成する
    
  11. アクション(ディスカバリ)
    例)BBルータ
    ディスカバリ名:Auto discovery.PR-500KI.
    アクションの実行条件:ディスカバリチェック = PR-500KI: ICMP ping
    アクションの実行内容:ホストグループに追加:sample hosts、テンプレートとリンク: ICMP Ping
    
    例)自宅サーバ
    ディスカバリ名:Auto discovery.FUJITSU PRIMERGY.
    アクションの実行条件:ディスカバリチェック = FUJITSU PRIMERGY: Zabbixエージェント "Linux"
    アクションの実行内容:ホストグループに追加:sample hosts、テンプレートとリンク: ICMP Ping, OS Linux
    

3-4. Zabbix通知テスト

監視対象のホストやプロセスを直接落下させても確認できるが、
まずはZabbixサーバ上で通知確認を行うとよい。

死活監視(ICMP Ping)とサービス監視(TCPポート)は、
Zabbixサーバ上のiptablesでパケットを落とすことでテストできる。

ターミナルを最低2つ開き、1つはiptablesのパケットカウンタモニタリング用、
もう1つはiptables定義操作用として作業を行う。

  1. パケットカウンタをリセットする
    iptables -Z
    
  2. リアルタイムにiptablesのパケットカウンタを確認する
    while :; do iptables -nvxL --line-numbers; sleep 1; clear; done
    Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
    num      pkts      bytes target     prot opt in     out     source               destination
    1         485    64109 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
    2           0        0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0
    3          12      720 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
    4           0        0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22 
    5          34     2176 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:80 
    6           0        0 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW udp dpt:162 
    7           0        0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:10050 
    8          20     3320 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 
    
  3. パケットドロップのルールを追加する
    1. 死活監視の場合
      監視テストを行うホスト(ここでは 192.168.1.62)からの icmp pingをドロップする
      iptables -I INPUT 1 -p icmp --src 192.168.1.62 -j DROP
      
      先ほどのドロップするルールが1行目に追加された
      while :; do iptables -nvxL --line-numbers; sleep 1; clear; done
      Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
      num      pkts      bytes target     prot opt in     out     source               destination
      1           0        0 DROP       icmp --  *      *       192.168.1.62         0.0.0.0/0
      
      カウンタが増えており、パケットがドロップされたことがわかる
      Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
      num      pkts      bytes target     prot opt in     out     source               destination
      1           3      288 DROP       icmp --  *      *       192.168.1.62         0.0.0.0/0
      
      監視テスト後はルールを削除する
      削除する行を誤ると通信できなくなる可能性があるため注意する
      iptables -D INPUT 1
      
    2. サービス監視の場合
      サービス監視の場合も先ほどの死活監視と同様の手順で行う
      ここでは監視テストを行うホスト(ここでは 192.168.1.60)のhttp(80/tcp)に対しての パケットドロップのみ説明する
      iptables -I INPUT 1 -p tcp -m tcp --dst 192.168.1.60 --dport 80 -j DROP
      

4.運用

4-1. Webサーバ(Apache httpd)

  • 障害時に一斉にZabbixでグラフやスクリーンを閲覧しようとしてhttpdが落ちた
    • httpdがボトルネックとなる場合は、フロント(Webサーバ)を複数に分け、バック(DBサーバ)を分離するなど対策を取る(httpdのチューニング前提)

4-2. DBサーバ(MySQL)

  • 気がついたらDBが肥大化してしまった
    • DBがある程度肥大化したら、DBからデータをダンプし、DBを再構築する
      ※ MySQLのエンジンをinnodbで運用を開始し、データストア(ibdata1)が肥大化してしまった経験あり。
      ※ bdata1が12GBのときにmysqldumpでダンプを取ったら実データは1.5GB程度だった。 DBに詳しく筆者はZabbixのhousekeeper(古いデータを自動削除する機能)でディスク容量自体が減ると思っていたが、一度肥大化したDBはdelete文で削除してもディスク容量が減らないことを知った。(実際、housekeeperは内部でdelete文を実行し、データを消している)

4-3. APLサーバ(Zabbix)