本节介绍了外部运行状况监控器类型的特定配置。

外部监控器类型允许您编写脚本以提供高度自定义和精细的运行状况检查。脚本可能是 Linux Shell、Python 或 Perl,它们可用于执行 wgetnetcatcurlsnmpgetmysql-clientdig。外部监控器限制了对 CPU 和内存等资源的访问,以确保 NSX Advanced Load Balancer 服务引擎正常运行。与任何自定义脚本一样,在将实施的脚本指向生产服务器之前,请全面验证该脚本的长期稳定性。

您可以导航到运维 > 事件日志以在输出中查看脚本生成的错误。

NSX Advanced Load Balancer 通过 System-Xternal Perl、Python 和 Shell 监控器包含三个示例脚本。

注:

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 查询数据库,解析响应以查找提供的行和列所在的单元格,并将其与提供的字符串进行匹配。如果匹配,则将服务器标记为 UP,否则,将服务器标记为 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_USERNAMERAD_PASSWORD,例如:

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

对于 v4 和 v6 地址,curl 等应用程序可能使用不同的语法。外部运行状况监控器脚本必须识别这些语法。这些示例如下所示:

使用域名

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 的 Shell 脚本示例

#!/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 标记,则将服务器标记为关闭,原因是外部运行状况监控器出现错误而失败。

请考虑以下示例以了解如何在 NSX Advanced Load Balancer 中处理错误。这是一个使用 Python 脚本编写的外部运行状况监控器,用于建立 HTTP 连接。

#!/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)

可能有两种结果。

  • 如果此时未建立 HTTP 连接,将使用外部 HM 发生故障并显示错误报告错误。在响应字符串中,还会输出原因,例如,连接被拒绝。

  • 如果已建立连接,并且 NSX Advanced Load Balancer 获得响应,但响应不是 200,则仍会生成错误。

可以根据需要修改自定义脚本。

从图中可以看出,显示了 ext_hm_usr_err_msg 标记以及错误。此处,错误是 HTTP get request failed with (Errno 111) Connection refused



服务器标记为关闭,原因是“404 找不到”,如下所示:

SE 软件包列表

以下是脚本语言:

  • Bash(Shell 脚本)

  • 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 
注:

ntpdatentpq 程序未打包在服务引擎中,因此,目前无法使用。

升级到 Python 3.0

NSX Advanced Load Balancer 20.1.1 版本开始,NSX Advanced Load Balancer 控制器 和服务引擎使用 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 运行状况监控器(如果配置)。