通过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了
美中不足第三点:道行太浅,我也不知道