このセクションでは、外部健全性モニター タイプの特定の構成について説明します。

外部モニター タイプを使用すると、スクリプトを記述して、高度にカスタマイズされたきめ細かい健全性チェックを提供できます。スクリプトは、Linux シェル、Python、または Perl で記述でき、wgetnetcatcurlsnmpgetmysql-client、または dig を実行するために使用できます。NSX Advanced Load Balancer サービス エンジンが正常に機能するように、外部モニターは CPU やメモリなどのリソースへのアクセスを制限しています。他のカスタム スクリプトと同様に、本番サーバで使用する前に、実装されたスクリプトの長期的な安定性を十分に検証します。

[操作] > [イベント] ログに移動すると、スクリプトから生成されたエラーを出力に表示できます。

NSX Advanced Load Balancer には、System-Xternal Perl、Python、および Shell モニターで記述した 3 つのサンプル スクリプトが含まれています。

注:

NSX Advanced Load Balancer は、IPv6 外部健全性モニターをサポートします。RADIUS の外部健全性モニターは IPv6 をサポートしていません。

ベスト プラクティスとして、スクリプトによって作成された一時ファイルをすべてクリーンアップします。

外部モニターの構築中に、コマンドの正常な実行を手動でテストする必要があります。SE からコマンドをテストするには、適切なネームスペースまたはテナントに切り替える必要がある場合があります。本番環境の外部モニターは、適切なテナントを正しく使用します。

外部健全性モニターの作成または編集

必須のオプションをクリックして [編集] アイコンをクリックすると、外部健全性モニターを編集できます。

  • System-Xternal-Perl

  • System-Xternal-Python

  • System-Xternal-Shell

新しい外部健全性モニターを作成するには、[作成] ボタンをクリックします。健全性モニターの [タイプ] として [外部] オプションを選択します。次の画面が表示されます。



外部設定に関連する次の詳細を指定できます。

フィールド

説明

[スクリプト コードのアップロードまたは貼り付け]

スクリプトを入力するには、次のいずれかを実行します。

  • [ファイルのインポート] をクリックし、必要なファイルを選択します。ファイルのスクリプトがテキスト ボックスに自動的に貼り付けられます。

  • スクリプトをコピーして、使用可能なテキスト ボックスに貼り付けます。

[スクリプト パラメータ]

スクリプトにフィードするオプションの引数を指定します。これらの文字列は、引数($1 = サーバ IP、$2 = サーバ ポートなど)としてスクリプトに渡されます。

[健全性モニター ポート]

サーバ プールで定義されているポートを上書きするポートを入力します。サーバ ポートを使用するには、0 と入力します。

[スクリプト変数]

再利用を簡素化するために、スクリプトにフィードされるカスタム環境変数を指定します。たとえば、サーバに対して認証するスクリプトの変数は USER=test に設定されている場合があります。

サンプル スクリプト

以下の SharePoint モニターの例では、スクリプトに grep "200 OK" が含まれています。これが見つかった場合、このデータが返され、モニターは成功として終了します。grep でこの文字列が見つからないい場合、データは返されず、モニターはサーバを「停止」とマークします。

  • MySQL サンプル スクリプト

#!/bin/bash
#mysql --host=$IP --user=root --password=s3cret! -e "select 1"
  • SharePoint サンプル スクリプト

#!/bin/bash
#curl http://$IP:$PORT/Shared%20Documents/10m.dat -I -L --ntlm -u $USER:$PASS -I -L > /run/hmuser/$HM_NAME.out 2>/dev/null
curl http://$IP:$PORT/Shared%20Documents/10m.dat -I -L --ntlm -u $USER:$PASS -I -L | grep "200 OK"
  • postgresql サンプル スクリプト

例 1:

この例では、スクリプトによって NSX Advanced Load Balancer SE がデータベースにクエリします。成功した応答を取得すると、NSX Advanced Load Balancer SE はサーバを UP とマークします。それ以外の場合は、サーバを DOWN とマークします。

#!/bin/bash
#exporting username's password
export PGPASSWORD='password123'
psql -U aviuser -h $IP -p $PORT -d aviuser -c "SELECT * FROM employees"

例 2:

この例では、スクリプトによって NSX Advanced Load Balancer SE がデータベースにクエリし、指定された行、列にあるセルの応答を解析し、指定された文字列と照合します。一致すると、サーバは「稼動中」とマークされます。それ以外の場合、サーバは DOWN とマークされます。

