Linux集群和自动化维2.6.4 开发类脚本

2.6.4 开发类脚本

业务需求在不断地变化,有时候互联网上的开源方案并不能全部解决,这个时候就需要自己写一些开发类的脚本来满足工作中的需求了,虽然很多时候脚本都可以独立运行,但笔者的做法还是尽量将其return结果写成Nagios能够识别的格式,以便配合Nagios发送报警邮件和信息。

1.监测redis是否正常运行

笔者接触的线上NoSQL业务主要是redis数据库,多用于处理大量数据的高访问负载需求。为了最大化地利用资源,每个redis实例分配的内存并不是很大,有时候程序组的同事导入数据量大的IP list时会导致redis实例崩溃,所以笔者开发了一个redis监测脚本并配合Nagios进行工作,脚本内容如下所示(此脚本在Amazon Linux AMI x86_64下已测试通过):

#!/usr/bin/python

#Check redis
Nagios Plungin,Please install the redis-py module.

import redis

import sys

 

STATUS_OK = 0

STATUS_WARNING =
1

STATUS_CRITICAL
= 2

 

HOST =
sys.argv[1]

PORT =
int(sys.argv[2])

WARNING =
float(sys.argv[3])

CRITICAL =
float(sys.argv[4])

 

def
connect_redis(host, port):

    r = redis.Redis(host, port, socket_timeout
= 5, socket_connect_timeout = 5)

    return r

 

def main():

    r = connect_redis(HOST, PORT)

    try:

        r.ping()

    except:

        print HOST,PORT,'down'

        sys.exit(STATUS_CRITICAL)

 

    redis_info = r.info()

    used_mem =
redis_info['used_memory']/1024/1024/1024.0

    used_mem_human =
redis_info['used_memory_human']

 

    if WARNING <= used_mem < CRITICAL:

        print HOST,PORT,'use memory
warning',used_mem_human

        sys.exit(STATUS_WARNING)

    elif used_mem >= CRITICAL:

        print HOST,PORT,'use memory
critical',used_mem_human

        sys.exit(STATUS_CRITICAL)

    else:

        print HOST,PORT,'use memory
ok',used_mem_human

        sys.exit(STATUS_OK)

 

if __name__ ==
'__main__':

    main()

2.监测机器的IP连接数

需求其实比较简单,先统计IP连接数,如果ip_conns值小于15 000则显示为正常,介于15 000至20 000之间为警告,如果超过20 000则报警,脚本内容如下所示(此脚本在Amazon Linux AMI x86_64下已测试通过):

#!/bin/bash

#Nagios plugin
For ip connects

#$1 = 15000 $2 =
20000

ip_conns=`netstat
-an | grep tcp | grep EST | wc -l`

messages=`netstat
-ant | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'|tr -s '\n' ',' |
sed -r 's/(.*),/\1\n/g' `

 

if [ $ip_conns
-lt $1 ]

then

    echo "$messages,OK -connect counts is
$ip_conns"

    exit 0

fi

if [ $ip_conns
-gt $1 -a $ip_conns -lt $2 ]

then

    echo "$messages,Warning -connect
counts is $ip_conns"

    exit 1

fi

if [ $ip_conns
-gt $2 ]

then

    echo "$messages,Critical -connect
counts is $ip_conns"

    exit 2

fi

3.监测机器的CPU利用率脚本

线上的bidder业务机器,在业务繁忙的高峰期会出现CPU利用率达到100%(sys%+ user%),导致后面的流量打在上面却完全进不去的情况,但此时机器、系统负载及Nginx+Lua进程都是完全正常的,所以这种情况下需要开发一个CPU利用率脚本,在超过自定义阀值时报警,方便运维人员批量添加bidder AMI机器以应对峰值,AWS EC2实例机器是可以以小时来计费的,大家在这里也要注意分清系统负载和CPU利用率之间的区别。脚本内容如下所示(此脚本在Amazon Linux AMI x86_64下已测试通过):

#!/bin/bash

#
==============================================================================

# CPU
Utilization Statistics plugin for Nagios

#

# USAGE     :  
./check_cpu_utili.sh [-w <user,system,iowait>] [-c
<user,system,iowait>] ( [ -i <intervals in second> ] [ -n
<report number> ])

#          

# Exemple:
./check_cpu_utili.sh

#          ./check_cpu_utili.sh -w 70,40,30 -c
90,60,40

