ニフクラ ブログ

ニフクラやクラウドの技術について、エンジニアが語るブログです。

RDBを利用したZabbix監視構成の検証をしてみた

こんにちは、ニフクラテクニカルアカウントチームです。

ニフクラでは、様々な監視機能・監視サービスを提供していますが、Zabbix等オープンソースのツールを利用して監視することもできます。 今回はニフクラRDBをZabbixのDBとして利用する監視構成を検証してみました。
ニフクラRDBを利用するメリットですが、Zabbixサーバーが故障しても、サーバーをリストアしRDBにマウントするだけで復旧が可能になる点です。また、共通グローバル側のネットワークを切り離すことでセキュリティの強化を図ることもできます。他にもニフクラのコントロールパネル(管理画面)からデータベースのバックアップが可能になる、スケールアップやディスク容量の拡張が容易に行えるなどのメリットがあります。

それでは、構成と設定の手順についてご説明いたします。 f:id:TechnicalAccountEngineer:20190312174823p:plain
Zabbixの設定値まで記載しているため長文になりますが、参考にしていただけましたら幸いです。

前提条件

本ブログは、以下の前提知識がある方を想定しています。

  • ニフクラの基本的なコントロールパネルの操作、サービスを利用する知識
    (サーバー作成、ネットワーク構築など)
  • Zabbixの構築と設定に関する知識
  • Slackを利用する知識

検証概要

本ブログは、以下の検証を実施しています。

  1. Zabbixサーバーの管理DBを分離し、管理DB部分をニフクラのRDBで構築
    Zabbixの導入および設定は起動時スクリプトにて実施。(OS設定も含む)

  2. 以下のZabbix監視設定を実施
    ・死活監視
    ・プロセス監視
    ・リソース監視
    ・メッセージ監視

  3. ニフクラ基本監視設定
    ・PING監視(Zabbixサーバー)
    ※Zabbixサーバー自身が停止するような障害はZabbixで検知できないため、ニフクラの基本監視設定を実施。
    ※ニフクラの基本監視を使用せず、Zabbixのみを使用する場合は、Zabbix自体を冗長化し相互監視する方法もありますので以下の記事を参考にしてください。
    ニフクラブログ:ゾーン間冗長構成システムの監視実装検証

  4. グラフ出力
    ・定期的に監視結果をグラフ化し、Slackおよびメール通知

  5. 障害発生時の通知
    ・監視対象サーバーの障害発生時にSlackおよびメール通知

  6. Zabbixサーバーの障害時想定のテスト
    以下の2パターンを実施
    ・カスタマイズイメージを利用した復旧パターン
    ・起動時スクリプトを利用した復旧パターン
    ※RDB障害時はポイントインタイムリカバリーを使用して、新規にRDBを作成し、再度DBをマウントする復旧手順となります。

利用リソース

今回の検証を実施するにあたり、利用したニフクラのリソース情報を以下に記載します。
※各リソースのアクセス制限に関しては、ニフクラのファイアウォール等を用いて適切に設定の上実施しています。

リソース 数量
仮想サーバー(サーバーOS:CentOS7.4) 2
プライベートLAN 1
RDB(DBエンジン:MySQL 5.7.15) 1
RDBファイアウォール 1
付替IP(グローバル側) 1
カスタマイズイメージ 1
基本監視 1

検証内容

準備したリソースを使用し、Zabbixサーバーの設定と、監視対象サーバー障害時の検知(メールとSlackに通知)およびZabbixサーバー自身の障害復旧までの検証内容を記載します。

リソース作成

① RDBの作成

  1. 事前に「プライベートLAN作成」、「RDBファイアウォールグループ作成」を実施します。
    ※詳細な作成方法は、以下を参照してください。
    クラウドヘルプ(プライベートLAN:作成)
    クラウドヘルプ(RDB:DBファイアウォールの作成)

  2. コントロールパネルから「RDB」-「DBサーバー」-「DBサーバー作成」をクリックします。
    f:id:TechnicalAccountEngineer:20190108095725p:plain

  3. DBエンジンを選択します。
    本検証では、DBエンジンを「MySQL 5.7.15」とします。
    f:id:TechnicalAccountEngineer:20190108095739p:plain

  4. 基本設定を入力し、「DB設定へ」をクリックします。
    本検証では、以下の設定とします。

項目 設定値
DBサーバー名 zabbixdb
ゾーン west-12
DBサーバータイプ db.e-small
ディスクタイプ HDD
ディスク容量 50
冗長化 シングル構成
グローバルIPアドレス 利用しない
プライベートLAN PVLAN
VIP 192.168.2.30/24
マスターDBのプライベートIPアドレス 192.168.2.31/24
ポート 3306
DBファイアーウォール zabbixdb-fw
DBパラメータグループ default.mysql5.7

※下記のように基本設定の画面で、冗長化の構成をシングル構成から冗長構成に変更することも可能です。

f:id:TechnicalAccountEngineer:20190312174829p:plain
5. DB設定を入力し、「オプション設定へ」をクリックします。
 本検証では、以下の設定とします。

項目 設定値
DB名 zabbix
マスターユーザー名 zabbix
マスターユーザーのパスワード ******

f:id:TechnicalAccountEngineer:20190111182801p:plain
6. オプション設定を入力し、「確認」をクリックします。
 本検証では、デフォルト設定とします。
f:id:TechnicalAccountEngineer:20190108095814p:plain
※オプション設定の自動バックアップを選択することで容易にデータベースのバックアップができます。

7. 設定内容を確認し、「作成する」をクリックします。
f:id:TechnicalAccountEngineer:20190108100117p:plain
8. RDBが作成されたことを確認します。 f:id:TechnicalAccountEngineer:20190108141012p:plain

