python标准库什么对socket进行了二次封装_Python如何实现Paramiko的二次封装

paramiko是一个用于执行ssh命令的python第三方库,使用该库可实现自动化运维的所有任务,如下是一些常用代码的封装方式,多数代码为半成品,只是敲代码时的备份副本防止丢失,仅供参考。

目前本人巡检百台设备完全无压力,如果要巡检过千台则需要多线程的支持,过万台则需要加入智能判断等。

实现命令执行: 直接使用过程化封装,执行cmd命令.

import paramiko

ssh = paramiko.sshclient()

ssh.set_missing_host_key_policy(paramiko.autoaddpolicy())

def batchcmd(address,username,password,port,command):

try:

ssh.connect(hostname=address,username=username,password=password,port=port,timeout=2)

stdin , stdout , stderr = ssh.exec_command(command)

result = stdout.read()

if len(result) != 0:

result = str(result).replace("\\n", "\n")

result = result.replace("b'", "").replace("'", "")

return result

else:

return none

except exception:

return none

实现磁盘巡检: 获取磁盘空间并返回字典格式

def getalldiskspace(address,username,password,port):

ref_dict = {}

cmd_dict = {"linux\n" : "df | grep -v 'filesystem' | awk '{print $5 \":\" $6}'",

"aix\n" : "df | grep -v 'filesystem' | awk '{print $4 \":\" $7}'"

}

# 首先检测系统版本

os_version = batchcmd(address,username,password,port,"uname")

for version,run_cmd in cmd_dict.items():

if(version == os_version):

# 根据不同版本选择不同的命令

os_ref = batchcmd(address,username,password,port,run_cmd)

ref_list= os_ref.split("\n")

# 循环将其转换为字典

for each in ref_list:

# 判断最后是否为空,过滤最后一项

if each != "":

ref_dict[str(each.split(":")[1])] = str(each.split(":")[0])

return ref_dict

# 磁盘巡检总函数

def diskmain():

with open("db.json", "r", encoding="utf-8") as read_fp:

load_json = read_fp.read()

js = json.loads(load_json)

base = js.get("base")

count = len(base)

for each in range(0,count):

print("\033[37m-\033[0m" * 80)

print("\033[35m 检测地址: {0:10} \t 用户名: {1:10} \t 密码: {2:10} \t 端口: {3:4}\033[0m".

format(base[each][1],base[each][2],base[each][3],base[each][4]))

print("\033[37m-\033[0m" * 80)

ref = getalldiskspace(base[each][1],base[each][2],base[each][3],base[each][4])

for k,v in ref.items():

# 判断是否存在空盘

if( v.split("%")[0] != "-"):

# 将占用百分比转换为整数

space_ret = int(v.split("%")[0])

if space_ret >= 70:

print("\033[31m 磁盘分区: {0:30} \t 磁盘占用: {1:5} \033[0m".format(k,v))

continue

if space_ret >= 50:

print("\033[33m 磁盘分区: {0:30} \t 磁盘占用: {1:5} \033[0m".format(k, v))

continue

else:

print("\033[34m 磁盘分区: {0:30} \t 磁盘占用: {1:5} \033[0m".format(k, v))

continue

print()

# 组内传递用户名密码时调用此方法

def groupdiskmain(address,username,password,port):

ref = getalldiskspace(address,username,password,port)

for k, v in ref.items():

if (v.split("%")[0] != "-"):

space_ret = int(v.split("%")[0])

if space_ret >= 70:

print("磁盘分区: {0:30} \t 磁盘占用: {1:5} -> [警告]".format(k, v))

continue

if space_ret >= 50:

print("磁盘分区: {0:30} \t 磁盘占用: {1:5} -> [警惕]".format(k, v))

continue

else:

print("磁盘分区: {0:30} \t 磁盘占用: {1:5} -> [正常]".format(k, v))

continue

print()

获取系统内存利用率: 获取系统内存利用率

def getallmemspace(address,username,password,port):

cmd_dict = {"linux\n" : "cat /proc/meminfo | head -n 2 | awk '{print $2}' | xargs | awk '{print $1 \":\" $2}'",

"aix\n" : "df | grep -v 'filesystem' | awk '{print $4 \":\" $7}'"

}

# 首先检测系统版本

os_version = batchcmd(address,username,password,port,"uname")

for version,run_cmd in cmd_dict.items():

if(version == os_version):

# 根据不同版本选择不同的命令

os_ref = batchcmd(address,username,password,port,run_cmd)

# 首先现将kb转化为mb

mem_total = math.ceil( int(os_ref.split(":")[0].replace("\n","")) / 1024)