#          ./check_cpu_utili.sh -w 70,40,30 -c
90,60,40 -i 3 -n 5

#-------------------------------------------------------------------------------

# Paths to
commands used in this script.  These may
have to be modified to match your system setup.

IOSTAT="/usr/bin/iostat"

 

# Nagios return
codes

STATE_OK=0

STATE_WARNING=1

STATE_CRITICAL=2

STATE_UNKNOWN=3

 

# Plugin
parameters value if not define

LIST_WARNING_THRESHOLD="70,40,30"

LIST_CRITICAL_THRESHOLD="90,60,40"

INTERVAL_SEC=1

NUM_REPORT=1

# Plugin
variable description

PROGNAME=$(basename
$0)

 

if [ ! -x
$IOSTAT ]; then

    echo
"UNKNOWN: iostat not found or is not executable by the nagios user."

    exit $STATE_UNKNOWN

fi

 

print_usage() {

        echo ""

        echo "$PROGNAME $RELEASE - CPU
Utilization check script for Nagios"

        echo ""

        echo "Usage: check_cpu_utili.sh -w
-c (-i -n)"

        echo ""

        echo "  -w 
Warning threshold in % for warn_user,warn_system,warn_iowait CPU
(default : 70,40,30)"

        echo "  Exit with WARNING status if cpu exceeds
warn_n"

        echo "  -c 
Critical threshold in % for crit_user,crit_system,crit_iowait CPU
(default : 90,60,40)"

        echo "  Exit with CRITICAL status if cpu exceeds
crit_n"

        echo "  -i 
Interval in seconds for iostat (default : 1)"

        echo "  -n 
Number report for iostat (default : 3)"

        echo "  -h 
Show this page"

        echo ""

    echo "Usage: $PROGNAME"

    echo "Usage: $PROGNAME --help"

    echo ""

    exit 0

}

 

print_help() {

    print_usage

        echo ""

        echo "This plugin will check cpu
utilization (user,system,CPU_Iowait in %)"

        echo ""

    exit 0

}

 

# Parse
parameters

while [ $# -gt 0
]; do

    case "$1" in

        -h | --help)

            print_help

            exit $STATE_OK

            ;;

        -v | --version)

                print_release

                exit $STATE_OK

                ;;

        -w | --warning)

                shift

                LIST_WARNING_THRESHOLD=$1

                ;;

        -c | --critical)

               shift

                LIST_CRITICAL_THRESHOLD=$1

                ;;

        -i | --interval)

               shift

               INTERVAL_SEC=$1

                ;;

        -n | --number)

               shift

               NUM_REPORT=$1

                ;;       

        *) 
echo "Unknown argument: $1"

            print_usage

            exit $STATE_UNKNOWN

            ;;

        esac

shift

done

 

