前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CMDB之数据采集

CMDB之数据采集

作者头像
超蛋lhy
发布2018-08-31 16:58:28
1.7K0
发布2018-08-31 16:58:28
举报
文章被收录于专栏:PythonistaPythonista

一. 四种方式

1. Agent方式

代码语言:javascript
复制
api
    - URL
    - 发送数据格式
    - 返回值
agent 
    - 采集数据,发送数据
好处:
    - 简单
    - 采集速度快,响应速度快
坏处:
    - 每台agent装的插件多,性能损耗严重
    - 更新需要更新每台agent服务器
代码语言:javascript
复制
####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方式

代码语言:javascript
复制
#ssh方式
    - fabric(本质是Paramiko)
    - ansible(本质是Paramiko)
    - Paramiko
 
 
#Paramiko模块
 
原理: Paramiko中控机远程连接服务器,执行命令,获取结果,将结果发送Api
应用场景:服务器少,ssh可以忽略 
 
好处
   - 无需Agent
坏处
   - 连接客户机时每次需要ssh连接,速度慢
 
 
http://www.cnblogs.com/wupeiqi/articles/5095821.html

 ssh方式:

代码语言:javascript
复制
##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上运行:

代码语言:javascript
复制
shell >> salt 'c2.salt.com' cmd.run  'ifconfig'

基于Salt的api方式:

利用saltstack的salt.client模块可以在python的命令行下或者python脚本里执行相应的salt命令

master端想要执行类似 salt '*' cmd.run 'uptime' 在saltclient里可以这么写

代码语言:javascript
复制
master
>>
import salt.client
local = salt.client.LocalClient()
local.cmd('*', 'cmd.run', ['uptime'])

得到jid可以通过get_cache_returns(jid)方法来获取执行结果,在没有执行完成以前是为空的所以可以写一个while来一直读取结果直到读取到或者超出规定时间为止

代码语言:javascript
复制
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信息等

代码语言:javascript
复制
import salt.client
caller = salt.client.Caller()
caller.sminion.functions['cmd.run']('ls -l')

获取grains的信息

代码语言:javascript
复制
import salt.client
caller = salt.client.Caller()
caller.sminion.functions['grains.items']  #grains.items代表获取全部的grains信息
caller.sminion.functions['grains.item']('os') #想要特定的grains信息用grains.item然后在后面指定
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-09-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一. 四种方式
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档