CMDB之数据采集
一. 四种方式
1. Agent方式
api - URL - 发送数据格式 - 返回值 agent - 采集数据,发送数据 好处: - 简单 - 采集速度快,响应速度快 坏处: - 每台agent装的插件多,性能损耗严重 - 更新需要更新每台agent服务器
####server from django.shortcuts import render,HttpResponse # Create your views here. def asset(request): if request.method == "POST": print(request.POST) # 写入到数据 return HttpResponse('1002') else: return HttpResponse('姿势不对') ####agent import subprocess import requests v1 = subprocess.getoutput("ifconfig") value1 = (v1[51:55]) v2 = subprocess.getoutput("dir") value2 = (v2[14:20]) url = "http://127.0.0.1:8000/asset.html" response = requests.post(url,data={"k1":value1,"k2":value2}) print(response.text)
2. ssh方式
#ssh方式 - fabric(本质是Paramiko) - ansible(本质是Paramiko) - Paramiko #Paramiko模块 原理: Paramiko中控机远程连接服务器,执行命令,获取结果,将结果发送Api 应用场景:服务器少,ssh可以忽略 好处 - 无需Agent 坏处 - 连接客户机时每次需要ssh连接,速度慢 http://www.cnblogs.com/wupeiqi/articles/5095821.html
ssh方式:
##server from django.shortcuts import render,HttpResponse # Create your views here. def asset(request): if request.method == "POST": print(request.POST) # 写入到数据 return HttpResponse('1002') else: return HttpResponse('姿势不对') ##Paramiko中控机 import paramiko import requests # 创建SSH对象 ssh = paramiko.SSHClient() # 允许连接不在know_hosts文件中的主机 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 连接服务器 ssh.connect(hostname='10.37.129.3', port=22, username='root', password="123456") # 执行命令 stdin, stdout, stderr = ssh.exec_command('ifconfig') # 获取命令结果 result = stdout.read()[0:20] # 关闭连接 ssh.close() url = "http://127.0.0.1:8000/asset.html" response = requests.post(url,data={"k1":result}) print(response.text)
3.saltstack方式
在master上运行:
shell >> salt 'c2.salt.com' cmd.run 'ifconfig'
基于Salt的api方式:
利用saltstack的salt.client模块可以在python的命令行下或者python脚本里执行相应的salt命令
master端想要执行类似 salt '*' cmd.run 'uptime' 在saltclient里可以这么写
master
>>
import salt.client local = salt.client.LocalClient() local.cmd('*', 'cmd.run', ['uptime'])
得到jid可以通过get_cache_returns(jid)方法来获取执行结果,在没有执行完成以前是为空的所以可以写一个while来一直读取结果直到读取到或者超出规定时间为止
import salt.client local = salt.client.LocalClient() t = 0 jid = local.cmd_async('*', 'cmd.run', ['uptime']) while not local.get_cache_returns(jid): time.sleep(1) if t == 8: print 'Connection Failed!' break else: t+=1 print local.get_cache_returns(jid)
minion端可以用来直接在minions上执行命令或者也可以用来写returnner的时候获取minion的grain信息等
import salt.client caller = salt.client.Caller() caller.sminion.functions['cmd.run']('ls -l')
获取grains的信息
import salt.client caller = salt.client.Caller() caller.sminion.functions['grains.items'] #grains.items代表获取全部的grains信息 caller.sminion.functions['grains.item']('os') #想要特定的grains信息用grains.item然后在后面指定
努力成为一个开发者
个人站点:www.pythonav.cn