皆様初めまして。
4月に入社しましたビジネス・ソリューション部の黒松です。
IT業界未経験でグローディアに入社してから2か月という浅い経験の中で
上司と先輩のサポートのもと、ZabbixでのESXiホストの監視設定を行いました。
その中でも今回のブログでは「Mattermost連携」に焦点を当ててご説明します。
特に、「サーバへのログインが不要」で「専用のbotも不要(内向きWebhook URLを用意するだけ)」
というような、面倒な手間を省いた設定手順をお伝えします!
検証結果
まず最初に実際の通知画面をお見せします。
これからご説明する簡単な設定で上記の画像のような通知を行うことができます。
検証環境
設定の流れ
大まかな設定の流れは以下の通りです。
1.メディアタイプ設定
2.ユーザー設定
3.アクション設定
設定手順
1.メディアタイプ設定
まず、Mattermostに通知するためのメディアタイプを編集します。
今回はこちらでカスタマイズしたものをご提供します。
ZabbixのデフォルトのMattermost設定では今回の通知のようにならず、専用のbotが必要ですが、
今回は内向きWebhook URLのみで通知することが可能となっております。
※カスタマイズの内容
・パラメータ :スクリプト作成に必要な項目のみ設定
・スクリプト :Webhook URLのみで通知ができるように設定、通知レイアウトも編集
・メッセージタイプ:通知に必要な項目を追加
以下にソースコードを記載しておりますので、コピーしてご使用ください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 |
<?xml version="1.0" encoding="UTF-8"?> <zabbix_export> <version>5.0</version> <date>2020-06-10T08:07:45Z</date> <media_types> <media_type> <name>Mattermost_Custom</name> <type>WEBHOOK</type> <parameters> <parameter> <name>channel</name> <value>〈指定のチャンネル名〉</value> </parameter> <parameter> <name>event_date</name> <value>{EVENT.DATE}</value> </parameter> <parameter> <name>event_name</name> <value>{EVENT.NAME}</value> </parameter> <parameter> <name>event_opdata</name> <value>{EVENT.OPDATA}</value> </parameter> <parameter> <name>event_recovery_date</name> <value>{EVENT.RECOVERY.DATE}</value> </parameter> <parameter> <name>event_recovery_time</name> <value>{EVENT.RECOVERY.TIME}</value> </parameter> <parameter> <name>event_severity</name> <value>{EVENT.SEVERITY}</value> </parameter> <parameter> <name>event_time</name> <value>{EVENT.TIME}</value> </parameter> <parameter> <name>event_update_action</name> <value>{EVENT.UPDATE.ACTION}</value> </parameter> <parameter> <name>event_update_date</name> <value>{EVENT.UPDATE.DATE}</value> </parameter> <parameter> <name>event_update_message</name> <value>{EVENT.UPDATE.MESSAGE}</value> </parameter> <parameter> <name>event_update_time</name> <value>{EVENT.UPDATE.TIME}</value> </parameter> <parameter> <name>host_name</name> <value>{HOST.NAME}</value> </parameter> <parameter> <name>icon_url</name> <value>〈指定のアイコンURL〉</value> </parameter> <parameter> <name>subject</name> <value>{ALERT.SUBJECT}</value> </parameter> <parameter> <name>username</name> <value>zabbix</value> </parameter> <parameter> <name>zabbix_url</name> <value>{$ZABBIX.URL}</value> </parameter> </parameters> <script>var req = new CurlHttpRequest(); req.AddHeader('Content-Type: application/x-www-form-urlencoded'); // パラメータを変数に格納 var params = JSON.parse(value); // mattermost通知枠組 var attachements = "" // mattermost通知枠組み色 var color = "#aaaaaa" // %が誤作動起こす為、%25に置換 params.event_opdata = params.event_opdata.replace('%','%25'); if (params.subject.startsWith('UPDATED:')) { // 更新通知の場合 color = "#7499FF" attachements = '[{"color": "' + color + '",' + '"fields": [{"short":false,"title":"【更新】"},' + '{"short":false,"title":"■更新日時","value":"' + params.event_update_date + ' ' + params.event_update_time + '"},' + '{"short":true,"title":"■ホスト名","value":"' + params.host_name + '"},' + '{"short":true,"title":"■アクション","value":"' + params.event_update_action + '"},' + '{"short":true,"title":"■更新メッセージ","value":"' + params.event_update_message + '"},' + '{"short":true,"title":"■更新後の重要度","value":"' + params.event_severity + '"},' + '{"short":true,"title":"■障害項目","value":"' + params.event_name + '"},' + '{"short":true,"title":"■検知時の値","value":"' + params.event_opdata + '"}]' + '}]' } else if (params.subject.startsWith('RESOLVED:')) { // 復旧通知の場合 color = "#00ff33" attachements = '[{"color": "' + color + '",' + '"fields": [{"short":false,"title":"【復旧】"},' + '{"short":false,"title":"■復旧日時","value":"' + params.event_recovery_date + ' ' + params.event_recovery_time + '"},' + '{"short":true,"title":"■ホスト名","value":"' + params.host_name + '"},' + '{"short":true,"title":"■障害時の重要度","value":"' + params.event_severity + '"},' + '{"short":true,"title":"■障害項目","value":"' + params.event_name + '"},' + '{"short":true,"title":"■検知時の値","value":"' + params.event_opdata + '"}]' + '}]' } else if (params.subject.startsWith('PROBLEM:')) { // 障害発生通知 // 重要度で色変更 if (params.event_severity === '致命的な障害' ) { color = "#ff0000" } else if (params.event_severity === '重度の障害' ) { color = "#ff4500" } else if (params.event_severity === '軽度の障害' ) { color = "#ff7f50" } else if (params.event_severity === '警告' ) { color = "#ffa500" } else if (params.event_severity === '情報' ) { color = "#4169e1" } attachements = '[{"color": "' + color + '",' + '"fields": [{"short":false,"title":"【障害発生】"},' + '{"short":false,"title":"■発生日時","value":"' + params.event_date + ' ' + params.event_time + '"},' + '{"short":true,"title":"■ホスト名","value":"' + params.host_name + '"},' + '{"short":true,"title":"■重要度","value":"' + params.event_severity + '"},' + '{"short":true,"title":"■障害項目","value":"' + params.event_name + '"},' + '{"short":true,"title":"■検知時の値","value":"' + params.event_opdata + '"},' + '{"short":false,"title":"■URL","value":"' + params.zabbix_url + '"}]' + '}]' } // mattermost通知メッセージ組み立て var info = '{"channel":"' + params.channel + '","icon_url":"' + params.icon_url + '","username":"' + params.username + '","attachments":' + attachements + '}' Zabbix.Log(4, 'webhook request value='+info); req.Post( '〈指定のWebhook URL〉', 'payload='+info ); Zabbix.Log(4, 'response code: '+req.Status()); return JSON.stringify({ 'tags': { 'endpoint': 'slack' } });</script> <message_templates> <message_template> <event_source>TRIGGERS</event_source> <operation_mode>PROBLEM</operation_mode> <subject>PROBLEM: {EVENT.NAME}</subject> <message>Problem started at {EVENT.TIME} on {EVENT.DATE} Problem name: {EVENT.NAME} Host: {HOST.NAME} Severity: {EVENT.SEVERITY} Operational data: {EVENT.OPDATA} {TRIGGER.URL}</message> </message_template> <message_template> <event_source>TRIGGERS</event_source> <operation_mode>RECOVERY</operation_mode> <subject>RESOLVED: {EVENT.NAME}</subject> <message>Problem has been resolved at {EVENT.RECOVERY.TIME} on {EVENT.RECOVERY.DATE} Problem name: {EVENT.NAME} Host: {HOST.NAME} Severity: {EVENT.RECOVERY.STATUS} {TRIGGER.URL}</message> </message_template> <message_template> <event_source>TRIGGERS</event_source> <operation_mode>UPDATE</operation_mode> <subject>UPDATED: {EVENT.NAME}</subject> <message>{USER.FULLNAME} {EVENT.UPDATE.ACTION} problem at {EVENT.UPDATE.DATE} {EVENT.UPDATE.TIME}. {EVENT.UPDATE.MESSAGE} Current problem status is {EVENT.STATUS}, age is {EVENT.AGE}, acknowledged: {EVENT.ACK.STATUS}.</message> </message_template> </message_templates> </media_type> </media_types> </zabbix_export> |
※文字コード「UTF-8」で「xml形式」で保存してください。
●「管理」⇒「メディアタイプ」⇒「インポート」
●「ファイルを選択」⇒保存したxmlファイルをアップロード⇒「インポート」
●追加された「Mattermost_Custom」を選択
●Mattermost_Customの設定内容を編集⇒「更新」
・パラメータ:「channel」と「icon_url」を入力
・スクリプト:71行目に指定のWebhook URLを記入
(補足)
スクリプト内の39行目から47行目にかけての「event_severity」と
比較している文字列はZabbix上のトリガー深刻度とマッチさせる必要があります。
※Zabbixのデフォルトでは英語で設定されており、今回は以下のように日本語に書き換えています。
●メディアタイプ一覧画面に戻り、Mattermost_Custom行の「テスト」を押すと以下のポップアップが表示されます。
「subject」に「PROBLEM:」「RESOLVED:」「UPDATED:」のいずれかを入力⇒「テスト」
●以下のようにMattermostの指定チャンネルにテスト通知が来れば設定完了です。
・障害発生通知「PROBLEM:」の場合
・復旧通知「RESOLVED:」の場合
・更新通知「UPDATED:」の場合
(補足)
更新通知は、ほかのユーザーが障害情報を手動で更新した際の通知を指します。
障害の深刻度が変化したことによる通知ではないことに注意してください。
(Zabbix標準機能による障害深刻度の変化を通知する仕掛けは実現が難しいそうです…)
例えば、新たに「test」ユーザー(権限:特権管理者)を作成してサインインを行い、
発生している障害を「確認済み」などの更新を実行すると通知が届きます。
今回の設定において、障害が「致命的な障害」から「重度の障害」に変化した場合の通知順序は
①「致命的な障害」が発生 ⇒ ②「重度の障害」が発生 ⇒ ③「致命的な障害」が復旧、となります。
メディアタイプの設定は以上です。
2.ユーザー設定
続いて、設定したMattermostのメディアタイプを指定のユーザーに追加します。
今回は「Admin」ユーザーに追加します。
●「管理」⇒「ユーザー」⇒「Admin」を選択
●「メディア」にMattermost_Customを追加
・タイプ:「Mattermost_Custom」
・送信先:「Mattermost_Custom(任意の名前)」
●「メディア」にMattermost_Customが追加されていることを確認⇒「更新」
3.アクション設定
最後に、Mattermostへ「障害発生」「復旧」「更新」を通知させるための
アクションの実行内容を設定します。
●「設定」⇒「アクション」⇒「アクションの作成」
●「アクション」タブ⇒「名前」に任意の名前を記入⇒「実行条件」の「追加」⇒「有効」にチェック
※新規条件は以下のように設定
・タイプ :「トリガーの深刻度」
・オペレータ:「以上」
・深刻度 :「未分類」
●「実行内容」タブ⇒「実行内容」の「追加」⇒「詳細」を以下のように設定
・実行内容のタイプ :「メッセージの送信」
・ユーザーグループに送信:「Zabbix administrators」
・次のメディアのみ使用 :「Mattermost_Custom」
●「復旧時」「更新時」ともに、「障害通知送信済みのユーザーすべてにメッセージを送信」を選択して「追加」
●設定した内容を確認⇒「追加」
以上で設定は終了となります。
おわりに
今回の記事はここまでとなります。
Slack連携の場合は、メディアタイプ設定手順の
パラメータ「channel」、
スクリプト内の「Webhook URL」を
Slackの物に読み替えて頂くだけで利用できます。
※但し、icon_urlはslackでは動作しませんので、アイコンを変えたい場合は
Slack側で変更する必要があります。
またvSphere APIでZabbixで監視するためには
テンプレートやLLD(ローレベルディスカバリ)、アイテムキーなどの作成が必要となりますので
そちらは日を改めて書いていきたいと思います。
最後まで閲覧頂きありがとうございました。
本記事がZabbix設定で苦戦されている方にとって少しでもお役に立てれば幸いです。