#!/bin/bash
#example script for
#string match to cell present at row,column of query response
row=2
column=2
match_string="bob"
#exporting username's password
export PGPASSWORD='password123'
response="$(psql --field-separator=' ' -t --no-align -U aviuser -h $IP -p $PORT -d aviuser -c "SELECT * FROM employees")"
str="$(awk -v r="$row" -v c="$column" 'FNR == r {print $c}' <<< "$response")"
if [ "$str" = "$match_string" ]; then
    echo "Matched"

Oracle サンプル スクリプト:

#!/usr/bin/python
import sys
import os
import cx_Oracle
IP=os.environ['IP']
conn_str='HR_user/HR_pw@' + IP  + '/hr_db'
connection = cx_Oracle.connect(conn_str)
cursor = connection.cursor()
cursor.execute('select * from JOBS')
for row in cursor:
    print row
connection.close()

Oracle スクリプト変数:

LD_LIBRARY_PATH=/usr/lib/oracle/12.2/client64/lib
TNS_ADMIN=/run/hmuser

RADIUS サンプル スクリプト

次の例では、RADIUS プール メンバーに対して PAP 認証を使用して Access-Request を実行し、Access-Accept 応答を確認します。

#!/usr/bin/python3 
import os 
import radius 
try: 
    r = radius.Radius(os.environ['RAD_SECRET'], 
                      os.environ['IP'], 
                      port=int(os.environ['PORT']), 
                      timeout=int(os.environ['RAD_TIMEOUT'])) 
    if r.authenticate(os.environ['RAD_USERNAME'], os.environ['RAD_PASSWORD']): 
        print('Access Accepted') 
except: 
    pass 

RAD_SECRETRAD_TIMEOUTRAD_USERNAME、および RAD_PASSWORD は、健全性モニター スクリプト変数に渡すことができます。例:

RAD_SECRET=foo123 RAD_USERNAME=avihealth RAD_PASSWORD=bar123 RAD_TIMEOUT=1

curl などのアプリケーションでは、v4 アドレスと v6 アドレスの構文が異なる場合があります。外部健全性モニター スクリプトは、これらの構文を認識する必要があります。以下に例を示します。

ドメイン名の使用

NSX Advanced Load Balancer 21.1.3 以降では、ドメイン名を解決するには、サービス エンジンの DNS 解決を構成する必要があります。

EXT_HM=exthm.example.com
curl <http://$EXT_HM:8123/path/to/resource> | grep "200 OK"```

*Shell Script Example for IPV6 Support*

IPv6 サポートのシェル スクリプトのサンプル

#!/bin/bash
#curl -v $IP:$PORT >/run/hmuser/$HM_NAME.$IP.$PORT.out
if [[ $IP =~ : ]];
then curl -v [$IP]:$PORT;
else curl -v $IP:$PORT;
fi

IPv6 サポートの perl スクリプトのサンプル

#!/usr/bin/perl -w
my $ip= $ARGV[0];
my $port = $ARGV[1];
my $curl_out;
if ($ip =~ /:/) {
$curl_out = `curl -v "[$ip]":"$port" 2>&1`;
} else {
$curl_out = `curl -v "$ip":"$port" 2>&1`;
}
if (index($curl_out, "200 OK") != -1) {
    print "Server is up";
}

エラーの処理

外部健全性モニターは、障害の原因を明示的に示すエラー メッセージをログに記録します。次はその例です。

  • 予期しない応答コード ([int]) を受信しました。期待される応答コードは [int] です

  • 予期しないリダイレクト URL:[str]

  • アプリケーション サーバが停止しています

  • Springboard アプリケーションは使用できないため、NSX Advanced Load Balancer では、必要に応じて特定のカスタム エラー メッセージを表示するためにタグ ext_hm_usr_err_msg を導入します。外部健全性モニター スクリプトは応答出力を返し、このデータに ext_hm_usr_err_msg タグが含まれている場合、「外部 HM がエラーで失敗しました」という理由でサーバは「停止」とマークされます。

この例では、NSX Advanced Load Balancer でエラーがどのように処理されるかを理解できます。これは、HTTP 接続を設定するための Python スクリプトの外部健全性モニターです。

#!/usr/bin/python3
import sys
import http.client