② 付替IPアドレスの作成

グローバル側に、付替IPアドレスを作成します。
※詳細な作成方法は、以下を参照してください。
クラウドヘルプ(付替IPアドレスの追加)

③ Zabbixサーバー作成

Zabbixサーバーを作成します。(付替IPアドレスの付与も実施)
※詳細な作成方法は、以下を参照してください。
クラウドヘルプ(サーバーの作成)

なお、OSの設定およびZabbixサーバーの設定などは、起動時スクリプトにて実施しています。
起動時スクリプトにて実施している項目は、以下になります。

  • スクリプト実行ログの出力設定
  • ホスト名の設定
  • プライベートLANのIPアドレス設定
  • パブリックDNSの設定
  • syslogを利用して出力されるログを、 warn や err などのプライオリティ文字列の出力の有無でZabbixでのキーワード監視をするために、ファシリティとプライオリティの情報を出力する設定
  • Zabbix3.4のyumリポジトリの登録と、Zabbixに必要なPHPのインストール
  • Zabbixのインストール
  • SQLコマンドを使用するために、MariaDBのクライアントをインストール
  • Zabbixの初期データをインポート
  • Zabbixサーバーの設定(RDBのIPアドレス、ユーザー名、パスワード)
  • Zabbixエージェントの設定(Zabbixで表示するホスト名の設定)
    ※メッセージ監視をするために「AllowRoot=1」の設定も実施
  • ZabbixのWebインターフェース設定(タイムゾーン設定)
  • PHPの設定(Zabbixの推奨値設定)
  • Slack関連の設定
    ※スクリプトはGitHubからダウンロード
  • Zabbixのグラフを定期的に出力させるための設定
    ※スクリプトはGitHubからダウンロード
  • 各サービスの起動と自動起動の設定

スクリプトの内容は後述の「起動時スクリプト(ZabbixServer用)」を参照してください。

④ 監視対象サーバー作成

監視対象サーバーを作成します。
※詳細な作成方法は、以下を参照してください。
クラウドヘルプ(サーバーの作成)

なお、OSの設定およびZabbixエージェントの設定などは、起動時スクリプトにて実施しています。
起動時スクリプトにて実施している項目は、以下になります。

  • スクリプト実行ログの出力設定
  • ホスト名の設定
  • プライベートLANのIPアドレス設定
  • パブリックDNSの設定
  • syslogを利用して出力されるログを、 warn や err などのプライオリティ文字列の出力の有無でZabbixでのキーワード監視をするために、ファシリティとプライオリティの情報を出力する設定
  • Zabbix3.4のyumリポジトリの登録と、Zabbixに必要なPHPのインストール
  • Zabbixのインストール
  • Zabbixエージェントの設定(Zabbixで表示するホスト名の設定)
    ※メッセージ監視をするために「AllowRoot=1」の設定も実施
  • 各サービスの起動と自動起動の設定

スクリプトの内容は後述の「起動時スクリプト(ZabbixAgent用)」を参照してください。

設定作業

① Zabbixサーバーの初期設定

  1. 作業端末のWebブラウザから以下のURLにアクセスします。
    http://<ZabbixサーバーのグローバルIPアドレス>/zabbix

  2. 「Next step」を選択します。
    f:id:TechnicalAccountEngineer:20190107134034p:plain

  3. すべてのチェック項目が「OK」であることを確認し、「Next step」をクリックします。
    f:id:TechnicalAccountEngineer:20190107134059p:plain

  4. 対象の設定項目を入力し、「Next step」をクリックします。
    本検証では、以下の設定とします。

項目 設定値
Database type MySQL
Database host 192.168.2.30
Database port 3306
Database name zabbix
User zabbix
Password ******

f:id:TechnicalAccountEngineer:20190107134135p:plain
5. デフォルトのまま、「Next step」をクリックします。
f:id:TechnicalAccountEngineer:20190107134151p:plain
6. 設定内容を確認し、「Next step」をクリックします。
f:id:TechnicalAccountEngineer:20190107134331p:plain
7. 「Finish」をクリックします。
f:id:TechnicalAccountEngineer:20190107134347p:plain
8. 「Usename」 「Password」を入力し、「Remember me for 30 days」のチェックを外し、「Sign in」をクリックします。
※ユーザー名は「Admin」、初期パスワードは「zabbix」になります。 f:id:TechnicalAccountEngineer:20190107134404p:plain
9. ログイン後、以下の画面が表示されます。
f:id:TechnicalAccountEngineer:20190107134413p:plain

② Zabbixサーバーの監視設定

Zabbixサーバーの監視設定項目は以下になります。

監視項目一覧 f:id:TechnicalAccountEngineer:20190108154842p:plain ※ここでは「死活監視」できるところまでの設定手順を記載し、他の監視項目の設定手順については割愛させて頂きます。

ホストグループの設定

本検証では、以下の設定とします。

グループ名
KensyoGroup
  1. 「設定」-「ホストグループ」-「ホストグループの作成」をクリックします。
    f:id:TechnicalAccountEngineer:20190110102139p:plain

  2. 対象の設定項目を入力し、「追加」をクリックします。
    f:id:TechnicalAccountEngineer:20190110102210p:plain

ホスト作成

本検証では、以下の設定とします。

ホスト名 所属グループ IPアドレス 接続方法 ポート
ZabbixSV KensyoGroup 127.0.0.1 IPアドレス 10050
ZabbixCL KensyoGroup 192.168.2.20 IPアドレス 10050

※上記以外の設定項目はデフォルト設定となります。

  1. 「設定」-「ホスト」-「ホストの作成」を選択します。
    f:id:TechnicalAccountEngineer:20190110105100p:plain

  2. 対象の設定項目を入力し、「追加」をクリックします。
    f:id:TechnicalAccountEngineer:20190312174833p:plain

  3. 監視対象サーバー(ホスト)の数だけ、繰り返し実施します。

