やりたいこと
Zabbixで検知した障害を他システムに連携し、チケットとして管理する。
要約
アクションのデフォルトメッセージに含まれる改行コードCRLFにより、スクリプトのcurlコマンドが意図した通りに動かなかった。
デフォルトメッセージ内の改行は必要だったので、改行コードCRLFを文字列\nに置換することで解決した。
スクリプトパラメータ第2引数の{ALERT.MESSAGE}の改行コードを置換
ZABBIX_MESSAGE='echo ${2//^M/\\\n}'
サンプル
#!/bin/sh ZABBIX_SUBJECT=$1 ZABBIX_MESSAGE=`echo ${2//^M/\\\n}` curl 【URL】 --request POST --header "Content-Type:application/json" --data {"subject":$ZABBIX_SUBJECT, "body":$ZABBIX_MESSAGE}
curlコマンドの内容は適宜合わせる。
環境
OS:CentOS 7.7
Version:Zabbix4.0
メディアタイプ:タイプをスクリプトにし、スクリプトパラメータの第1引数に{ALERT.SUBJECT}、第2引数に{ALERT.MESSAGE}を指定。
ユーザのメディア:アクションの送信先ユーザに、作成したメディアを有効化。
アクション:件名、メッセージはデフォルトのまま。実行内容のタイプをメッセージの送信とし、次のメディアのみ使用に作成したメディアタイプを指定。
本件に遭遇した経緯
環境の通り、アクションの件名やメッセージはそのままです。
スクリプトは引数を変数に格納した後curlコマンドを実行する単純な物です。
まず、意図的に障害を起こしアクションを動作させました。しかしながら、Zabbixでは障害を検知しているものの、連携先のシステムに障害通知は届いていませんでした。
さらに、Zabbixの監視データ→障害からアクションのステータスを確認すると送信済みになっています。
アクションは実行されているから設定は問題なさそうです。それならば、スクリプトに原因があるのかもしれないので、スクリプトパラメータの確認から始めました。
引数をテキストに出力させ確認してみました。件名は想定通りに表示されていますが、メッセージがURLのみの表示となっています。
改めてアクションのメッセージを確認しましたが、デフォルトのままでURLのみ表示という変更は行っていません。
どうにもならなくなったので周りに助けを求めましたが、設定はやはり間違ってなさそうです。
さらに相談し、viで開いたらどう?と言われたので実行しました。
すると、位置的に改行コードと思われる表記がおかしくなっていました。調べてみましたが「M」は制御コードで、これにより連携先のシステムで障害通知を登録できていませんでした。
そこで、改行と解釈されるようサンプルコードのように文字列\nへ置換するようにしました。
結果、curlコマンドが正常に実行され、他システムで障害通知を確認できました。
備考
APIを使用する時は、改行コードに気を付ける。