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][