テンプレート作成

本検証では、以下の設定とします。

テンプレート名 所属グループ ホスト /
テンプレート
Kensyo_Template_ping_check KensyoGroup ZabbixSV,
ZabbixCL
Kensyo_Template_proc KensyoGroup ZabbixSV,
ZabbixCL
Kensyo_Template_OS_resource KensyoGroup ZabbixSV,
ZabbixCL
Kensyo_Template_message KensyoGroup ZabbixSV,
ZabbixCL
  1. 「設定」-「テンプレート」-「テンプレートの作成」をクリックします。 f:id:TechnicalAccountEngineer:20190110112457p:plain

  2. 対象の設定項目を入力し、「追加」をクリックします。 f:id:TechnicalAccountEngineer:20190312174837p:plain

  3. テンプレートの数だけ、繰り返し実施します。

アイテム作成(死活監視)

ここでは、「テンプレート作成」で作成した以下のテンプレートを使用します。

テンプレート名
Kensyo_Template_ping_check

本検証では、以下の設定とします。

項目 設定値
名前 Ping Check
タイプ シンプルチェック
キー icmpping
ユーザー名
パスワード
データ型 数値(整数)
単位
更新間隔(秒) 30s
更新間隔カスタマイズ
ヒストリの保存期間(日) 90d
トレンドの保存期間(日) 365d
値のマッピングの使用 なし
アプリケーション icmpping
ホストインベントリフィールドの自動設定 なし
説明
有効 チェック
  1. 「設定」-「テンプレート」から、対象の「テンプレート」を選択し、「アイテム」をクリックします。
    f:id:TechnicalAccountEngineer:20190312174841p:plain

  2. 「アイテムの作成」をクリックします。
    f:id:TechnicalAccountEngineer:20190110123159p:plain

  3. 対象の設定項目を入力し、「追加」をクリックします。 f:id:TechnicalAccountEngineer:20190110130654p:plain

トリガー作成(死活監視)

本検証では、以下の設定とします。

項目 設定値
名前 ICMP host unreachable on {HOSTNAME}
深刻度 重度の障害
条件式 {Kensyo_Template_ping_check:icmpping.last()}=0
正常イベントの生成 条件式
障害イベント生成モード 単一
正常時のイベントクローズ すべての障害
タグ
手動でのクローズ許可 チェック
URL
説明
有効 チェック
  1. 「トリガー」-「トリガーの作成」をクリックします。
    f:id:TechnicalAccountEngineer:20190110134231p:plain

  2. 対象の設定項目を入力し、「追加」をクリックします。
    f:id:TechnicalAccountEngineer:20190110134302p:plain

③ 定期的にグラフ出力させる設定

グラフ作成

/(ルート)領域使用率と/(ルート)残量のグラフを作成します。
本検証では、以下の設定とします。

項目 設定値
名前 Disk Usage and Free Space
900
高さ 200
グラフのタイプ ノーマル
凡例を表示 チェック
ワーキングタイムの表示 チェック
トリガーを表示 チェック
パーセンタイルライン(左)
パーセンタイルライン(右)
Y軸の最小値 固定(0.0000)
Y軸の最大値 計算
アイテム1 Kensyo_Template_OS_resource: Used disk space on / in %  
[関数:平均][グラフの形式:線][Y軸:左][色:00CC00]
アイテム2 Kensyo_Template_OS_resource: Free disk space on /
[関数:平均][グラフの形式:線][Y軸:右][色:3333FF]
  1. 「グラフ」-「グラフを作成」をクリックします。
    f:id:TechnicalAccountEngineer:20190110143005p:plain

  2. 対象の設定項目を入力し、「追加」をクリックします。
    f:id:TechnicalAccountEngineer:20190121105642p:plain

グラフ送付スクリプト作成

  1. Zabbixサーバーにログインし、グラフ送付スクリプトを作成します。
    スクリプトの内容は後述の「グラフ送付スクリプト」を参照してください。

  2. 作成したスクリプトに実行権を付与します。

# chmod 755 /usr/lib/zabbix/alertscripts/slack-graph.sh

cron登録

スクリプトを定期実行させるためにcron登録します。
本検証では、毎週金曜日の17時にグラフを送付する設定とします。

# crontab -e
以下を追加
0 17 * * 5 /usr/lib/zabbix/alertscripts/slack-graph.sh

④ 監視対象サーバー障害時の通知設定

メディアタイプ

本検証では、以下の設定とします。

項目 設定値
名前 Slack
タイプ スクリプト
スクリプト名 slack.sh
スクリプトパラメータ1 {ALERT.SENDTO}
スクリプトパラメータ2 {ALERT.SUBJECT}
スクリプトパラメータ3 {ALERT.MESSAGE}
有効 チェック

※スクリプト名で設定している「slack.sh」は起動時スクリプト実行時にGitHubからダウンロードしたスクリプトを設定します。

  1. 「管理」-「メディアタイプ」-「メディアタイプの作成」をクリックします。
    ※メール設定はデフォルトで作成されているものを選択して使用します。
    f:id:TechnicalAccountEngineer:20190116130108p:plain

  2. 対象の設定項目を入力し、「更新」をクリックします。
    f:id:TechnicalAccountEngineer:20190116130119p:plain

ユーザー

本検証では、以下の設定とします。

項目 設定値 設定値
タイプ Slack Email
送信先 <任意のチャンネル名> xxx@xxxxx.com
有効な時間帯 1-7,00:00-24:00 1-7,00:00-24:00
指定した深刻度のときに使用
 未分類
 情報
 警告
 軽度の障害
 重度の障害
 指名的な障害
