使用pymysql和paramiko实现远程安装软件

时间:2021-11-18 00:59:15

通过pymysql模块调用数据库获取安装信息,通过paramiko模块远程传输脚本并执行来安装软件,本文以安装apache为例。

创建apache安装信息数据表install_apache,设定三个字段,一个ip地址,一个root用户密码,一个是否已安装状态码,如下:

use python;
),passwd ),status ));

插入数条数据信息(数据是造的,条件所限,只有192,168.100.100是真机,然并卵),设定192,168.100.100这台机器还没有安装apache

insert into install_apache values("192.168.100.100","pengyc","N");
insert into install_apache values("192.168.100.99","pengyc","Y");
insert into install_apache values("192.168.100.98","pengyc","Y");

脚本调用数据库,遍历整个表,当状态为”N”时,调用paramiko远程传输早已写就的install_apache.sh脚本并执行之,执行之后修改状态码为”Y”,代码如下:

#!/usr/bin/env python3
#coding:utf-8
import pymysql,paramiko
#连接数据库
conn = pymysql.connect(host='192.168.100.100',user='peng',passwd='pengyc')
cur = conn.cursor()
conn.select_db('python')
cur.execute('select * from install_apache')

results = cur.fetchall()

#遍历整张表
for r in results:
    if r[2] == "N":
        print("即将在%s上安装apache,请耐心等待..." % r[0] )
        #传输脚本
        t = paramiko.Transport((r[0],22))
        t.connect(username='root',password=r[1])
        sftp = paramiko.SFTPClient.from_transport(t)
        sftp.put('/root/code/install_apache.sh','/tmp/install_apache.sh')
        t.close()

        #远程执行脚本
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh.connect(hostname=r[0],username='root',password=r[1])
        stdin,stdout,stderr = ssh.exec_command('sh /tmp/install_apache.sh')
        print (stdout.read().decode('utf-8'))
        ssh.close()
        #更新状态码为“Y”
        sql = "update install_apache set status ='%s' where ip = '%s'" % ("Y",r[0])
        cur.execute(sql)
        conn.commit()
cur.close()
conn.close()

执行成功后更新状态码为“Y”,下次再运行的时候就不会再重复安装一遍了。

美中不足第一点:install_apache.sh安装脚本固定不变,无法传参,无法进行更多的客户化操作,不知是否有模块可以实现本地脚本或函数在远程安装,有待大牛解答,万分感谢!

美中不足第二点:每次遍历全表太low了

美中不足第三点:道行太浅,我也不知道