mem_free = math.ceil(int(os_ref.split(":")[1].replace("\n","")) / 1024)

mem_used = str( int(mem_total) - int(mem_free))

# 计算占用空间百分比

percentage = 100 - int(mem_free / int(mem_total / 100))

print("内存总计空间: {}".format(str(mem_total) + " mb"))

print("内存剩余空间: {}".format(str(mem_free) + " mb"))

print("内存已用空间: {}".format(str(mem_used) + " mb"))

print("计算百分比: {}".format(str(percentage) + " %"))

获取系统进程信息: 获取系统进程信息,并返回字典格式

def getallprocessspace(address,username,password,port):

ref_dict = {}

cmd_dict = {"linux\n" : "ps aux | grep -v 'user' | awk '{print $2 \":\" $11}' | uniq",

"aix\n" : "ps aux | grep -v 'user' | awk '{print $2 \":\" $12}' | uniq"

}

os_version = batchcmd(address,username,password,port,"uname")

for version,run_cmd in cmd_dict.items():

if(version == os_version):

os_ref = batchcmd(address, username, password, port, run_cmd)

ref_list = os_ref.split("\n")

for each in ref_list:

if each != "":

ref_dict[str(each.split(":")[0])] = str(each.split(":")[1])

return ref_dict

# 巡检进程是否存在

def processmain():

with open("db.json", "r", encoding="utf-8") as read_fp:

load_json = read_fp.read()

js = json.loads(load_json)

process = js.get("process")

process_count = len(process)

for x in range(0,process_count):

# 根据process中的值查询base中的账号密码

base = js.get("base")

if( list(process[x].keys())[0] == base[x][0] ):

# 拿到账号密码之后再提取出他们的进程id于进程名

print("\033[37m-\033[0m" * 80)

print("\033[35m 检测地址: {0:10} \t 用户名: {1:10} \t 密码: {2:10} \t 端口: {3:4}\033[0m".

format(base[x][1], base[x][2], base[x][3], base[x][4]))

print("\033[37m-\033[0m" * 80)

ref_dic = getallprocessspace(base[x][1],base[x][2],base[x][3],base[x][4])

# ref_val = 全部进程列表 proc_val = 需要检测的进程列表

ref_val = list(ref_dic.values())

proc_val = list(process[x].values())[0]

# 循环比较是否在列表中

for each in proc_val:

flag = each in ref_val

if(flag == true):

print("\033[34m 进程: {0:50} 状态: √ \033[0m".format(each))

else:

print("\033[31m 进程: {0:50} 状态: × \033[0m".format(each))

实现剧本运行功能: 针对特定一台主机运行剧本功能,随便写的一个版本,仅供参考

def runrule(address,username,password,port,playbook):

os_version = batchcmd(address,username,password,port,"uname")

if(os_version == list(playbook.keys())[0]):

play = list(playbook.values())[0]

print()

print("\033[37m-\033[0m" * 130)

print("\033[35m 系统类型: {0:4} \t 地址: {1:10} \t 用户名: {2:10} \t 密码: {3:15} \t 端口: {4:4}\033[0m"

.format(os_version.replace("\n",""),address,username,password,port))

print("\033[37m-\033[0m" * 130)

for each in range(0,len(play)):

runcmd = play[each] + " > /dev/null 2>&1 && echo $?"

print("\033[30m [>] 派发命令: {0:100} \t 状态: {1:5} \033[0m".format(

runcmd.replace(" > /dev/null 2>&1 && echo $?", ""),"正在派发"))

os_ref = batchcmd(address, username, password, port, runcmd)

if(os_ref == "0\n"):

print("\033[34m [√] 运行命令: {0:100} \t 状态: {1:5} \033[0m".format(

runcmd.replace(" > /dev/null 2>&1 && echo $?",""),"派发完成"))

else:

print("\033[31m [×] 运行命令: {0:100} \t 状态: {1:5} \033[0m".format(

runcmd.replace(" > /dev/null 2>&1 && echo $?",""),"派发失败"))

# 既然失败了,就把剩下的也打出来吧,按照失败处理

for x in range(each+1,len(play)):

print("\033[31m [×] 运行命令: {0:100} \t 状态: {1:5} \033[0m".format(

play[x].replace(" > /dev/null 2>&1 && echo $?", ""), "终止执行"))

break

else:

return 0

# 批量: 传入主机组不同主机执行不同剧本

def runplaybook(hostlist,playbook):

count = len(hostlist)

error = []

success = []

for each in range(0,count):

ref = runrule(hostlist[each][

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值