ansible获取服务器cpu、内存、swap信息存入elasticsearch

运维平台开发,最初使用zabbix监控服务器信息,zabbix好用是好用,但也比较复杂、庞大,因此想摆脱第三方监控工具独立对服务器信息进行监控。
在linux中其实一个top命令可以解决,那么监控别的服务器就可以用ansible来完成,具体步骤
1.使用ansible 2.0接口调用top命令

a=MyRunner('/etc/ansible/hosts')
a.run('all','shell','top -bi -n 2 -d 0.02')
b=a.get_result()
succ=b['success']

2.分析数据,由于第一条数据一直不变,所以取第二条数据

for i in succ:
     ....

3.正则表达式,筛选出数值

# cpu处理 格式
# %Cpu(s):  3.7 us,  1.3 sy,  0.0 ni, 91.3 id,  3.7 wa,  0.0 hi,  0.0 si,  0.0 st
cpu = patt.findall(c[2].split(':')[1])
# 内存处理
# KiB Mem :  1017184 total,    70824 free,   533504 used,   412856 buff/cache
memory = patt1.findall(c[3].split(':')[1])  
# 交换空间
# KiB Swap:  2097148 total,  1257612 free,   839536 used.   270960 avail Mem
swap = patt1.findall(c[4].split(':')[1])

4.保存到elasticsearch

es.index(index="monitor", doc_type=i, id=None,
                     body={"cpu": {"us": cpu[0], "sy": cpu[1]
                         , "ni": cpu[2], "id": cpu[3], "wa": cpu[4]
                         , "hi": cpu[5], "si": cpu[6], "st": cpu[7]}
                         , "memory": {"totalMem": memory[0], "freeMem": memory[1]
                             , "usedMem": memory[2], "buffcacheMem": memory[3]}
                         , "swap": {"totalSwap": swap[0], "freeSwap": swap[1]
                             , "usedSwap": swap[2], "availSwap": swap[3]}
                         , "time": nstr
                         , "timespan": int(nspan)
                           })

最后使用任务调度工具定时执行
elasticsearch保存结果格式如下:

{
    "took": 1,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "failed": 0
    },
    "hits": {
        "total": 3,
        "max_score": 1,
        "hits": [
            {
                "_index": "monitor",
                "_type": "yt_ops",
                "_id": "AV8FSr0ENPmlBHBapUB-",
                "_score": 1,
                "_source": {
                    "swap": {
                        "availSwap": "269840",
                        "usedSwap": "839388",
                        "freeSwap": "1257760",
                        "totalSwap": "2097148"
                    },
                    "time": "2017-10-10 15:58:24",
                    "timespan": 1507622304,
                    "cpu": {
                        "ni": "0.0",
                        "sy": "33.3",
                        "hi": "0.0",
                        "wa": "0.0",
                        "si": "0.0",
                        "id": "66.7",
                        "us": "0.0",
                        "st": "0.0"
                    },
                    "memory": {
                        "buffcacheMem": "412048",
                        "totalMem": "1017184",
                        "freeMem": "70572",
                        "usedMem": "534564"
                    }
                }
            },
            {
                "_index": "monitor",
                "_type": "yt_tools",
                "_id": "AV8FSrx0NPmlBHBapUB8",
                "_score": 1,
                "_source": {
                    "swap": {
                        "availSwap": "6014056",
                        "usedSwap": "14772",
                        "freeSwap": "8242760",
                        "totalSwap": "8257532"
                    },
                    "time": "2017-10-10 15:58:24",
                    "timespan": 1507622304,
                    "cpu": {
                        "ni": "0.0",
                        "sy": "0.0",
                        "hi": "0.0",
                        "wa": "0.0",
                        "si": "0.0",
                        "id": "50.0",
                        "us": "50.0",
                        "st": "0.0"
                    },
                    "memory": {
                        "buffcacheMem": "5333340",
                        "totalMem": "7994372",
                        "freeMem": "1156972",
                        "usedMem": "1504060"
                    }
                }
            }
        ]
    }
}
完整的代码
# -*- coding: utf-8 -*-
from ansible.run import MyRunner
from elasticsearch import Elasticsearch
import re,time
ISOTIMEFORMAT = '%Y-%m-%d %X'
es = Elasticsearch('http://127.0.0.1:9200/')
a=MyRunner('/etc/ansible/hosts')
a.run('all','shell','top -bi -n 2 -d 0.02')
b=a.get_result()
succ=b['success']
print succ['yt_ops']['stdout']
print '######################'
patt = re.compile(r"(\d+\.\d+)")
patt1 = re.compile(r"(\d+)")
nspan = time.time()
nstr = time.strftime(ISOTIMEFORMAT, time.localtime(nspan))

for i in succ:
    results = succ[i]['stdout'].split('\n\n')
    # 获取第二个top结果
    c = results[2].split('\n')
    # cpu处理 格式
    # %Cpu(s):  3.7 us,  1.3 sy,  0.0 ni, 91.3 id,  3.7 wa,  0.0 hi,  0.0 si,  0.0 st
    cpu = patt.findall(c[2].split(':')[1])
    #print c[2].split(':')[1]
    #print cpu
    # 内存处理
    # KiB Mem :  1017184 total,    70824 free,   533504 used,   412856 buff/cache
    memory = patt1.findall(c[3].split(':')[1])
    #print 
    #print memory
    # 交换空间
    # KiB Swap:  2097148 total,  1257612 free,   839536 used.   270960 avail Mem
    swap = patt1.findall(c[4].split(':')[1])
    es.index(index="monitor", doc_type=i, id=None,
                     body={"cpu": {"us": cpu[0], "sy": cpu[1]
                         , "ni": cpu[2], "id": cpu[3], "wa": cpu[4]
                         , "hi": cpu[5], "si": cpu[6], "st": cpu[7]}
                         , "memory": {"totalMem": memory[0], "freeMem": memory[1]
                             , "usedMem": memory[2], "buffcacheMem": memory[3]}
                         , "swap": {"totalSwap": swap[0], "freeSwap": swap[1]
                             , "usedSwap": swap[2], "availSwap": swap[3]}
                         , "time": nstr
                         , "timespan": int(nspan)
                           })

ps:ansible2.0接口没写出来想要的可以问我要

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容