虽然这个脚本主要是来收集资产信息,但我个人是更重要的是学会用这种方式去处理问题,因为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
);
以上就是全部内容了,希望能对大家有所帮助,另外此脚本只收集了关键信息,如果想采集更多的信息,可以根据这个脚本进行自行扩展。