チェック チェック
有効 チェック チェック
  1. 「管理」-「ユーザー」から対象のエイリアスを選択します。
    今回の検証では「Admin」とします。
    f:id:TechnicalAccountEngineer:20190116134757p:plain

  2. 「メディア」-「追加」をクリックします。
    f:id:TechnicalAccountEngineer:20190116133227p:plain

  3. 対象の設定項目を入力し、「追加」をクリックします。
    f:id:TechnicalAccountEngineer:20190116133251p:plain

  4. 「更新」をクリックします。
    f:id:TechnicalAccountEngineer:20190116135356p:plain

アクション

本検証では、以下の設定とします。
■Slackの設定

項目 設定値
アクション
名前 Report problem to slack
実行内容
実行内容の詳細
 ユーザーグループに送信
 次のメディアのみ使用
 
Zabbix administrators
Slack
復旧時実行内容
実行内容の詳細
 ユーザーグループに送信
 次のメディアのみ使用
 
Zabbix administrators
Slack

※上記以外の設定項目はデフォルト設定となります。

■メールの設定

項目 設定値
アクション
名前 Report problems to Zabbix administrators
※デフォルトで作成されているものを使用
実行内容
実行内容の詳細
 ユーザーグループに送信
 次のメディアのみ使用
 
Zabbix administrators
Email
復旧時実行内容
実行内容の詳細
 ユーザーグループに送信
 次のメディアのみ使用
 
Zabbix administrators
Email

※上記以外の設定項目はデフォルト設定となります。

  1. 「設定」-「アクション」-「アクションの作成」をクリックします。
    f:id:TechnicalAccountEngineer:20190116155705p:plain

  2. 「アクション」から名前を入力します。
    f:id:TechnicalAccountEngineer:20190116162357p:plain

  3. 「実行内容」を選択し、「新規」をクリックします。
    f:id:TechnicalAccountEngineer:20190116155729p:plain

  4. 対象の設定項目を選択し、「追加」をクリックします。
    f:id:TechnicalAccountEngineer:20190116165743p:plain

  5. 「復旧時実行内容」を選択し、「新規」をクリックします。
    f:id:TechnicalAccountEngineer:20190116161224p:plain

  6. 対象の設定項目を選択し、「追加」をクリックします。
    f:id:TechnicalAccountEngineer:20190116165937p:plain

  7. 「更新」をクリックします。
    f:id:TechnicalAccountEngineer:20190116161240p:plain

⑤ Zabbixサーバー障害時の設定

Zabbixサーバー自身の監視はニフクラ基本監視(PING監視)にて行います。
※詳細な作成方法は、以下を参照してください。
クラウドヘルプ(監視:ルールの作成)

テスト

① 定期的にグラフ出力させるテスト

テスト項目

毎週金曜日の17時にグラフが送付されることを確認する。

テスト結果

全て想定どおりの動作を行い、指定した時間に1週間分のグラフがメールとSlackに通知されることを確認できました。

メール
f:id:TechnicalAccountEngineer:20190312174846p:plain
Slack
f:id:TechnicalAccountEngineer:20190312174850p:plain

② 監視対象サーバーの障害テスト

今回の検証では、Zabbixで検知した障害は、メールとSlackに通知されます。
f:id:TechnicalAccountEngineer:20190111190506p:plain

テスト項目

監視対象サーバーの障害時想定のテストを実施しました。

試験項目 試験内容
死活監視の動作確認 監視対象サーバーを停止させる
プロセス監視の動作確認 crondプロセスを停止させる
リソース監視の動作確認 /bootの使用率を70%と90%以上にする
メッセージ監視の動作確認 「/var/log/messages」にメッセージを送る

テスト結果

全て想定どおりの動作を行い、テスト結果としても問題ないことが確認できました。 (メールとSlackに通知されることを確認)
※「死活監視の動作確認」以外もテスト済みですが、画像は割愛させて頂きます。

メール
f:id:TechnicalAccountEngineer:20190312174853p:plain
Slack
f:id:TechnicalAccountEngineer:20190312174857p:plain

③ Zabbixサーバーの障害テスト

今回の検証では、Zabbixサーバー自身の障害は、メール通知されます。
f:id:TechnicalAccountEngineer:20190110155156p:plain

テスト項目

Zabbixサーバーの障害時想定のテストを2パターン実施しました。

[カスタマイズイメージを利用した復旧パターン]

f:id:TechnicalAccountEngineer:20190109092224p:plain

No 試験手順
事前にカスタマイズイメージを作成
サーバー停止(Zabbixサーバーの障害を想定)
※ニフクラ基本監視にて検知
サーバー削除
カスタマイズイメージを使用しリストア
(付替IPの付与も実施)
ニフクラ基本監視の再設定
※設定作業の「⑤Zabbixサーバー障害時の設定」を実施
動作確認

※カスタマイズイメージの作成方法は、以下を参照してください。
クラウドヘルプ(サーバー:イメージ保存)

[起動時スクリプトを利用した復旧パターン]

f:id:TechnicalAccountEngineer:20190109092919p:plain

No 試験手順
サーバー停止(Zabbixサーバーの障害を想定)
※ニフクラ基本監視にて検知
サーバー削除
サーバー再作成時に起動時スクリプト(ZabbixServer用)を使用し、
リストア(付替IPの付与も実施)
Zabbixの再セットアップ(DBにアクセスするための設定など)
※設定作業の「①Zabbixサーバーの初期設定」を実施
グラフ出力用のスクリプト作成とcronの登録
※設定作業の「③ 定期的にグラフ出力させる設定」を実施
(グラフ作成は除く)
ニフクラ基本監視の再設定
※設定作業の「⑤Zabbixサーバー障害時の設定」を実施
動作確認

