虽然这个脚本主要是来收集资产信息,但我个人是更重要的是学会用这种方式去处理问题,因为ansible本身有非常丰富的模块,我们可以通过调用其它模块来实现更为复杂的运维操作,以下是正文:


在日常运维管理中,随着公司业务壮大,运维可能需要管理的机器越来越多,一旦机器数量到了一定规模,机器的属性信息如果没有集中管理好,就会很容易造成人为事故的发生, 所以能否建立一个完善的运维信息资产库对运维人员来说至关重要,那如何建立一个运维资产库?如何能让资产库信息实时同步线上机器信息?带着疑问,我们接下来看如何利用ansible api来做一个简单的运维资产库,这个脚本主要是利用了ansible api来进行对客户机信息的收集,然后将收集的信息insert 到db库中,我这里例子是采用的sqlite数据库,其它不多说了,看代码:

#!/usr/local/evn python


#autor:mindg.cn

#date:2016.3.3


import ansible.runner

from threading import Thread


def get_info(ip):

    data = []

    runner = ansible.runner.Runner(module_name='setup', module_args='', pattern='all', forks=2)

    datastructure = runner.run()

    sn = datastructure['contacted'][ip]['ansible_facts']['ansible_product_serial']

    sysinfo = datastructure['contacted'][ip]['ansible_facts']['ansible_system']

    cpu = datastructure['contacted'][ip]['ansible_facts']['ansible_processor'][1]

    cpu = ''.join(cpu.split())

    mem = datastructure['contacted'][ip]['ansible_facts']['ansible_memtotal_mb']

    ipadd_pub = datastructure['contacted'][ip]['ansible_facts']['ansible_all_ipv4_addresses'][1]

    ipadd_in = datastructure['contacted'][ip]['ansible_facts']['ansible_all_ipv4_addresses'][0]

    disk = datastructure['contacted'][ip]['ansible_facts']['ansible_devices']['sda']['size']

    data.append((sn,sysinfo,cpu,mem,disk,ipadd_pub,ipadd_in))

    return data


def save_db(data):

    import sqlite3

    conn = sqlite3.connect('info.db')

    cu = conn.cursor()

    sql = '''

         insert into INFO values (?,?,?,?,?,?,?)

         '''

    cu.execute(sql, data[0])

    conn.commit()


def thead_save(i):

    data = get_info(i)

    save_db(data)

if __name__ == '__main__':

    threads = []

    fi = open('hosts', 'r')

    fline = fi.readlines()

    fi.close()

    for i in fline:

        i = i.strip()

        threads.append(Thread(target=thead_save, args=(i,)))

    for thread in threads:

        thread.start()

    for thread in threads:

        thread.join()



脚本逐行解释,前几行是导入需要的模块,get_info()函数是获取ansible返回的信息,其中ansible.runner.Runner()是ansible的标准api,,传入的三个参数分别是模块名称,模块参数,匹配的主机,并发数;save_db()函数作用是将采集的数据放到数据库中,thread_save()函数是调用前2个函数,主要是给thread用的,因为用Thread来创建线程,有三种方法:第一是创建Thread实例时,传给它一次函数(我们脚本采用的这种方法),第二是创建Thread实例时,传给它一个可调用的类对象,最后是用Thread派生出一个子类,然后创建这个子类的实例,说远了,我们回来接着说脚本,脚本主题部分就是创建线程列表,然后运行,join()函数是等待所有线程结束,脚本基本就这些了。

最后提供下创建数据库表的sql语句:

CREATE TABLE INFO (

        SN VARCHAR(9) NOT NULL PRIMARY KEY,

        SYSINFO VARCHAR(50) NOT NULL,

        CPU_TYPE VARCHAR(15) NOT NULL,

        MEM VARCHAR(15),

        DISK VARCHAR(30) NOT NULL,

        IPADD_PUB VARCHAR(15) NOT NULL,

        IPADD_IN VARCHAR(15) NOT NULL

);


以上就是全部内容了,希望能对大家有所帮助,另外此脚本只收集了关键信息,如果想采集更多的信息,可以根据这个脚本进行自行扩展。




©著作权归作者所有:来自51CTO博客作者mb5fdb12e4adbb2的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. Spring 中优雅的获取泛型信息
  2. 正则表达式与文本处理工具 脚本实战
  3. 分享两个Mysql在线全备和binlog日志备份脚本
  4. 【java】使用jwt进行认证授权
  5. 轻度Linux服务器维护人员常用的Shell脚本命令
  6. 主备机房出口切换 python脚本
  7. 数据可视化工具在小学信息技术教学中的实际应用
  8. 文件的元数据信息查看及修改文件时间戳信息
  9. 支持向量机SVM原理(参数解读和python脚本)

随机推荐

  1. Android Display
  2. Android Button在中间显示
  3. android:tint
  4. android:定制checkbox 图片
  5. android 停止Handler
  6. 【Android Http Post】android post 请求
  7. Android 数据存储
  8. android开发指南中文版
  9. 阅读《Android(安卓)从入门到精通》(5)——
  10. android 动画模块分析