1 简介
上周线上的一台运行CAS的虚拟机磁盘满了,导致统一身份认证系统发生故障,问题虽小,但影响范围比较大,教训是深刻的。越发感觉云平台后期运维是多么的重要,建设与之配套的自动化运维平台的对在线业务的实时监控、智能告警具有重要的意义。
2 脚本
由于运维平台尚未建立,这里临时提供一个简单脚本,实现获取Linux虚拟机的CPU、Mem、磁盘等使用量统计。
首先准备一个虚拟机IP列表的hosts文件,这里是从个人数据库中拉取虚拟机IPs,也可以写个简单的Python脚本从Nova的数据库中拉取:get_vm_ips.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#!/usr/bin/env python import MySQLdb database_host = '192.168.2.241' database_name = 'cloud' database_username = 'root' database_password = 'a263f6a89fa2' conn= MySQLdb.connect(host = database_host, db = database_name, user = database_username, passwd = database_password, port = 3306, charset = 'utf8') cursor = conn.cursor() cursor.execute('SELECT * FROM cloud.virtual_machine') for row in cursor.fetchall(): print row[8] cursor.close() conn.commit() conn.close() |
执行下,获取虚拟机浮动IP
1 |
python get_vm_ips.py > ./hosts/online_vm.txt |
生成的hosts.txt内容如下:
1 2 3 4 5 |
172.20.100.100 172.20.100.119 172.20.101.131 172.20.100.105 …… |
设置当前节点到所有VM的SSH。
1 |
#!/bin/sh |
1 2 3 4 |
for host in $(cat ./hosts/online_vm.txt) do ssh-copy-id root@ $host done |
然后利用SSH远程执行iostat、free和df命令获取CPU、Mem、磁盘等使用率信息,设定磁盘使用率阈值(比如60%),超出阈值进行告警,一个在终端下运行的简单的脚本如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#!/bin/sh function check(){ if [[ $1 > 60 ]];then echo -e "\033[33m磁盘使用率:$1% 警告! \033[0m" else echo "磁盘使用率:"$1"%" fi } for host in $(cat ./hosts/online_vm.txt) do echo -e "\033[34m------$host------ \033[0m" echo "系统时间:"$(ssh $host eval date +%Y-%m-%d_%H:%M:%S) echo "CPU使用率:"$(ssh $host iostat -c|grep -A1 avg-cpu|grep -v avg-cpu|awk '{print $1}')"%" echo "内存使用率:"$(ssh $host free -h|grep Mem:|awk '{print $3/$2*100"%"}') disk=$(ssh $host df -TH |grep /$|awk '{print $6}'|awk -F"%" '{print $1}') check $disk done |
效果如下:
此外,为了方便浏览,这里将当前监控结果临时保存,并更新到apache服务器的默认页面中,这里增加了<br>、<font>等格式化输出,通过IP直接可以简单浏览监控信息,脚本如下monitor_vm_infos.sh:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
#!/bin/sh # # a simple script for the VM monitor file_name=`eval date +%Y%m%d%H%M%S`.log log_file=/tmp/$file_name target_file=/var/www/html/index.html >$log_file function check(){ if [[ $1 -gt 60 ]];then echo "<font color='red'>磁盘使用率:$1% <警告>!</font>" | tee -a $log_file echo "<br>" |tee -a $log_file else echo "磁盘使用率:"$1"%" | tee -a $log_file echo "<br>" |tee -a $log_file fi } for host in $(cat ./hosts/online_vm.txt) do echo -e "------$host------" | tee -a $log_file echo "<br>" |tee -a $log_file echo "系统时间:"$(ssh $host eval date +%Y-%m-%d_%H:%M:%S) | tee -a $log_file echo "<br>" |tee -a $log_file echo "CPU使用率:"$(ssh $host iostat -c|grep -A1 avg-cpu|grep -v avg-cpu|awk '{print $1}')"%" | tee -a $log_file echo "<br>" |tee -a $log_file echo "内存使用率:"$(ssh $host free -m|grep Mem:|awk '{print $3/$2*100"%"}') | tee -a $log_file echo "<br>" |tee -a $log_file disk=$(ssh $host df -TH |grep /$|awk '{print $6}'|awk -F"%" '{print $1}') if [[ $disk == "/" ]];then disk=$(ssh $host df -TH |grep /$|awk '{print $5}'|awk -F"%" '{print $1}') fi check $disk echo "<br>" |tee -a $log_file done \cp $log_file $target_file |
然后起一个定时任务,自定义监控频率,就可以很方便的拿到监控信息了。
1 |
0 7 * * * /bin/sh /root/CloudPlatformOperations/bin/monitor_vm_infos.sh |
浏览器访问,效果如下:
另外,这里的告警仅仅是红颜色的警告提示,如果想及时告警,可以触发一个邮件通知事件,具体可以参考之前的博客:Linux服务器配置邮件提醒 或 Python发送邮件 。
3 讨论
这里实现比较简单,虽然可以快速获取信息,但缺点也比较明显:
- windows系列的虚拟机无法获取响应信息
- SSH登录执行命令缓慢
- 文本处理不够健壮:ubuntu系统命令输出信息可能不一致
- 功能比较单一
后面尝试通过构建功能丰富的自动化运维平台实现云平台的高效运维。
code
more code
~~~~