目录
案例五:时钟跳变同步处理,解决因时钟跳变导致服务运行异常问题。
案例一:采集设备基本信息并写入mysql数据库
1、创建数据库表SQL语句代码如下:
CREATE TABLE 'serv_info' (
'id' int (11) NOT NULL AUTO_INCREMENT,
'host_info' varchar (50) NOT NULL,
'cpu_info' varchar (50) NOT NULL,
'disk_info' varchar (50) NOT NULL,
'mem_info' varchar (50) NOT NULL,
'ip_info' varchar (50) NOT NULL,
'mask_info' varchar (50) NOT NULL,
'gateway' varchar (50) NOT NULL,
'mark_info' varchar (50) NOT NULL,
PRIMARY KEY ('id'),
UNIQUE KEY 'ip_info' ('ip_info')
);
2、shell脚本实现服务器信息自动收集代码如下:
#!/bin/bash
echo -e "\033[34m\033[1m"
cat << EOF
++++++++Welcome to use system Collect+++++++++++++
EOF
host_info=`hostname |tail -1`
cpu_info1=`cat /proc/cpuinfo |grep "model name" |tail -l |awk -F: '{print $2}' |sed 's/^//g' |awk '{print $1, $3, $4, $6}'`
cpu_info2=`cat /proc/cpuinfo |grep "physical id" |sort |uniq -c| wc -l`
disk_info=`fdisk -l |grep "Disk /dev/sd" |grep -v "identifier" |awk '{print $2, $3, $4}'|sed 's/,//g'`
mem_info=`free -g |grep "Mem" |awk '{print $2"GB"}'`
ip_info=`ifconfig |grep "broadcast"|tail -1 |awk '{print $2}' |cut -d: -f2`
mask_info=`ifconfig |grep "broadcast"|tail -1 |awk '{print $4}'`
gateway=`ip route |grep default |awk '{print $3}'`
mark_info="IDC01"
echo -e "\033[32m -------------------------------------------------- \033[0m"
echo HOSTNAME: ${host_info}
echo CPU_INFO: ${cpu_info1} ${cpu_info2}c
echo DISK INFO: ${disk_info}
echo MEM INFO: ${mem_info}
echo IPADDR: ${ip_info}
echo MASK INFO: ${mask_info}
echo GATEWAY: ${gateway}
echo MARK INFO: ${mark_info}
echo -e "\033[32m --------------------------------------------------- \033[0m"
echo -e -n "\033[36mYou want to write the data to the databases? \033[1m"; read ensure
if [ "$ensure" == "yes" -o "$ensure" == "y" -o "$ensure" == "Y" ]; then
echo -e "\033[31mmysql -u audit -p 123456 -D audit -e 'insert into serv_info values('', '${host_info}', '${cpu_info1} ${cpu_info2}c', '${disk_info}', '${mem_info}', '${ip_info}', '${mark_info}', '${gateway}', '${mark_info}')'\033[0m"
mysql -u audit -p 123456 -D audit -e 'insert into serv_info values('', '${host_info}', '${cpu_info1} ${cpu_info2}c', '${disk_info}', '${mem_info}', '${ip_info}', '${mark_info}', '${gateway}', '${mark_info}')'
else
echo "Please wait, exit......"
exit
fi
案例二:监控操作系统运行情况
#/bin/bash
#########################准备初始化环境#########################
_work_dir=/root/tmp
#Build workdir directory
if [ ! -d ${_work_dir} ]
then
mkdir ${_work_dir}
fi
_log_dir=${_work_dir}/log
#Build log directory
if [ ! -d ${_log_dir} ]
then
mkdir ${_log_dir}
fi
touch ${_log_dir}/{check.log,warn_check.log}
_check_msg=${_log_dir}/check.log
_warn_mgs=${_log_dir}/warn_check.log
_param=(cpu_check memory_check disk_check network_check serv_kip)
function info() {
echo -e "\033[32m [INFO] \033[0m$@ "
}
function warn() {
echo -e "\033[31m [WARN] \033[0m$@"
}
#########################监控CPU使用情况#########################
function cpu_check
{
while true
do
only_cpu=`top -b -n1 |grep Cpu |awk -F ',' '{print $4}'|sed 's/%id//g' |sed 's/^//g' |cut -d. -f1 |sed 's/ //g'`
use_cpu="$(echo "scale=0;100-${only_cpu}"|bc)"
if [[ "$use_cpu" -gt "80" ]]; then
warn "`date +'[%Y-%m-%d %H:%M:%S]'` cpu use "$use_cpu"%!" >> "${_check_msg}"
else
info "`date +'[%Y-%m-%d %H:%M:%S]'` cpu use "$use_cpu"%!" >> "${_check_msg}"
fi
sleep 10
done
}
#########################监控内存使用情况#########################
function memory_check
{
while true
do
use_memory=`free -g |grep Mem |awk '{print $3,$2,$3*100/$2}' |awk '{print $3}'|awk -F. '{print $1}'`
free_cache=`free -g |grep Mem |awk '{print $7}'`
if [[ ${use_memory} -ge 95 ]] && [[ ${free_cache} -le 2 ]] ; then
warn "`date +'[%Y-%m-%d %H:%M:%S]'` memory use "$use_memory"%!" >> "${_check_msg}"
else
info "`date +'[%Y-%m-%d %H:%M:%S]'` memory use "$use_memory"%!" >> "${_check_msg}"
fi
sleep 10
done
}
#########################监控磁盘使用情况#########################
function disk_check
{
while true
do
USE_RATE_LIST=`df |awk 'BEGIN{OFS="="}/^\/dev/{print $1,int($5)}'`
for USE_RATE in $USE_RATE_LIST;
do
PART_NAME=${USE_RATE%=*}
USE_RATE=${USE_RATE#*=}
if [[ $USE_RATE -ge 95 ]]; then
warn "`date +'[%Y-%m-%d %H:%M:%S]'` $PART_NAME $USE_RATE%!" >> "${_check_msg}"
else
info "`date +'[%Y-%m-%d %H:%M:%S]'` $PART_NAME $USE_RATE%!" >> "${_check_msg}"
fi
done
sleep 120
done
}
#########################监控网络通信情况#########################
function network_check
{
while true
do
while read line
do
if ping -c 3 $line >/dev/null 2>&1 ; then
info "`date +'[%Y-%m-%d %H:%M:%S]'` $line network is normal" >> "${_check_msg}"
else
warn "`date +'[%Y-%m-%d %H:%M:%S]'` $line network is unhealthy" >> "${_check_msg}"
fi
done < ip_list
sleep 300
done
}
#####################监控操作系统运行KPI情况######################
function serv_kpi
{
while true
do
kpi_cnts=$(grep WARN ${_check_msg} |wc -l )
if [[ $kpi_cnts -lt 5 ]];then
echo > ${_warn_mgs}
else
grep WARN ${_check_msg} >>${_warn_mgs}
exit -1
fi
sleep 600
done
}
#########################脚本批量并行调用#########################
function func_reco
{
for i in $@
do
$i &
done
}
set -o errexit
func_reco ${_param[@]}
案例三:远程监控服务器CPU 运行情况
#Remote execution tool
vim cpu_check.sh
#!/bin/bash
_work_dir=/root/tmp
#Build workdir directory
if [ ! -d ${_work_dir} ]
then
mkdir ${_work_dir}
fi
_log_dir=${_work_dir}/log
#Build log directory
if [ ! -d ${_log_dir} ]
then
mkdir ${_log_dir}
fi
touch ${_log_dir}/{check.log,command.log}
_check_msg=${_log_dir}/check.log
_command_msg=${_log_dir}/command.log
_tmp_check_msg=${_log_dir}/tmp_check.log
function info() {
echo -e "\033[32m [INFO] \033[0m$@ "
}
function warn() {
echo -e "\033[31m [WARN] \033[0m$@"
}
# LAN SERVERS
LANSERVER=(
192.168.31.214,test01
192.168.31.215,test02
) #填写IP与主机名
_REMOTE_UN="luojie" #填写登入用户名
_REMOTE_PW="123456" #填写登入密码
_ROOT_PW="" #填写root密码
_CMD="top -b -n1 |grep Cpu" #填写需要执行的指令
# CHECK CPU
while true
do
for ((i=0; i< ${#LANSERVER[*]}; i++))
do
_REMOTE_IP=`echo "${LANSERVER[$i]}" |awk -F ',' '{print $1}'`
_REMOTE_NAME=`echo "${LANSERVER[$i]}" |awk -F ',' '{print $2}'`
if [ "$_ROOT_PW" = "" ]; then
expect common_user.exp "${_REMOTE_NAME}" "${_REMOTE_IP}" "${_REMOTE_UN}" "${_REMOTE_PW}" "${_CMD}" > ${_tmp_check_msg}
else
expect root_user.exp "${_REMOTE_NAME}" "${_REMOTE_IP}" "${_REMOTE_UN}" "${_REMOTE_PW}" "${_ROOT_PW}" "${_CMD}" > ${_tmp_check_msg}
fi
if [ $? -eq 0 ];then
info "`date +'[%Y-%m-%d %H:%M:%S]'` Check ${_REMOTE_IP} ************* Command ************** [success]" |tee -a ${_command_msg}
else
warn "`date +'[%Y-%m-%d %H:%M:%S]'` Check ${_REMOTE_IP} ************* Command ************** [failure]" |tee -a ${_command_msg}
fi
_ONLY_CPU=`cat ${_tmp_check_msg} |grep Cpu |grep -v top |awk -F ',' '{print $4}'|sed 's/%id//g' |sed 's/^//g' |cut -d. -f1 |sed 's/ //g'`
_USE_CPU="$(echo "scale=0;100-${_ONLY_CPU}"|bc)"
if [[ "$_USE_CPU" -gt "80" ]]; then
warn "`date +'[%Y-%m-%d %H:%M:%S]'` cpu use "$_USE_CPU"%!" >> "${_check_msg}"
else
info "`date +'[%Y-%m-%d %H:%M:%S]'` cpu use "$_USE_CPU"%!" >> "${_check_msg}"
fi
done
sleep 10
done
#remote common_user.exp
vim common_user.exp
#!/usr/bin/expect -f
set timeout 5
set host_name [lindex $argv 0]
set host_ip [lindex $argv 1]
set host_un [lindex $argv 2]
set host_pw [lindex $argv 3]
set CMD [lindex $argv 4]
set login_flag 1
spawn ssh ${host_un}@${host_ip}
expect {
"yes/no" {send "yes\r"; exp_continue}
"password:" {send "${host_pw}\r"}
"Password:" {send "${host_pw}\r"}
}
expect {
"${host_name}" {set login_flag 0 ;send "${CMD}\r"}
expect eof
}
send "exit\r"
expect eof
exit $login_flag
#remote root_user.exp
vim root_user.exp
#!/usr/bin/expect -f
set timeout 5
set host_name [lindex $argv 0]
set host_ip [lindex $argv 1]
set host_un [lindex $argv 2]
set host_pw [lindex $argv 3]
set root_pw [lindex $argv 4]
set CMD [lindex $argv 5]
set login_flag 1
spawn ssh ${host_un}@${host_ip}
expect {
"yes/no" {send "yes\r"; exp_continue}
"password:" {send "${host_pw}\r"}
"Password:" {send "${host_pw}\r"}
}
expect {
"${host_name}" {set login_flag 0 ;send "su -\r"; exp_continue}
"password:" {send "${root_pw}\r"}
"Password:" {send "${root_pw}\r"}
}
expect {
"*${host_name}*#" {set login_flag 0 ;send "${CMD}\r"}
expect eof
}
send "exit\r"
expect eof
exit $login_flag
案例四:Bind DNS 管理脚本工具
#-------------------------------------------------------#
#config _FILE bind server
#/etc/logrotate.d/named
#/etc/named.conf
#/etc/named.rfc1912.zones
#/etc/named.root.key
#/etc/rndc.key
#/etc/rwtab.d/named
#/etc/sysconfig/named
#/var/named/named.ca
#/var/named/named.empty
#/var/named/named.localhost
#/var/named/named.loopback
#-------------------------------------------------------#
#!/bin/bash
#Auto install config bind server
#By author jfedu.net 2017
Define Path variables
BND_ETC=/etc
BND_VAR=/var/named
BAK_DIR =/data/backup/dns 'date +%Y%m%d-M'
#Backup named server
if [!-d $BAK_DIR]; then
echo "Please waiting Backup Named Config............"
mkdir -p $BAK_DIR
cp -a /var/named/.* $BAK_DIR
cp -a /etc/named.* $BAK_DIR
fi
Define Shell Install Function
Install ()
{
if [ ! -e /usr/sbin/named ]; then
yum -y install bind*
else
echo -----------------------------------------------------
echo "The Named Server is exists,Please exit........."
sleep 1
fi
}
##Define Shell Init Function
Init_Config ()
{
sed -i -e 's/localhost;/any;/g' -e '/port/s/127.0.0.1/any/g' /etc/named.conf
echo -----------------------------------------------------
sleep 1
echo "The named.conf config Init success !"
}
#Define Shell Add Name Function
Add_named ()
{
##DNS name
read -p "Please Insert Into Your Add Name, Example 51cto.com : "_NAME
echo $_NAME |grep -E "com|cn|net|org"
while [ "$?" -ne 0 ]
do
read -p "Please reInsert Into Your Add Name, Example 51cto.com : "_NAME
echo $_NAME |grep -E "com|cn|net|org"
done
##IP address
read -p "Please Insert Into Your Name Server IP address: "_IP
echo $_IP egrep -o "([0-9]{1,3}\.){3}[0-9]{1,3}"
while [ "$?" -ne "0" ]
do
read -p "Please Insert Into Your Name Server IP address: "_IP
echo $_IP egrep -o "([0-9]{1,3}\.){3}[0-9]{1,3}"
done
_ARPA_IP = 'echo $_IP |awk -F. '(print $3"."$2"."$1)''
_ARPA_IP1 = 'echo $_IP |awk -F. '(print $4)''
cd $BND_ETC
grep "$_NAME" named.rfc1912.zones
if [ $?-eq 0 ]; then
echo "The $_NAME IS exist named.rfc1912.zones conf,please exit..."
exit
else
read -p "Please Insert Into _SLAVE Name Server IP address: "_SLAVE
echo $_SLAVE |egrep -o "([0-9]{1,3}\.){3}[0-9]{1,3}"
while [ "$?" -ne "0" ]
do
read -p "Please Insert Into _SLAVE Name Server IP address: "_SLAVE
echo $_SLAVE |egrep -o "([0-9]{1,3}\.){3}[0-9]{1,3}"
done
grep "rev" named.rfc1912.zones
if [ $?-ne 0 ];then
cat >named.rfc1912.zones <EOF
#'date +%Y-%m-%d'Add $_NAME CONFIG
zone "$_NAME" IN {
type master;
_FILE "$_NAME.zone";
allow - update { none; };
};
zone "$_ARPA_IP.in-addr.arpa" IN {
type master;
_FILE "$_ARPA_IP.rev";
allow - update { none; };
};
EOF
else
cat >named.rfc1912.zones <EOF
#'date +%Y-%m-%d'Add $_NAME CONFIG
zone "$_NAME" IN {
type master;
_FILE "$_NAME.zone";
allow - update { none; };
};
EOF
fi
fi
[ $? -eq 0 ] && echo "The $_NAME config name.rfc1912.zones success !"
sleep 3 ;echo "please waiting config $_NAME zone _FILE............."
cd $BND_VAR
read -p "Please insert Name DNS A HOST EXample www or mail : "_HOST
read -p "Please insert Name DNS A NS IP ADDR EXample 192.168.111.130 : "_IP_HOST
echo $_IP_HOST |egrep -o "([0-9]{1,3}.){3}[0-9]{1,3}"
ARPA_IP2 'echo |$_IP_HOST |awk -F. '(print $3"."$2"."$1)''
ARPA_IP3 'echo |$_IP_HOST |awk -F. '(print $4)''
while [ "$?" -ne "0" ]
do
read -p "Please insert Name DNS A NS IP ADDR EXample 192.168.111.130 : "_IP_HOST
echo $_IP_HOST |egrep -o "([0-9]{1,3}.){3}[0-9]{1,3}"
done
cat $_NAME.zone <EOF
\$TTL 1D
@ IN SOA qitu.com. rname.invalid. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
@ IN NS dns.qitu.com //DNS服务器地址
@ IN A 127.0.0.1
@ IN AAAA : : 1
www IN A 192.168.31.103 //www的域名正向解析的地址
EOF
REV='ls *.rev'
ls *.rev >>/dev/null
if [ $? -ne 0 ];then
cat >$_ARPA_IP.rev <EOF
\$TTL 1D
@ IN SOA qitu.com. rname.invalid. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
@ IN NS dns.qitu.com //DNS服务器地址
192.168.31.103 IN PTR www //www的域名反向解析的地址
EOF
echo "$_HOST IN A $_IP_HOST">>$_NAME.zone
echo "$ARPA_IP3 IN PTR $_HOST.$_NAME.">>$_ARPA_IP.rev
[ $? -eq 0 ] && echo -e "The $_NAME config success: \n$_HOST IN A $_IP_HOST\n $_ARPA_IP3 IN PTR $_HOST.$_NAME."
else
sed -i "9a IN NS $_NAME." $REV
echo "$_HOST IN A $_IP_HOST" >>$_NAME.zone
echo "$_ARPA_IP3 IN PTR $_HOST.$_NAME.">$REV
[ $? -eq 0 ] && echo -e "The $_NAME config success!: \n $_HOST IN A $_IP_HOST\n $_ARPA_IP3 IN PTR $_HOST.$_NAME."
fi
}
#Define Shell List A Function
Add_A_List ()
{
if
cd $BND_VAR
REV='ls *.rev'
read -p "Please Insert Into Your Add Name,Example 51cto.com: "_NAME
[ ! -e "$_NAME.zone" ]; then
echo "The $_NAME.zone _FILE is not exist,Please ADD $_NAME.zone FILE: "
Add_named ;
else
read -p "Please Enter List Name A NS _FILE Example /tmp/name_list.txt: "_FILE
if [ -e $_FILE ]; then
for i in 'cat $_FILE |awk '(print $2)' |sed "s/$_NAME//g" |sed 's/.$//g''
do
j='awk -v I="$i.$_NAME"'(if(I==$2)print $1)' $_FILE'
echo -----------------------------------------------------
echo "The $_NAME.zone _FILE is exist Please Enter insert NAME HOST ...."
sleep 1
_ARPA_IP = 'echo $j |awk -F. '(print $3"."$2"."$1)''
_ARPA_IP2 = 'echo $j |awk -F. '(print $4)''
echo "$i IN A $j" >>$_NAME.zone
echo "$_ARPA_IP2 IN PTR $i.$_NAME." >$REV
[ $? -eq 0 ] && echo -e "The $_NAME config success: \n $i IN A $j\n $_ARPA_IP2 IN PTR $i.$_NAME."
done
else
echo "The $_FILE List _FILE IS Not Exist .......Please exit..."
fi
fi
#Define Shell Select Menu
PS3 "Please select Menu Name Config: "
select i in "自动安装Bind服务""自动初始化Bind配置""添加解析域名""批量添加A记录"
do
case $i in
"自动安装Bind服务")
Install
;;
"自动初始化Bind配置")
Init_Config
;;
"添加解析域名")
Add_named
;;
"批量添加A记录")
Add_A_List
;;
* )
echo -----------------------------------------------------
sleep 1
echo "Please exec: sh $0 {Install(1) or Init Config(2) or Add named(3) or Add config A(4)}"
;;
esac
done
案例五:时钟跳变同步处理,解决因时钟跳变导致服务运行异常问题。
#!/bin/bash
#每5分钟做一下时间的变更,时钟合计快320秒,脚本每次执行缩小10秒,直至同步完成。
while true
do
aaa=`ntpq -p |grep -v off |awk '{print $9}' |sed '/^$/d' |cut -d. -f 1`
if [ $aaa -lt -1000 ] ;then
echo `date +"%T" --date='-10 second'`|xargs date -s
elif [ $aaa -gt 1000 ] ;then
echo `date +"%T" --date='+10 second'`|xargs date -s
else
exit 1
fi
sleep 300
done