※No.3の起動時スクリプトを使用しリストアする場合、以下のコマンドはZabbixの初期データをインポートするコマンドのため、スクリプトから削除して実施してください。

### Import Initial Data
zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -h ${DB_HOST} -P ${DB_PORT} -u ${DB_USER} -p${DB_PASSWD} ${DB_NAME}

テスト結果

全て想定どおりの動作を行い、監視が継続できることを確認できました。

Zabbixサーバーの障害時の復旧手順としては、Zabbixの再セットアップなどが必要ない「カスタマイズイメージを利用した復旧パターン」の方が簡単でした。
なお、ZabbixのDBを分離しているため、サーバーを再作成する「起動時スクリプトを利用した復旧パターン」でも 復旧させるまでにかかる時間は数分の差しかありませんでした。
カスタマイズイメージ利用分の費用を節約したい場合は、「起動時スクリプトを利用した復旧パターン」でも良いかもしれません。

これで、本検証は終了となります。

まとめ

Zabbixサーバの障害を想定し、今回2パターンのテスト(③ Zabbixサーバーの障害テスト)を実施しZabbixサーバーの復旧を確認することができました。 データベースをRDBにすることで、データベースのバックアップや冗長化、ディスクの増設がコントロールパネルで可能となるため、操作もしやすいかと思います。 ニフクラでZabbixを構築する際のご参考にしていただけると幸いです。

※注意事項

  • 本記事については検証結果の1つとなります。実際に検討される場合は、事前にそれぞれの要件を鑑みて実装するか確認してください。
  • 本記事ではOS上の操作についても記載していますが、ニフクラではOS以上はご利用者様の責任範囲となりますのでご留意ください。

各スクリプトのソースコード

起動時スクリプト(ZabbixServer用)

本スクリプトは、ニフクラの起動時スクリプトにて使用します。
OSの設定およびZabbixサーバーのインストールと設定を行います。

◇環境
 Zabbix:3.4
 OS:CentOS7.4
 DB:RDB(MySQL 5.7)
 PHP:PHP 5.4 (CentOS 7標準)

◇前提条件
・RDB、プライベートLAN、ファイアウォールグループを作成していること
・Slackに「Incoming Webhooks」というアプリが導入済みで、
 「Webhook URL」をあらかじめ控えておくこと
・Slack APIのfiles.uploadが使えること

◇対象サーバー
 Zabbixサーバー

◇スクリプト名
 SettingZabbixServer.sh
 (起動時スクリプトにて使用するため、サーバーへの配置はしない)

◇スクリプト内容
本検証では、以下の設定とします。