# List to Table
for warning threshold (compatibility with

TAB_WARNING_THRESHOLD=(`echo
$LIST_WARNING_THRESHOLD | sed 's/,/ /g'`)

if [
"${#TAB_WARNING_THRESHOLD[@]}" -ne "3" ]; then

    echo "ERROR : Bad count parameter in
Warning Threshold"

    exit $STATE_WARNING

else 

USER_WARNING_THRESHOLD=`echo
${TAB_WARNING_THRESHOLD[0]}`

SYSTEM_WARNING_THRESHOLD=`echo
${TAB_WARNING_THRESHOLD[1]}`

IOWAIT_WARNING_THRESHOLD=`echo
${TAB_WARNING_THRESHOLD[2]}`

fi

 

# List to Table
for critical threshold

TAB_CRITICAL_THRESHOLD=(`echo
$LIST_CRITICAL_THRESHOLD | sed 's/,/ /g'`)

if [
"${#TAB_CRITICAL_THRESHOLD[@]}" -ne "3" ]; then

    echo "ERROR : Bad count parameter in
CRITICAL Threshold"

    exit $STATE_WARNING

else

USER_CRITICAL_THRESHOLD=`echo
${TAB_CRITICAL_THRESHOLD[0]}`

SYSTEM_CRITICAL_THRESHOLD=`echo
${TAB_CRITICAL_THRESHOLD[1]}`

IOWAIT_CRITICAL_THRESHOLD=`echo
${TAB_CRITICAL_THRESHOLD[2]}`

fi

 

if [
${TAB_WARNING_THRESHOLD[0]} -ge ${TAB_CRITICAL_THRESHOLD[0]} -o
${TAB_WARNING_THRESHOLD[1]} -ge ${TAB_CRITICAL_THRESHOLD[1]} -o
${TAB_WARNING_THRESHOLD[2]} -ge ${TAB_CRITICAL_THRESHOLD[2]} ]; then

  echo "ERROR : Critical CPU Threshold
lower as Warning CPU Threshold "

  exit $STATE_WARNING

fi

 

CPU_REPORT=`iostat
-c $INTERVAL_SEC $NUM_REPORT | sed -e 's/,/./g' | tr -s ' ' ';' | sed '/^$/d' |
tail -1`

CPU_REPORT_SECTIONS=`echo
${CPU_REPORT} | grep ';' -o | wc -l`

CPU_USER=`echo
$CPU_REPORT | cut -d ";" -f 2`

CPU_SYSTEM=`echo
$CPU_REPORT | cut -d ";" -f 4`

CPU_IOWAIT=`echo
$CPU_REPORT | cut -d ";" -f 5`

CPU_STEAL=`echo
$CPU_REPORT | cut -d ";" -f 6`

CPU_IDLE=`echo
$CPU_REPORT | cut -d ";" -f 7`

NAGIOS_STATUS="user=${CPU_USER}%,system=${CPU_SYSTEM}%,iowait=${CPU_IOWAIT}%,idle=${CPU_IDLE}%"

NAGIOS_DATA="CpuUser=${CPU_USER};${TAB_WARNING_THRESHOLD[0]};${TAB_CRITICAL_THRESHOLD[0]};0"

 

CPU_USER_MAJOR=`echo
$CPU_USER| cut -d "." -f 1`

CPU_SYSTEM_MAJOR=`echo
$CPU_SYSTEM | cut -d "." -f 1`

CPU_IOWAIT_MAJOR=`echo
$CPU_IOWAIT | cut -d "." -f 1`

CPU_IDLE_MAJOR=`echo
$CPU_IDLE | cut -d "." -f 1`

 

# Return

if [
${CPU_USER_MAJOR} -ge $USER_CRITICAL_THRESHOLD ]; then

        echo "CPU STATISTICS
OK:${NAGIOS_STATUS} | CPU_USER=${CPU_USER}%;70;90;0;100"

        exit $STATE_CRITICAL

    elif [ ${CPU_SYSTEM_MAJOR} -ge
$SYSTEM_CRITICAL_THRESHOLD ]; then

        echo "CPU STATISTICS
OK:${NAGIOS_STATUS} | CPU_USER=${CPU_USER}%;70;90;0;100"

        exit $STATE_CRITICAL

    elif [ ${CPU_IOWAIT_MAJOR} -ge
$IOWAIT_CRITICAL_THRESHOLD ]; then

        echo "CPU STATISTICS
OK:${NAGIOS_STATUS} | CPU_USER=${CPU_USER}%;70;90;0;100"

        exit $STATE_CRITICAL

    elif [ ${CPU_USER_MAJOR} -ge
$USER_WARNING_THRESHOLD ] && [ ${CPU_USER_MAJOR} -lt $USER_CRITICAL_THRESHOLD
]; then

        echo "CPU STATISTICS
OK:${NAGIOS_STATUS} | CPU_USER=${CPU_USER}%;70;90;0;100"

        exit $STATE_WARNING

      elif [ ${CPU_SYSTEM_MAJOR} -ge
$SYSTEM_WARNING_THRESHOLD ] && [ ${CPU_SYSTEM_MAJOR} -lt
$SYSTEM_CRITICAL_THRESHOLD ]; then

        echo "CPU STATISTICS
OK:${NAGIOS_STATUS} | CPU_USER=${CPU_USER}%;70;90;0;100"

        exit $STATE_WARNING

      elif 
[ ${CPU_IOWAIT_MAJOR} -ge $IOWAIT_WARNING_THRESHOLD ] && [
${CPU_IOWAIT_MAJOR} -lt $IOWAIT_CRITICAL_THRESHOLD ]; then

        echo "CPU STATISTICS
OK:${NAGIOS_STATUS} | CPU_USER=${CPU_USER}%;70;90;0;100"

        exit $STATE_WARNING

else

      

        echo "CPU STATISTICS
OK:${NAGIOS_STATUS} | CPU_USER=${CPU_USER}%;70;90;0;100"

        exit $STATE_OK

fi

此脚本参考了Nagios的官方文档https://exchange.nagios.org/并进行了代码精简和移值,源代码是运行在ksh下面的,这里将其移植到了bash下面,ksh下定义数组的方式跟bash还是有区别的;另外有一点也请大家注意,Shell本身是不支持浮点运算的,但可以通过bc或awk的方式来处理。

另外,若要配合PNP4nagios出图(PNP4nagios可以观察一段周期内的CPU利用率峰值),此脚本还可以更精简,脚本内容如下所示(此脚本在Amazon Linux AMI x86_64下已测试通过):

#!/bin/bash

# Nagios return
codes

STATE_OK=0

STATE_WARNING=1

STATE_CRITICAL=2

STATE_UNKNOWN=3

 

# Plugin
parameters value if not define

LIST_WARNING_THRESHOLD="90"

LIST_CRITICAL_THRESHOLD="95"

INTERVAL_SEC=1

NUM_REPORT=5

 

CPU_REPORT=`iostat
-c $INTERVAL $NUM_REPORT  | sed -e
's/,/./g' | tr -s ' ' ';' | sed '/^$/d' |tail -1`

CPU_REPORT_SECTIONS=`echo
${CPU_REPORT} | grep ';' -o | wc -l`

CPU_USER=`echo $CPU_REPORT
| cut -d ";" -f 2`

CPU_SYSTEM=`echo
$CPU_REPORT | cut -d ";" -f 4`

# Add for
integer shell issue

CPU_USER_MAJOR=`echo
$CPU_USER | cut -d "." -f 1`

CPU_SYSTEM_MAJOR=`echo
$CPU_SYSTEM | cut -d "." -f 1`

CPU_UTILI_COU=`echo
${CPU_USER} + ${CPU_SYSTEM}|bc`

CPU_UTILI_COUNTER=`echo
$CPU_UTILI_COU | cut -d "." -f 1`

 

# Return

if [
${CPU_UTILI_COUNTER} -lt ${LIST_WARNING_THRESHOLD} ]

then

    echo "OK - CPUCOU=${CPU_UTILI_COU}% |
CPUCOU=${CPU_UTILI_COU}%;80;90"

    exit ${STATE_OK}

fi

if [
${CPU_UTILI_COUNTER} -gt ${LIST_WARNING_THRESHOLD} -a ${CPU_UTILI_COUNTER} -lt
${LIST_CRITICAL_THRESHOLD} ]

then

    echo "Warning -
CPUCOU=${CPU_UTILI_COUNTER}% | CPUCOU=${CPU_UTILI_COUNTER}%;80;90"

    exit ${STATE_WARNING}

fi

if [
${CPU_UTILI_COUNTER} -gt ${LIST_CRITICAL_THRESHOLD} ]

then

   echo "Critical -
CPUCOU=${CPU_UTILI_COUNTER}% | CPUCOU=${CPU_UTILI_COUNTER}%;80;90"

    exit ${STATE_CRITICAL}

fi

时间: 2024-09-16 11:01:16

Linux集群和自动化维2.6.4 开发类脚本的相关文章

Linux集群和自动化维2.2.1 Shell脚本的基本元素

2.2.1 Shell脚本的基本元素 Shell脚本的第一行通常为如下内容: #!/bin/bash  //第一行 #          //表示单行注释 如果是多行注释呢,应该如何操作?多行注释如下所示: :<<BLOCK 中间部分为要省略的内容 BLOCK Shell脚本的第一行均包含一个以#!为起始标志的文本行,这个特殊的起始标志表示当前文件包含一组命令,需要提交给指定的Shell解释执行.紧随#!标志的是一个路径名,指向执行当前Shell脚本文件的命令解释程序.比如: #!/bin/b

Linux集群和自动化维导读

Preface  前言 为什么要写这本书 笔者从事系统运维和网站架构设计的工作已有10多年,现在在一家外企担任云平台架构师.云计算是现在的主流技术,未来也有很好的发展趋势,云计算的流行对于传统的运维知识体系来说,其实也造成了冲击,有很多读者经常向笔者咨询工作中的困惑,比如从事系统运维工作3-5年后就不知道该如何继续学习和规划自己的职业生涯了.因此笔者想通过此书,跟大家分享一下自己的工作经验和心得(包括传统运维和云平台运维工作的区别与对比),以期解决大家在工作中的困惑.本书提供了大量项目实践和线上

Linux集群和自动化维2.6 生产环境下的Shell和Python脚本分类

2.6 生产环境下的Shell和Python脚本分类 生产环境下的Shell和Python脚本的作用还是挺多的,这里根据2.1节所介绍的日常工作中Shell脚本的作用,将生产环境下的Shell脚本分为备份类.监控类.统计类.运维开发类和自动化运维类.前面3类从字面意义上看比较容易理解,后面的两类需要稍微解释一下,运维开发类脚本是利用Shell或Python实现一些非系统类的管理工作,比如SVN的发布程序等:而自动化运维类脚本则是利用Shell或Python来自动替我们做一些烦琐的工作,比如自动生

Linux集群和自动化维1.3 如何根据服务器应用选购服务器

1.3 如何根据服务器应用选购服务器   无论物理服务器是选用IDC托管还是AWS EC2云主机(以下为了简略说明,将它们统称为服务器),我们都要面临一个问题,那就是选择服务器的硬件配置,选购硬件配置时要根据服务器的应用需求而定.因为只通过一台服务器是无法满足所有的需求,并解决所有的问题的.在设计网站的系统架构之前,应该从以下方面考虑如何选购服务器: 服务器要运行什么应用. 需要支持多少用户访问. 需要多大空间来存储数据. 业务有多重要. 服务器网卡方面的考虑. 安全方面的考虑. 机架安排是否合

Linux集群和自动化维3.7.2 线上环境中的Fabric应用实例

3.7.2 线上环境中的Fabric应用实例 笔者线上的核心业务机器统一都是AWS EC2主机,机器数量较多,每个数据中心都部署了Fabric跳板机(物理拓扑图可参考图3-3),系统为Amazon Linux,内核版本为3.14.34-27.48.amzn1.x86_64,Python版本为Python 2.6.9. 如果公司项目组核心开发人员离职,线上机器就都要更改密钥,由于密钥一般是以组的形式存在的,再加上机器数量繁多,因此单纯通过技术人员手工操作,基本上是一项不可能完成的任务,但若是通过F

Linux集群和自动化维1.4.4 Linux下CPU使用率与机器负载的关系与区别

1.4.4 Linux下CPU使用率与机器负载的关系与区别  笔者的线上竞标业务机器,在业务最繁忙的一段周期内,发现Nginx单机并发活动的连接数超过了2.6万,机器负载(基本上不到4,Nagios监控系统并没有发送报警邮件和短信)和Nginx+Lua服务都是正常的,网卡流量并没有打满,但流量就是怎么也打不进去.经过深入观察,发现这段时期内每台机器的CPU利用率都已经很高了,基本都维持在99%-100%左右,这种情况应该是CPU资源耗尽了,导致不能再继续提供服务,所以这里有必要研究下CPU负载和

Linux集群和自动化维2.6.2 统计类脚本

2.6.2 统计类脚本 统计工作一直是Shell和Python脚本的强项,我们完全可以利用sed.awk再加上正则表达式,写出强大的统计脚本来分析我们的系统日志.安全日志及服务器应用日志等. 1. Nginx负载均衡器日志汇总脚本 以下脚本是用来分析Nginx负载均衡器的日志的,作为Awstats的补充,它可以快速得出排名最前的网站和IP等,脚本内容如下(此脚本在CentOS 5.8/6.4 x86_64下均已测试通过): #!/bin/bash   if [ $# -eq 0 ]; then

Linux集群和自动化维2.6.5 自动化类脚本

2.6.5 自动化类脚本 1.批量生成账户脚本 在内网开发环境中,有时需要为开发组的同事批量生成账户,如果手动添加的话会非常麻烦,这时可以写一段Shell脚本来自动完成这项工作.在首次登录时密码均是统一的,在移交给开发人员使用时让他们自行更改即可,脚本代码如下(此脚本在CentOS 5.8 / 6.4 x86_64下均已测试通过): #!/bin/bash #此脚本应用于开发环境下批量生成用户 for name in tom jerry joe jane yhc brain do       u

Linux集群和自动化维2.3 Shell中的控制流结构

2.3 Shell中的控制流结构 Shell中的控制流结构也比较清晰,如下所示: if ...then... else...fi语句 case语句 for循环 until循环 while循环 break控制 continue控制 工作中用得最多的就是if语句.for循环.while循环及case语句,大家可以以这几个为重点对象来学习. if语句语法如下: if 条件1 then   命令1 else   命令2 fi if语句的进阶用法: if 条件1 then     命令1       el