try:
    conn = http.client.HTTPConnection(sys.argv[1]+':'+sys.argv[2])
    conn.request("HEAD", "/index.html")
except Exception as e: 
    print("ext_hm_usr_err_msg: Http get request Failed with " + str(e))
    exit()

r1 = conn.getresponse()
if r1.status == 200:
    print(r1.status, r1.reason)
else:
    print("ext_hm_usr_err_msg:"+str(r1.status)+","+r1.reason)

考えられる結果は 2 つあります。

  • HTTP 接続が確立されていない場合、「外部 HM がエラーで失敗しました」というエラーが報告されます。応答文字列では、「接続が拒否されました」などの理由が出力されます。

  • 接続が確立され、NSX Advanced Load Balancer が応答を取得しても、応答が 200 でない場合、エラーは引き続き生成されます。

カスタム スクリプトは、必要に応じて変更できます。

図では、ext_hm_usr_err_msg タグにエラーが表示されています。ここで、エラーは「(Errno 111) 接続失敗で HTTP Get 要求に失敗しました」です。



次に示すように、理由 404「見つかりません」でサーバは「停止」とマークされています。

SE パッケージのリスト

スクリプト言語は次のとおりです。

  • Bash(シェル スクリプト)

  • Perl

  • Python

Linux パッケージは次のとおりです。

  • curl

  • snmp

  • dnsutils

  • libpython2.7

  • python-dev

  • mysql-client

  • nmap

  • freetds-dev

  • freetds-bin

  • ldapsearch

  • postgresql-client

Python パッケージは次のとおりです。

  • pymssql

  • cx_Oracle(および Oracle Database 12c の関連ライブラリ)

  • py-radius

netcat プログラムを使用した NTP 健全性モニターの例

nc -zuv pool.ntp.org 123 2>&1 | grep "(ntp) open"

ネイティブの perl スクリプトを使用するためのサンプル構成は次のとおりです。

#!/usr/bin/perl 
# ntpdate.pl

# this code will query a ntp server for the local time and display
# it.  it is intended to show how to use a NTP server as a time
# source for a simple network connected device.

# 
# For better clock management see the offical NTP info at:
# http://www.eecis.udel.edu/~ntp/
#

# written by Tim Hogard ([email protected])
# Thu Sep 26 13:35:41 EAST 2002
# this code is in the public domain.
# it can be found here http://www.abnormal.com/~thogard/ntp/

$HOSTNAME=shift;
$HOSTNAME="192.168.1.254" unless $HOSTNAME ;	# our NTP server
$PORTNO=123;			# NTP is port 123
$MAXLEN=1024;			# check our buffers

use Socket;

#we use the system call to open a UDP socket
socket(SOCKET, PF_INET, SOCK_DGRAM, getprotobyname("udp")) or die "socket: $!";

#convert hostname to ipaddress if needed
$ipaddr   = inet_aton($HOSTNAME);
$portaddr = sockaddr_in($PORTNO, $ipaddr);

# build a message.  Our message is all zeros except for a one in the protocol version field
# $msg in binary is 00 001 000 00000000 ....  or in C msg[]={010,0,0,0,0,0,0,0,0,...}
#it should be a total of 48 bytes long
$MSG="\01 
注:

ntpdate または ntpq プログラムはサービス エンジンにパッケージ化されていないため、現在は使用できません。

Python 3.0 へのアップグレード

NSX Advanced Load Balancer リリース 20.1.1 以降では、NSX Advanced Load Balancer Controller およびサービス エンジンは Python 3.0 を使用します。

アップグレード手順の一環として外部 Python 健全性モニターを Python 3.0 構文に変換する必要があります。

NSX Advanced Load Balancer リリース 20.1.1 へのアップグレードを開始する前に、次の手順を実行します。

  1. Python を使用して外部健全性モニターを識別します。

  2. 健全性モニターを削除するか、Python 以外の健全性モニターに置き換えます。

  3. 健全性モニター スクリプトが Python 3.0 構文に変更されていることを確認します。

アップグレード後の手順

NSX Advanced Load Balancer リリース 20.1.1 にアップグレードした後、次の手順を実行します。

  1. 既存の (Python 2.7) 健全性モニター スクリプトを Python 3 スクリプトに置き換えます。

  2. 健全性モニターを必要なプールに再適用し、Python 以外の一時的な健全性モニター(構成されている場合)を削除します。