項目 設定値
HOST_NAME 20182QZabbixSV
IPADDR 192.168.2.10
NETMASK 255.255.255.0
DNS_SERVER <任意のDNSのIPアドレス>
DB_HOST 192.168.2.30
DB_PORT 3306
DB_NAME zabbix
DB_USER zabbix
DB_PASSWD ****
SLACK_URL ※1 https:\/\/hooks.slack.com\/services\/****
GRAPH_PERIOD ※2 374400
LOGFILE /var/tmp/SettingZabbix_`date +%Y%m%d`.log

※1:SLACK_URLは、/(スラッシュ)の前に(エンマーク)をいれること
  例)https://hooks.slack.com/services/****
     ↓
    https:\/\/hooks.slack.com\/services\/****
※2:GRAPH_PERIODは、グラフの表示期間(1秒単位)
  例)月曜日の9:00から金曜日の17:00までの期間を表示する場合:374400

#!/bin/bash -x

### Config
#=========================================
HOST_NAME="<任意のホスト名>"
IPADDR="<任意のIPアドレス>"
NETMASK="<任意のネットマスク>"
DNS_SERVER="<任意のDNSのIPアドレス>"
DB_HOST="<DBのIPアドレス>"
DB_PORT="<DBの接続ポート>"
DB_NAME="<データベースの名前>"
DB_USER="<DBのユーザー名>"
DB_PASSWD="<DBのユーザーのパスワード>"
SLACK_URL="<Webhook URL>"
GRAPH_PERIOD="<グラフの表示期間>"
LOGFILE="<スクリプト実行ログの出力先>"
#=========================================

### LogOutput Configuration
SECONDS=0
exec > ${LOGFILE}
exec 2>&1

### Hostname Configuration
/bin/hostname ${HOST_NAME}
/bin/sed -i".org" -e "s/localhost.localdomain/${HOST_NAME}/" /etc/hostname
/bin/diff /etc/hostname /etc/hostname.org

### PrivateIP Configuration
/bin/sed -i".org" -e "s/BOOTPROTO=dhcp/BOOTPROTO=static/" /etc/sysconfig/network-scripts/ifcfg-ens192
echo IPADDR=${IPADDR} >> /etc/sysconfig/network-scripts/ifcfg-ens192
echo NETMASK=${NETMASK} >> /etc/sysconfig/network-scripts/ifcfg-ens192
/bin/diff /etc/sysconfig/network-scripts/ifcfg-ens192 /etc/sysconfig/network-scripts/ifcfg-ens192.org
systemctl restart network
systemctl status network

### DNS Configuration
/bin/sed -i".org" -e "$ a nameserver $DNS_SERVER" /etc/resolv.conf
/bin/diff /etc/resolv.conf /etc/resolv.conf.org

### Syslog Configuration
/bin/sed -i".org" -e '/#### RULES ####/a \
$template mytemplate, "%timegenerated% <%syslogfacility-text%.%syslogseverity-text%> %hostname% %programname%: %msg%\\n"' \
/etc/rsyslog.conf
/bin/sed -i -e "s/\/var\/log\/messages/\/var\/log\/messages;mytemplate/g" /etc/rsyslog.conf
/bin/diff /etc/rsyslog.conf /etc/rsyslog.conf.org
systemctl restart rsyslog
systemctl status rsyslog

### Add Install Repository and necessary packages for Zabbix  
yum -y install php-mysql php-gd php-xml php-bcmath
yum -y install http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm

### Install Zabbix
yum -y install zabbix-server-mysql zabbix-web-mysql zabbix-web-japanese zabbix-agent zabbix-get

### Install Mariadb Client
yum -y install mariadb

### Import Initial Data
zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -h ${DB_HOST} -P ${DB_PORT} -u ${DB_USER} -p${DB_PASSWD} ${DB_NAME}

### ZabbixServer Configuration
/bin/sed -i".org" -e "s/# DBHost=localhost/DBHost=${DB_HOST}/g" /etc/zabbix/zabbix_server.conf
/bin/sed -i -e "s/# DBUser=/DBUser=${DB_USER}/g" /etc/zabbix/zabbix_server.conf
/bin/sed -i -e "s/# DBPassword=/DBPassword=${DB_PASSWD}/g" /etc/zabbix/zabbix_server.conf
/bin/diff /etc/zabbix/zabbix_server.conf /etc/zabbix/zabbix_server.conf.org

### ZabbixAgent Configuration
/bin/sed -i".org" -e "s/Hostname=Zabbix server/Hostname=${HOST_NAME}/g" /etc/zabbix/zabbix_agentd.conf
/bin/sed -i -e "s/# AllowRoot=0/AllowRoot=1/g" /etc/zabbix/zabbix_agentd.conf
/bin/diff /etc/zabbix/zabbix_agentd.conf /etc/zabbix/zabbix_agentd.conf.org

### Zabbix Web Interface Configuration
/bin/sed -i".org" -e "s/# php_value date.timezone Europe\/Riga/php_value date.timezone Asia\/Tokyo/g" /etc/httpd/conf.d/zabbix.conf
/bin/diff /etc/httpd/conf.d/zabbix.conf /etc/httpd/conf.d/zabbix.conf.org

### PHP Configuration
/bin/sed -i".org" -e "s/;date.timezone =/date.timezone = Asia\/Tokyo/g" /etc/php.ini
/bin/sed -i -e "s/;always_populate_raw_post_data/always_populate_raw_post_data/g" /etc/php.ini
/bin/sed -i -e "s/post_max_size = 8M/post_max_size = 16M/g" /etc/php.ini
/bin/sed -i -e "s/max_execution_time = 30/max_execution_time = 300/g" /etc/php.ini
/bin/sed -i -e "s/max_input_time = 60/max_input_time = 300/g" /etc/php.ini
/bin/diff /etc/php.ini /etc/php.ini.org

### Slack Setting
wget https://raw.githubusercontent.com/ericoc/zabbix-slack-alertscript/master/slack.sh -P /usr/lib/zabbix/alertscripts
/bin/chmod 755 /usr/lib/zabbix/alertscripts/slack.sh
/bin/sed -i".org" -e "s/url='CHANGEME'/url=${SLACK_URL}/g" /usr/lib/zabbix/alertscripts/slack.sh
/bin/diff /usr/lib/zabbix/alertscripts/slack.sh /usr/lib/zabbix/alertscripts/slack.sh.org

### Zabbix Graph Setting
yum -y install mutt
wget https://raw.githubusercontent.com/ma3ki/sendimgmail/master/sendimgmail.sh -P /usr/lib/zabbix/alertscripts
wget https://raw.githubusercontent.com/ma3ki/sendimgmail/master/sendimgmail.conf -P /usr/lib/zabbix/alertscripts
/bin/chmod 755 /usr/lib/zabbix/alertscripts/sendimgmail.sh
/bin/mkdir /etc/zabbix/graph
/bin/sed -i".org" -e "s/ZABBIX_USER=admin/ZABBIX_USER=Admin/g" /usr/lib/zabbix/alertscripts/sendimgmail.conf
/bin/sed -i -e "s/GRAPH_PERIOD=3600/GRAPH_PERIOD=${GRAPH_PERIOD}/g" /usr/lib/zabbix/alertscripts/sendimgmail.conf
/bin/sed -i -e "s/IMAGE_TEMP=\/var\/tmp\/imgtmp/IMAGE_TEMP=\/etc\/zabbix\/graph/g" /usr/lib/zabbix/alertscripts/sendimgmail.conf
/bin/sed -i -e "s/MAIL_FROM=hogehoge@example.com/MAIL_FROM=zabbix@company.com/g" /usr/lib/zabbix/alertscripts/sendimgmail.conf
/bin/sed -i -e "s/MAIL_NAME=zabbix_alert/MAIL_NAME=zabbix_graph/g" /usr/lib/zabbix/alertscripts/sendimgmail.conf
/bin/diff /usr/lib/zabbix/alertscripts/sendimgmail.conf /usr/lib/zabbix/alertscripts/sendimgmail.conf.org

### Service Startup and Automatic Startup Setting
systemctl start zabbix-server
systemctl start zabbix-agent
systemctl start httpd
systemctl enable zabbix-server
systemctl enable zabbix-agent
systemctl enable httpd
systemctl status zabbix-server
systemctl status zabbix-agent
systemctl status httpd

echo "[INFO] Script time is ${SECONDS}sec."

起動時スクリプト(ZabbixAgent用)

本スクリプトは、ニフクラの起動時スクリプトにて使用します。
OSの設定およびZabbixエージェントのインストールと設定を行います。

◇環境
 Zabbix:3.4
 OS:CentOS7.4

◇前提条件
・プライベートLAN、ファイアウォールグループを作成していること
・Zabbixサーバーのインストールが完了していること

◇対象サーバー
 監視対象サーバー

◇スクリプト名
 SettingZabbixAgent.sh
 (起動時スクリプトにて使用するため、サーバーへの配置はしない)

◇スクリプト内容
本検証では、以下の設定とします。

項目 設定値
HOST_NAME 20182QZabbixCL
IPADDR 192.168.2.20
NETMASK 255.255.255.0
DNS_SERVER <任意のDNSのIPアドレス>
ZABBIX_SERVER 192.168.2.10
LOGFILE /var/tmp/SettingZabbix_`date +%Y%m%d`.log
#!/bin/bash -x

### Config
#=========================================
HOST_NAME="<任意のホスト名>"
IPADDR="<任意のIPアドレス>"
NETMASK="<任意のネットマスク>"
DNS_SERVER="<任意のDNSのIPアドレス>"
ZABBIX_SERVER="<ZabbixサーバーのIPアドレス>"
LOGFILE="<スクリプト実行ログの出力先>"
#=========================================

### LogOutput Configuration
SECONDS=0
exec > ${LOGFILE}
exec 2>&1

### Hostname Configuration
/bin/hostname ${HOST_NAME}
/bin/sed -i".org" -e "s/localhost.localdomain/${HOST_NAME}/" /etc/hostname
/bin/diff /etc/hostname /etc/hostname.org

### PrivateIP Configuration
/bin/sed -i".org" -e "s/BOOTPROTO=dhcp/BOOTPROTO=static/" /etc/sysconfig/network-scripts/ifcfg-ens192
echo IPADDR=${IPADDR} >> /etc/sysconfig/network-scripts/ifcfg-ens192
echo NETMASK=${NETMASK} >> /etc/sysconfig/network-scripts/ifcfg-ens192
/bin/diff /etc/sysconfig/network-scripts/ifcfg-ens192 /etc/sysconfig/network-scripts/ifcfg-ens192.org
systemctl restart network
systemctl status network

### DNS Configuration
/bin/sed -i".org" -e "$ a nameserver $DNS_SERVER" /etc/resolv.conf
/bin/diff /etc/resolv.conf /etc/resolv.conf.org

### Syslog Configuration
/bin/sed -i".org" -e '/#### RULES ####/a \
$template mytemplate, "%timegenerated% <%syslogfacility-text%.%syslogseverity-text%> %hostname% %programname%: %msg%\\n"' \
/etc/rsyslog.conf
/bin/sed -i -e "s/\/var\/log\/messages/\/var\/log\/messages;mytemplate/g" /etc/rsyslog.conf
/bin/diff /etc/rsyslog.conf /etc/rsyslog.conf.org
systemctl restart rsyslog
systemctl status rsyslog

### Add Install Repository
yum -y install http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm

### Install Zabbix
yum -y install zabbix-agent

### ZabbixAgent Configuration
/bin/sed -i".org" -e "s/Server=127.0.0.1/Server=${ZABBIX_SERVER}/g" /etc/zabbix/zabbix_agentd.conf
/bin/sed -i -e "s/ServerActive=127.0.0.1/ServerActive=${ZABBIX_SERVER}/g" /etc/zabbix/zabbix_agentd.conf
/bin/sed -i -e "s/Hostname=Zabbix server/Hostname=${HOST_NAME}/g" /etc/zabbix/zabbix_agentd.conf
/bin/sed -i -e "s/# AllowRoot=0/AllowRoot=1/g" /etc/zabbix/zabbix_agentd.conf
/bin/diff /etc/zabbix/zabbix_agentd.conf /etc/zabbix/zabbix_agentd.conf.org

### Service Startup and Automatic Startup Setting
systemctl start zabbix-agent
systemctl enable zabbix-agent
systemctl status zabbix-agent

echo "[INFO] Script time is ${SECONDS}sec."

グラフ送付スクリプト

◇前提条件
・プライベートLAN、ファイアウォールグループを作成していること
・Zabbixサーバーのインストールが完了していること
・SlackのチャンネルIDとSlackで取得したトークンをあらかじめ控えておくこと

◇対象サーバー
 Zabbixサーバー

◇スクリプト名
 slack-graph.sh
 (/usr/lib/zabbix/alertscripts/配下に配置する)

◇スクリプト内容
本検証では、以下の設定とします。

項目 設定値
MAIL     xxx@xxxxx.com
SUBJECT [Zabbix] DiskUsage And FreeSpace
HOST_NAME ZabbixCL
KEY vfs.fs.size[/,pused]
FILE_NAME /etc/zabbix/graph/792.png
FILE_NAME2 /etc/zabbix/graph/[Zabbix]ThisWeek_DiskUsage_And_FreeSpace.png
CHANNELS *********
TOKEN ************************
#!/bin/bash -x

### Config
#=========================================
MAIL="<送付先のメールアドレス>"
SUBJECT="<メールの件名>"
HOST_NAME="<対象サーバー名>"
KEY="<Zabbixアイテムのキー>"
FILE_NAME="<グラフの保存先とファイル名(グラフID)>"
FILE_NAME2="<グラフの保存先と任意のファイル名>"
CHANNELS="<SlackのチャンネルID>"
TOKEN="<Slackで取得したトークン>"
#=========================================

### zabbix_graph mail
/usr/lib/zabbix/alertscripts/sendimgmail.sh ${MAIL} "${SUBJECT}" \
$(echo -e ThisWeek_DiskUsage_And_FreeSpace\n\nhost: ${HOST_NAME}\nkey: ${KEY}")"


### zabbix_graph slack
if [ -f ${FILE_NAME} ]; then
  mv ${FILE_NAME} ${FILE_NAME2}
  curl -F file=@${FILE_NAME2} -F channels=${CHANNELS} -F token=${TOKEN} "https://slack.com/api/files.upload"
fi

【参考】起動時スクリプト(RDBを利用しないZabbixServerのパターン)

本スクリプトは、ニフクラの起動時スクリプトにて使用します。
OSの設定およびZabbixサーバーとMariaDBのインストールと設定を行います。
※RDBとSlackを利用しないシンプル構成のスクリプトになります。
※本検証では、ここで記載しているスクリプトは使用していません。

◇環境
 Zabbix:3.4
 OS:CentOS7.4
 DB:MariaDB 5.5 (CentOS 7標準)  PHP:PHP 5.4 (CentOS 7標準)

◇前提条件
・プライベートLAN、ファイアウォールグループを作成していること

◇スクリプト名
 SettingZabbix.sh
 (起動時スクリプトにて使用するため、サーバーへの配置はしない)

◇スクリプト内容

#!/bin/bash -x

### Config
#=========================================
HOST_NAME="<任意のホスト名>"
IPADDR="<任意のIPアドレス>"
NETMASK="<任意のネットマスク>"
DNS_SERVER="<任意のDNSのIPアドレス>"
DB_NAME="<データベースの名前>"
DB_USER="<DBのユーザー名>"
DB_PASSWD="<DBのユーザーのパスワード>"
LOGFILE="<スクリプト実行ログの出力先>"
#=========================================

### LogOutput Configuration
SECONDS=0
exec > ${LOGFILE}
exec 2>&1

### Hostname Configuration
/bin/hostname ${HOST_NAME}
/bin/sed -i".org" -e "s/localhost.localdomain/${HOST_NAME}/" /etc/hostname
/bin/diff /etc/hostname /etc/hostname.org

### PrivateIP Configuration
/bin/sed -i".org" -e "s/BOOTPROTO=dhcp/BOOTPROTO=static/" /etc/sysconfig/network-scripts/ifcfg-ens192
echo IPADDR=${IPADDR} >> /etc/sysconfig/network-scripts/ifcfg-ens192
echo NETMASK=${NETMASK} >> /etc/sysconfig/network-scripts/ifcfg-ens192
/bin/diff /etc/sysconfig/network-scripts/ifcfg-ens192 /etc/sysconfig/network-scripts/ifcfg-ens192.org
systemctl restart network
systemctl status network

### DNS Configuration
/bin/sed -i".org" -e "$ a nameserver $DNS_SERVER" /etc/resolv.conf
/bin/diff /etc/resolv.conf /etc/resolv.conf.org

### Add Install Repository and necessary packages for Zabbix  
yum -y install php-mysql php-gd php-xml php-bcmath
yum -y install http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm

### Install Zabbix
yum -y install zabbix-server-mysql zabbix-web-mysql zabbix-web-japanese zabbix-agent zabbix-get

### Install MariaDB
yum -y install mariadb-server

### MariaDB Configuration
/bin/sed -i".org" -e '/\[mysqld\]/a innodb_file_per_table' /etc/my.cnf.d/server.cnf
/bin/sed -i -e '/\[mysqld\]/a skip-character-set-client-handshake' /etc/my.cnf.d/server.cnf
/bin/sed -i -e '/\[mysqld\]/a collation-server     = utf8_bin' /etc/my.cnf.d/server.cnf
/bin/sed -i -e '/\[mysqld\]/a character-set-server = utf8' /etc/my.cnf.d/server.cnf
/bin/diff /etc/my.cnf.d/server.cnf /etc/my.cnf.d/server.cnf.org
systemctl start mariadb
systemctl enable mariadb
systemctl status mariadb

### Create Datadase and Authorization
mysql -uroot -e "create database ${DB_NAME};"
mysql -uroot -e "grant all privileges on ${DB_NAME}.* to ${DB_USER}@localhost identified by '${DB_PASSWD}' ;"

### Import Initial Data
zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uroot ${DB_NAME}

### ZabbixServer Configuration
/bin/sed -i".org" -e "s/# DBHost=localhost/DBHost=127.0.0.1/g" /etc/zabbix/zabbix_server.conf
/bin/sed -i -e "s/# DBUser=/DBUser=${DB_USER}/g" /etc/zabbix/zabbix_server.conf
/bin/sed -i -e "s/# DBPassword=/DBPassword=${DB_PASSWD}/g" /etc/zabbix/zabbix_server.conf
/bin/diff /etc/zabbix/zabbix_server.conf /etc/zabbix/zabbix_server.conf.org

### Zabbix Web Interface Configuration
/bin/sed -i".org" -e "s/# php_value date.timezone Europe\/Riga/php_value date.timezone Asia\/Tokyo/g" /etc/httpd/conf.d/zabbix.conf
/bin/diff /etc/httpd/conf.d/zabbix.conf /etc/httpd/conf.d/zabbix.conf.org

### PHP Configuration
/bin/sed -i".org" -e "s/;date.timezone =/date.timezone = Asia\/Tokyo/g" /etc/php.ini
/bin/sed -i -e "s/;always_populate_raw_post_data/always_populate_raw_post_data/g" /etc/php.ini
/bin/sed -i -e "s/post_max_size = 8M/post_max_size = 16M/g" /etc/php.ini
/bin/sed -i -e "s/max_execution_time = 30/max_execution_time = 300/g" /etc/php.ini
/bin/sed -i -e "s/max_input_time = 60/max_input_time = 300/g" /etc/php.ini
/bin/diff /etc/php.ini /etc/php.ini.org

### Service Startup and Automatic Startup Setting
systemctl start zabbix-server
systemctl start zabbix-agent
systemctl start httpd
systemctl enable zabbix-server
systemctl enable zabbix-agent
systemctl enable httpd
systemctl status zabbix-server
systemctl status zabbix-agent
systemctl status httpd

echo "[INFO] Script time is ${SECONDS}sec."