在日常运维管理中,随着公司业务壮大,运维可能需要管理的机器越来越多,一旦机器数量到了一定规模,机器的属性信息如果没有集中管理好,就会很容易造成人为事故的发生, 所以能否建立一个完善的运维信息资产库对运维人员来说至关重要,那如何建立一个运维资产库?如何能让资产库信息实时同步线上机器信息?带着疑问,我们接下来看如何利用ansible api来做一个简单的运维资产库,这个脚本主要是利用了ansible api来进行对客户机信息的收集,然后将收集的信息insert 到db库中,我这里例子是采用的sqlite数据库,其它不多说了,看代码:
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 37 38 39 40 41 42 43 44 45 46 47 48 49 |
#!/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 thread_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=thread_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语句:
1 2 3 4 5 6 7 8 9 |
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 ); |
以上就是全部内容了,另外此脚本只收集了关键信息,如果想采集更多的信息,可以根据这个脚本进行自行扩展,希望能对大家有所帮助。
写在最后:
虽然这个脚本主要是来收集资产信息,但我个人是更重要的是学会用这种方式去处理问题,因为ansible本身有非常丰富的模块,我们可以通过调用其它模块来实现更为复杂的运维操作。