Python自动化运维之paramiko

版权声明:转载请标明出处 https://blog.csdn.net/w1418899532/article/details/82700430

公司有20台服务器部署在天津、浙江、甘肃等地,每次都要通过vnc或者xshell远程连接过去,,执行一条条命令,完成巡检的过程,耗时较长。后期还有可能在其他地级市增加服务器,有超过百台的可能。耗时更长。于是,使用Python提供的第三方库paramiko模块编写自动化巡检脚本,自动完成整个检查,每次去只需在输出文件中查看结果,节省不少时间。
上代码:

1.导入模块

import paramiko
import datetime
import time
import os
import sys

2.写配置信息
我一般把配置信息写在头部,方便以后代码的修改的维护。如:
config

3.功能函数
创建ssh对象—->连接远程服务器—–>遍历命令列表——>输出结果
代码如下:

def sshconnection(ip,username,password,commands):
    try:
        #创建SSH对象
        ssh = paramiko.SSHClient()
        #允许连接不在Hosts列表中主机
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        #连接服务器
        ssh.connect(ip,22,username,password,timeout=360)
        outfile.write('%s------------%s---start-------------\n' % (ip,datetime.datetime.now()))
        #遍历命令列表命令
        for command in commands:
            stdin, stdout, stderr = ssh.exec_command(m)
            #stdin.write("Y")  #简单交互,输入 ‘Y'
            outResults = stdout.readlines()
            errorResults = stderr.readlines()
        #写入输出结果到文件中
        if outResults != '':
                for outResult in outResults:
                    outfile.write(outResult)
                outfile.write('%s------------%s---end-------------\n' % (ip,datetime.datetime.now()))
            for errorResult in errorResults:
                errorfile.write(errorResult)
        ssh.close()
    except Exception,e:
        os.system('echo \'find a err\' > /home/error')
        print ('%s\tError:%s\n'%(ip,e))

4.写定时函数
定时使用的是最为简单的sleep函数,根据需要定时。

def sleeptime(hour,m,sec):
    return hour*3600 + m*60 + sec

5.写守护进程
守护进程是运行在后台的一种特殊进程,独立于控制终端。这些写守护进程的原因就是在终端执行程序,关闭终端后,使进程一直存在,使用while(true)也可以实现。

def creatDaemon():
    try:
        #第一次fork,生成子进程,脱离父进程
        Pid = os.fork()
        if Pid > 0 :
            sys.exit(0)
    except OSError, error:
        print('fork #1 failed: %d (%s)'%(error.errno,error.strerror))
        sys.exit(1)
    #修改工作目录
    os.chdir("/")
    #设置新的会话连接
    os.setsid()
    #重新设置文件创建权限
    os.umask(0)

    try:
        #第二次fork,禁止进程打开终端
        Pid = os.fork() 
        if Pid > 0 :
            sys.exit(0)
    except OSError, error:
        print('fork #2 failed: %d (%s)'%(error.errno,error.strerror))
        sys.exit(1)

    #重定向文件描述符
    sys.stdout.flush()
    sys.stderr.flush()
    Si = file("/dev/null", 'r')
    So = file("/dev/null", 'a+')
    Se = file("/dev/null", 'a+', 0)
    os.dup2(Si.fileno(), sys.stdin.fileno())
    os.dup2(So.fileno(), sys.stdout.fileno())
    os.dup2(Se.fileno(), sys.stderr.fileno())

至此就可以完成远程连接服务器,并定期执行命令的效果。paramiko是遵循SSH2协议的,vnc同样,所以之前通过vnc远程连接的这里可以使用此脚本。下一篇记录Telnet连接的脚本。
详细代码见 paramiko模块使用

https://github.com/wnn0809/WebLovePy/blob/master/Py/paramiko%E8%BF%90%E7%BB%B4%E8%84%9A%E6%9C%AC)

猜你喜欢

转载自blog.csdn.net/w1418899532/article/details/82700430