PUPPET-通过配置服务器对多台服务器巡检
2013年马上就要过去,新年即将来临,为了可以过一个安稳的新年,年前要对公司生产服务器做一次全面巡检,记录每台服务器状态,确保不会出现故障。
目标分析:
操作方向:
1、使用脚本来收集各个服务器状态
2、通过ftp统一收集
3、通过puppet配置服务器进行管理部署
4、人工分析数据
一、服务器巡检脚本
脚本巡检资源:
1、操作系统检查
a) 操作系统版本
b) 网络配置
c) 任务计划列表
2、性能检查
a) 系统负载
b) 内存使用状况
c) 磁盘空间
d) 进程资源
3、安全检查
a) 当前登录用户
b) 系统运行时间
c) 系统账户检查
d) 系统开放端口
e) 系统服务状态
f) 防火墙列表
4、硬件检查
a) 内存型号、插槽数量
b) 网卡型号、网卡驱动
c) Cpu型号、数量及主频
各个监控项按照统一格式输出,筛选出重要信息,剔除多余信息。并通过脚本生成报告自动上传ftp,文件名安装<时间+主机名>.doc结尾。
脚本详解:
#!/bin/bash #变量需先声明才能使用 shopt -s -o nounset date1=`date +%Y%m%d` # mkdir Directory #判断/mnt/backup下是否存在已当前日期的文件夹,如果没有则创建,有则跳过 if [ -e /mnt/backup/$date1 ] ; then : else mkdir -p /mnt/backup/$date1 fi # Hostname #定义主机名,生成文件调用 HostCmd="/bin/hostname" HostName=$($HostCmd) Name=${HostName%%.*} # Operatig system checks #检测系统当前版本 # Version check_version (){ echo "Sytem Version:" kernel=`uname -a | awk '{print $3}'` hostname=`uname -a | awk '{print $2}'` bit=`uname -a | awk '{print $14}'` echo "System Kernel:" $kernel echo "System Hostname:" $hostname #判断当前系统版本位数 if [ $bit = x86_64 ]; then echo "System Bit: 64位." else echo "System Bit: 32位." fi } # Network #定义网络配置,截取ip地址,mac地址,rx,tx信息,忽略其他信息 check_network () { echo "System Network:" ip_addr=`ifconfig -a | grep eth0 -C 8 | grep inet | awk '{print $2}' | awk -F: '{print $2}'` ip_mac=`ifconfig -a | grep eth0 | awk '{print $5}'` ip_rx_packets=`ifconfig | grep eth0 -C 8 | grep "RX packets"` ip_tx_packets=`ifconfig | grep eth0 -C 8 | grep "TX packets"` ip_rx_bytes=`ifconfig | grep eth0 -C 8 | grep "RX bytes"` echo "IP_add:" $ip_addr echo "IP_MAC:" $ip_mac echo "IP_RX:" $ip_rx_packets echo "IP_TX:" $ip_tx_packets echo "IP_RX_Bytes:" $ip_rx_bytes } # Crontab check #检测任务计划 check_crontab () { echo "Crontab check:" crontab -l } # Performance Check # Average system load #检测负载,检查cpu数量,型号及主频 check_load () { echo "Average system load:" W="/usr/bin/w" show_loading=$($W | head -1) L1=$(echo $show_loading | awk '{print $10}') L5=$(echo $show_loading | awk '{print $11}') L15=$(echo $show_loading | awk '{print $12}') L1=${L1%,*} L5=${L5%,*} cpu_sl=`cat /proc/cpuinfo | grep processor | wc -l` cpu_xh=`cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c` cpu_zp=`cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c | awk '{print $8}'` echo "1、5、15分钟系统的平均负载为:" $L1 $L5 $L15 echo "CPU 数量为:" $cpu_sl echo "CPU 型号:" $cpu_xh echo "CPU主频:" $cpu_zp } # Memory usage #检查内存,列出总内存,可用内存及占用百分比,检查内存插槽 check_memory () { Memslot=`dmidecode | grep -A16 "Memory Device$" | grep Memory | wc -l` echo "Memory usage:" MemFree=`free -m | grep Mem | awk -F: '{print $2}' | awk '{print $3}'` MemBuffers=`free -m | grep Mem | awk -F: '{print $2}' | awk '{print $5}'` MemCached=`free -m | grep Mem | awk -F: '{print $2}' | awk '{print $6}'` MemTotal=`free -m | grep Mem | awk -F: '{print $2}' | awk '{print $1}'` #计算可用内存 MemSY=`expr $MemFree \+ $MemBuffers \+ $MemCached` #计算剩余内存百分比% MemB=`awk 'BEGIN{printf "%.2f%\n",'$MemSY/$MemTotal\*100'}'` echo "服务器共有" $Memslot "插槽","系统总内存为(M):" $MemTotal ",可用内存为(M):"$MemSY ",剩余百分比为:" $MemB } # Disk Space #检查分区状态 check_disk () { echo "Disk Space:" df -h } # Process Resource #检查ps进程,并排除tty及pts信息 check_process () { echo "Process Resource:" ps -ef | grep -v pts | grep -v tty* } # Security check #检查当前登录用户 # Currently logged in user check_who () { echo "Currently logged in user" who } # System uptime #检查系统运行时间 check_uptime () { echo "System uptime:" u=`uptime | awk '{print $3}'` echo "系统运行时间为:$u 天" } # System Account check #检查系统账户,剔除nologin用户 check_account () { echo "Sytem Account check:" cat /etc/passwd | grep -v nologin } # System open ports #检查服务器开放端口 check_ports () { echo "Sytem open ports:" netstat -an | grep LISTEN } # System chkconfig #检查chkconfig,只列出终端3启用状态的。 check_chkconfig () { echo "Sytem chkconfig:" chkconfig --list | grep 3:启用 } # System Iptables #检查防火墙配置 check_iptables () { echo "System Iptables:" iptables -L } for i in check_version check_network check_crontab check_load check_memory check_disk check_process check_who check_uptime check_account check_ports check_chkconfig check_iptables do echo "--------------------------------------------------------------------------------------------------------------------" $i done > /mnt/backup/$date1/$date1.$HostName.doc #生成报告 |
二、ftp文件服务器
ftp搭建采用虚拟用户方式,具体安装步骤本节略,可查看之前文章,传送门:
http://haolulu.blog.51cto.com/3164472/579006
脚本最后再加入ftp自动上传功能
# ftp upload ftpaddr="10.172.172.17" ftpuser="ftpbuser" ftppass="ftppass" ftp -n <<EOF open $ftpaddr user $ftpuser $ftppass binary cd inreport mkdir $date1 put /mnt/backup/$date1/$date1.$HostName.doc close bye EOF |
三、配置服务器管理
实现功能:
1、通过配置服务管理脚本并推送至客户端
2、控制脚本执行,只再需要执行的时候执行
查看目录结构:
自己手动创建目录及文件
inspection/ |-- file | |-- check_CentOs.sh | `-- tmp.txt |-- manifests | |-- init.pp | `-- install.pp `-- templates |
注:
File目录中
check_CentOs.sh 服务器巡检脚本
Tmp.txt控制脚本执行文件
Manifests目录内容
Init.pp
class inspection { include inspection::install } |
Install.pp
class inspection::install { file {"/usr/local/src/check_CentOs.sh": group => root, owner => root, mode => 755, source => "puppet:///modules/snmpd/check_CentOs.sh", } file {"/mnt/backup/tmp.txt": group => root, owner => root, mode => 755, source => "puppet:///modules/snmpd/tmp.txt", } exec { "Patrol script execution:": onlyif => ["test `du /mnt/backup/tmp.txt | cut -f1` -gt 1 "], command => "/bin/sh /usr/local/src/check_CentOs.sh", user => "root", path => ["/usr/bin","/usr/sbin","/bin","/bin/sh"], } } |
注:
onlyif => ["test `du /mnt/backup/tmp.txt | cut -f1` -gt 1 "]onlyif参数判断tmp.txt文件大小是否大于1,当文件内容大于1时才执行脚本,负责跳过exec
Tmp.txt通过这个文件来控制是否执行脚本,当向tmp中添加内容值为1时,配置服务器客户端
四、人工报告分析
安排人员分析报告,并提取危险信息。加以处理
五、效果截图
巡检生成效果图:
ftp上传效果: