会社では、停電のためにサーバーが数回クラッシュし、管理者は従業員が仕事に就けない午前中にのみこれを発見しました。
主な問題は、管理者へのすべての通知がメールで送信されることでした-簡単に推測できるように、これもメールに含まれています
それから、「管理者が危機的な状況で電話するように!」
実装とスクリプトについては、猫の下でお願いします。
出発点として、通知システムのみを持たない、すでにインストールおよび設定されたZabbixを使用します。
インフラストラクチャでは、zabbixがDebian 7 x64に展開されています。このシステムではSkypeを起動できなかったため、通知プロセスにいくつかのフリルが追加されました。 32ビットシステムを使用している場合、頭痛はありません。
それでは始めましょう。
まず、 Skypeとその依存関係をインストールする必要があります。
システムは非常にリソース効率の高いものになるように計画されているため、グラフィカルシェルは存在しません。
1.基本コンポーネントをインストールします。
# Skype - useradd skype passwd skype # x server apt-get install xvfb apt-get install fluxbox x11vnc # skype apt-get install dbus apt-get install libasound2 libqt4-dbus libqt4-network libqtcore4 libqtgui4 libxss1 libpython2.6 libqt4-xml libaudio2 libmng1 fontconfig liblcms1 apt-get install lib32stdc++6 lib32asound2 ia32-libs libc6-i386 lib32gcc1 # wget http://www.skype.com/go/getskype-linux-deb-32 -O skype.deb # dpkg -i skype.deb
依存関係が残っている場合-apt-get installを使用してください。
* Skypeは32ビットのみであることに注意してください。 また、Debian 7 x64では起動に失敗しました。 私の解決策は、Debian 7 32ビットを備えた別の仮想マシンをインストールし、その上でskypeを起動することでした
Skype4pyをインストールする必要がある2番目の手順 -Skypeインスタンスに接続できるPythonスクリプト/ユーティリティのセット。
# Skype4Py wget 'http://sourceforge.net/projects/skype4py/files/skype4py/1.0.31.0/Skype4Py-1.0.31.0.tar.gz/download?use_mirror=switch' # tar -xzf Skype4Py-1.0.31.0.tar.gz # Skype4py cd Skype4Py-1.0.31.0/ python setup.py install
ですから、現時点では仕事に必要なものはすべて揃っています。
3番目のステップは、今後の作業を簡素化します。
これを行うには、サービスの起動を高速化するためのスクリプトをいくつか作成します。
1. start-server.sh-このスクリプトは、Xvfb、fluxbox、およびSkype自体を開始、停止、再起動します。
#!/bin/bash if [[ "$USER" != 'skype' ]]; then echo "Please start this script as skype!" exit 1 fi export DISPLAY=:1 dnb=`dirname "$0"` start() { if [[ `ps aux | grep skype | grep "Xvfb :1" | grep -v grep | wc -l` == '0' ]]; then echo "starting Xvfb" Xvfb :1 -screen 0 800x600x16 & else echo "Xvfb already running" fi if [[ `ps aux | grep skype | grep "fluxbox" | grep -v grep | wc -l` == '0' ]]; then echo "starting fluxbox" sleep 1 fluxbox & else echo "fluxbox already running" fi if [[ `ps -eo pid,user,args | grep skype | awk '{ print $1 " " $3; }' | grep skype | wc -l` == '0' ]]; then echo "starting skype" sleep 2 skype & else echo "skype already running" fi } stop() { if [[ `ps -eo pid,user,args | grep skype | awk '{ print $1 " " $3; }' | grep skype | wc -l` == '0' ]]; then echo "skype is NOT running" else echo "killing skype" killall skype fi "$dnb/start-vnc.sh" stop if [[ `ps aux | grep skype | grep "fluxbox" | grep -v grep | wc -l` == '0' ]]; then echo "fluxbox is NOT running" else echo "Killing fluxbox" killall fluxbox fi if [[ `ps aux | grep skype | grep "Xvfb :1" | grep -v grep | wc -l` == '0' ]]; then echo "Xvfb is NOT running" else echo "Killing Xvfb" killall Xvfb fi } status() { i='3' if [[ `ps aux | grep skype | grep "Xvfb :1" | grep -v grep | wc -l` == '0' ]]; then echo "Xvfb is NOT running" else echo "Xvfb is running" ((i--)) fi if [[ `ps aux | grep skype | grep "fluxbox" | grep -v grep | wc -l` == '0' ]]; then echo "fluxbox is NOT running" else echo "fluxbox is running" ((i--)) fi if [[ `ps -eo pid,user,args | grep skype | awk '{ print $1 " " $3; }' | grep skype | wc -l` == '0' ]]; then echo "skype is NOT running" else echo "skype is running" ((i--)) fi if [[ "$i" == '0' ]]; then echo "OVERALL STATUS: OK" exit 0 fi if [[ "$i" == '1' || "$i" == '2' ]]; then echo "OVERALL STATUS: NOT RUNNING PROPERLY" else echo "OVERALL STATUS: NOT RUNNING" fi exit "$i" } case "$1" in start) start ;; stop) stop ;; restart) stop start ;; status) status ;; *) echo "Usage: $0 {start|stop|restart|status}" exit 1 esac
2. start-vnc.sh-VNCサーバーを起動するスクリプト-Skypeアカウントを入力し、外部APIを使用する権限を確認するためのグラフィカルインターフェイスが必要なため:
#!/bin/bash if [[ "$USER" != 'skype' ]]; then echo "Please start this script as skype!" exit 1 fi export DISPLAY=:1 dnb=`dirname "$0"` start() { "$dnb/start-server.sh" status if [[ "$?" == '0' ]]; then echo "Starting x11vnc" if [[ `ps aux | grep skype | grep "x11vnc -display :1" | grep -v grep | wc -l` == '0' ]]; then x11vnc -display :1 -bg -nopw -listen localhost -xkb else echo "x11vnc is already running!" fi #pid=`ps aux | grep skype | grep "x11vnc -display :1" | grep -v grep | awk '{ print $2; }'` echo " now use on your machine: ssh -L 5900:127.0.0.1:5900 'skype@`hostname`'" echo " and connect to your local port with vncviewer!" else echo "The server doesn't run." echo 'Use "'"$dnb"'/start-server.sh" to start the server' fi } status() { if [[ `ps aux | grep skype | grep "x11vnc -display :1" | grep -v grep | wc -l` == '0' ]]; then echo "x11vnc isn't running" exit 1 else echo "x11vnc is running" exit 0 fi } stop() { if [[ `ps aux | grep skype | grep "x11vnc -display :1" | grep -v grep | wc -l` == '0' ]]; then echo "x11vnc isn't running" else echo "killing x11vnc" killall x11vnc fi } case "$1" in start) start ;; stop) stop ;; restart) stop start ;; status) status ;; *) echo "Usage: $0 {start|stop|restart|status}" exit 1 esac
4番目のステップ -skypeを起動して構成します。
両方のスクリプトをskypeユーザーの下で起動します。
./start-server.sh start
./start-vnc.sh start
VNCサーバーのポートを転送します(スクリプト./start-vnc.sh \でサーバーのローカルIPに\をマップすることもできますが、より汎用性を高めるためにこのメソッドを使用します)。
ssh -L 5900:127.0.0.1:5900 'skype@your.zabbix.server'
お気に入りのVNCビューアーを127.0.0.1ポート5900に接続すると、Skypeが実行されていることがわかります
通知を送信するアカウントのユーザー名とパスワードを入力します。パスワードを保存するためにチケットを受け取るのを忘れないでください
Skypeに含まれるもの:
チャット履歴なし
私のリストに載っている人だけが私に書くことができます
リストに載っている人だけが私に電話をかけることができます
GUIウィンドウを閉じる前に、Skype自体へのSkype4py接続を有効にする必要があります。
これを行うには、コンソールから実行します(スクリプトテキストはテキストの下にあります)。
./sendim.sh 'USERNAME' 'HELLO WORLD'
ここで、USERNAMEは、メッセージを送信するアカウントの名前です
HELLO WORLD-メッセージ自体
VNCを使用してウィンドウに戻り、Skypeが許可を求めていることを確認します-[許可して記憶]をクリックします。
VNCサーバーを停止します。
./start-vnc.sh stop
そして、Skypeの動作を確認して、再度送信します。
./sendim.sh 'USERNAME' 'HELLO WORLD'
これで、メッセージがユーザー名に届くはずです。
最後のステップは、zabbixを設定することです。
1. zabbix_server.confでAlertScriptsPathのパスを探しています。
2.通知を送信するスクリプトを作成します
2つのスクリプトを作成します。
sendim.sh-skypeユーザーのホームディレクトリで、AlertScriptsPathフォルダーへのリンクを作成します
#!/bin/bash export DISPLAY=:1 python ~skype/sendim.py "$1" "$2"
このスクリプトでは、最初のパラメーターはユーザー名(送信先)、2番目はメッセージです。
sendim.py-Skypeホームディレクトリ内:
import Skype4Py import sys # Create an instance of the Skype class. skype = Skype4Py.Skype() # Connect the Skype object to the Skype client. skype.Attach() user = sys.argv[1] msg = ' '.join(sys.argv[2:]) message = skype.SendMessage(user, msg)
もう一度確認してください:
./sendim.sh username message
Zabbixで通知を構成します。
1.メディアタイプを構成する
[管理]-> [メディアタイプ]に移動し、新しいメディアタイプを作成します。
Name: Skype
Type: Script
Script name: sendim.sh
Enabled: true
2.これらの通知で作業するユーザーを定義します。
[管理]-> [ユーザー]に移動し、ユーザーのプロパティで、新しいメディアタイプを有効にし、Skypeのユーザー名を構成します。
Type: Skype
Send to: YOUR_SKYPE_NAME
YOUR_SKYPE_NAME-送信先のSkypeログイン。
したがって、各ユーザーに対して、誰に通知を送信したいのでしょう。
通知を送信するアクションを構成します。
skypeに送信するものはすべて件名行に含める必要があります(メッセージ本文自体は送信されません)。
必要な条件を作成し、操作を構成します。
テストできます。
*最初に示したように、zabbixとは別のサーバーにSkypeがあり、コマンドはリモートで実行されます
sudo sshpass -p 'skype' ssh skype@IP_ADDRESS "./sendim.sh '$1' '$2'"
ここで、IP_ADDRESSはskypeを使用したサーバーIPです
「ダイヤラー」という機能も実装されています。 Skypeは指定された番号で管理者に電話をかけます。
スクリプトテキストは次のとおりです。 必要に応じて、構成方法を説明しますが、これは別の投稿のトピックです)
skype_caller.py-接続してskypeから呼び出します:
#!python # --------------------------------------------------------------------------------------------- # Python / Skype4Py example that takes a skypename or number from the commandline # and calls it. # import sys import Skype4Py # This variable will get its actual value in OnCall handler CallStatus = 0 # Here we define a set of call statuses that indicate a call has been either aborted or finished CallIsFinished = set ([Skype4Py.clsFailed, Skype4Py.clsFinished, Skype4Py.clsMissed, Skype4Py.clsRefused, Skype4Py.clsBusy, Skype4Py.clsCancelled]); def AttachmentStatusText(status): return skype.Convert.AttachmentStatusToText(status) def CallStatusText(status): return skype.Convert.CallStatusToText(status) # This handler is fired when status of Call object has changed def OnCall(call, status): global CallStatus CallStatus = status print 'Call status: ' + CallStatusText(status) # This handler is fired when Skype attatchment status changes def OnAttach(status): print 'API attachment status: ' + AttachmentStatusText(status) if status == Skype4Py.apiAttachAvailable: skype.Attach() # Let's see if we were started with a command line parameter.. try: CmdLine = sys.argv[1] file = sys.argv[2] except: print 'Missing command line parameter' sys.exit() # Creating Skype object and assigning event handlers.. skype = Skype4Py.Skype() skype.OnAttachmentStatus = OnAttach skype.OnCallStatus = OnCall # Starting Skype if it's not running already.. if not skype.Client.IsRunning: print 'Starting Skype..' skype.Client.Start() # Attatching to Skype.. print 'Connecting to Skype..' skype.Attach() # Make the call print 'Calling ' + CmdLine + '..' global cl cl = skype.PlaceCall(CmdLine) cl.InputDevice( Skype4Py.callIoDeviceTypeFile ,file ) # Loop until CallStatus gets one of "call terminated" values in OnCall handler while not CallStatus in CallIsFinished: pass
skype_caller.sh-skype_caller.py呼び出し元:
#!/bin/bash export DISPLAY=:1 python ~skype/skype_caller.py "$1" "$2"
すべてのHabrへ。