虽然这个脚本主要是来收集资产信息,但我个人是更重要的是学会用这种方式去处理问题,因为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

);


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