0

Nagiosカスタムプラグインと構成用のbashスクリプトを作成しています。単純にするためにequivsを使用しています

これが私の制御ファイルです。

Files: section で、ファイルに自分自身を正しいパスにコピーするように指示します。

Files: check_cpu_loadx /usr/lib/nagios/plugins
 check_ipmi_sensors /usr/lib/nagios/plugins
 check_libreoffice_count /usr/lib/nagios/plugins
 check_ram_per_user /usr/lib/nagios/plugins
 check_ram_usage2 /usr/lib/nagios/plugins
 check_ram_usage_percentage /usr/lib/nagios/plugins
 check_tcptraffic /usr/lib/nagios/plugins
 nrpe_custom.cfg /etc/nagios

postinst セクションでは、インストール後に使用される bash スクリプトです。

 File: postinst
     #!/bin/bash -e
     set -x
     echo 'configuring nrpe.conf file.'
     mv /etc/nagios/nrpe.cfg /etc/nagios/nrpe.original.backup
     mv /etc/nagios/nrpe_custom.cfg /etc/nagios/nrpe.cfg
     chmod -R +x /usr/lib/nagios/plugins
     echo 'Installing tcp-ip addon..'
     FLAG=0
     Interfaces=`ifconfig -a | grep -o -e "[a-z][a-z]*[0-9]*[ ]*Link" | perl -pe "s|^([a-z]*[0-9]*)[ ]*Link|\1|"`
     for Interface in $Interfaces; do
        INET=`ifconfig $Interface | grep -o -e "inet addr:[^ ]*" | grep -o -e "[^:]*$"`
        MASK=`ifconfig $Interface | grep -o -e "Mask:[^ ]*"      | grep -o -e "[^:]*$"`
        STATUS="up"
        #loopback
        if [ "$Interface" == "lo" ]; then
            continue
        fi
        #if eth is down
        if [ -z "$INET" ]; then
            continue
        fi
         #if eth ip not starts with 10. or 192.
        if [[ "$INET" == 10.* ]]
        then
            ActiveEth=$Interface;
            break
        elif [[ "$INET" == 192.* ]]
        then
        ActiveEth=$Interface;
            break
        else
            echo "Ethernet Selection Failed!Configure nrpe.cfg manually.Change tcp_traffic plugin paramethers according to your current ethernet.";
            FLAG=1
            break
        fi    
     done
     if [[ "$FLAG" == 0 ]]
     then
         echo 'Selected Ethernet :'$ActiveEth
         sed -i -e "s/eth0/$ActiveEth/g" /etc/nagios/nrpe.cfg
     fi
     echo 'nrpe.conf changed.'
     echo 'Nagios-nrpe-server restarting.'
     service nagios-nrpe-server restart
     echo 'IPMI modules are loading.'
     modprobe ipmi_devintf
     modprobe ipmi_msghandler
     echo "IPMI modules are added to startup."
     #echo "ipmi_si" >> /etc/modules
     echo "ipmi_devintf" >> /etc/modules
     echo "ipmi_msghandler" >> /etc/modules

ここでの問題、debパッケージにコンパイルすると、「サブプロセスがインストールされたポストインストールスクリプトがエラー終了ステータス1を返します」

次に、デバッグ用に set -x を追加しました。問題は tcp-ip addon の構成です。複数のイーサネット カードを持つマシンがいくつかあります。したがって、10.* で始まる IP を持つマシンを選択する必要があります。 192.*

2 番目のセクションには 、イーサネット デバイスに IP がない場合にINET=ifconfig $Interface | grep -o -e "inet addr:[^ ]*" | grep -o -e "[^:]*$"という行があり 、grep が null を返し、INET 変数が null になるため、プロセスの終了ステータスが 1 になります。その行の後に「$?」と入力すると、、それは言う 1

ここでの問題は、dpkg -i を実行してそのパッケージをインストールすると、INET が null になったことを確認した後に bash スクリプトが終了することです。

任意の助けをいただければ幸いです。このbashのことは初めてです。

4

1 に答える 1

3

bashコマンドが常に成功することを確認したい場合は、最後のプログラムがnull以外の戻り値を返したとしても、成功する「最後の」コマンドを追加するだけです。

何かのようなもの

INET=$(/sbin/ifconfig eth0 | grep -o -e "inet addr:[^ ]*" | grep -o -e "[^:]*$" || true)

ここでは、失敗するtrueたびに(常に成功する小さなプログラム)を呼び出します(前のプログラムの終了状態に応じてプログラムをチェーンする方法であり、これを意味します)grep||OR

ただし、スクリプトにはいくつかの欠陥があります。

  • grep式"inetaddr:"は、英語ロケールでのみ正しい結果を提供します。たとえば、ドイツ語環境で実行している場合( )、 (sic!)LANG=deのような文字列を取得できます。inet Adresse: 192.168.7.10
  • 無条件にファイルを移動しています。これらのファイルがない場合はどうなりますか?
  • でファイルを無条件に移動しています/etc/etcsysadminがシステムをニーズに合わせて調整する場所です。sysadminの構成を削除または元に戻してはなりません。システムを適切に構成する方法を文書化する必要があります(システム管理者が自分で構成できるようにするため)。システムを自動的に構成して「支援」することを主張する場合は、debconfのようなものを使用する必要があります
  • あなたはたくさんのソフトウェアがインストールされていて、このソフトウェアがあなたの道にあると仮定します。おそらく、使用しているバイナリへの完全修飾パスを使用する必要があります/sbin/ifconfigifconfig
于 2013-02-05T16:43:34.450 に答える