通过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了

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

使用pymysql和paramiko实现远程安装软件的更多相关文章

  1. paramiko模块的安装和使用(含上传本地文件或文件夹到服务器,以及下载服务器文件到本地)

    安装和使用分两步介绍: 介绍一下,本文的运行环境是win7 64位 和python 2.7  . 安装: WIN7_64位 安装python-ssh访问模块(paramiko)的安装教程,本人亲测下面 ...

  2. Oracle 11g静默安装软件+手工创建数据库

    由于是二次跳转+远程操作,无法使用图形界面,不能直接图形界面安装.采用静默安装软件+手工创建数据库的方式完成需求. 静默模式安装Oracle软件,配置监听程序 手工建库 检查各组件是否符合要求 1. ...

  3. 安卓使用adb命令安装软件

    准备工作: 确信 \Android-sdk-windows\tools\下有 adb.exe     AdbWinApi.dll     AdbWinUsbApi.dll 三个文件,如果没有从\and ...

  4. Linux下的网络远程安装

    Linux下的网络远程安装 1.用RHEL6.5光盘安装第一台服务器 2.在第一台服务器上配置YUM服务器 先创建一个挂载 #mount #umount /dev/cdrom #mkdir /mnt/ ...

  5. Linux-TFTP之用于网络远程安装

    TFTP:Trival File Transfer Protocol,简单文件传输协议.是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂.开销不大的文件传输服务. ...

  6. 内网主机使用yum安装软件

    经常遇到这样的情况:有一台内网linux主机需要安装软件,但是主机又无法连接外网,通常情况下可以使用rpm包或者使用源码编译安装.但常常会遇到依赖缺少的情况,这就麻烦了,要一一找到缺少的软件包. 这种 ...

  7. adb导出安卓 把手机内存文件导入到电脑里 adb安装软件

    记得先找对路劲adb shellls 最上面的ls: ./ 打头的没有权限.而下面的这些acct sdcard等 都有权限. 然后cd sdcardls 看下目录,发现gxm文件夹在sdcard下面. ...

  8. python3使用paramiko操作远程机器

    目标:有A和B两台机器,希望在机器A上操作B上的脚本   解决方法:使用paramiko实现操作远程机器   1.安装paramiko   安装第三方包[pip3 install paramiko] ...

  9. linux:使用apt、dpkg工具安装软件

    先总结一下安装软件常用命令: % apt sudo apt install xxxx sudo apt list xxxx % dpkg安装deb文件 sudo dpkg -i xxxx.deb 学习 ...

随机推荐

  1. HTML5 Mobile 适应移动端的屏幕<meta name='viewport' content='xxxx'>

    网页手机wap2.0网页的head里加入下面这条元标签,在移动端的浏览器中页面将以原始大小显示,并不允许缩放. 加入 如下代码 即可自适应移动端的屏幕: <meta name="vie ...

  2. Android Studio导入GitHub

    方法一:引用开源项目的compile添加到gradle中http://www.zhihu.com/question/27027667 方法二:下载安装包引入:http://blog.csdn.net/ ...

  3. STM32F051关于printf函数在串口打印中的使用

    1.需要在Options for Target -> Code Generation 中勾选Use MicroLIB: 2.需要加入下面这个函数: int fputc(int ch, FILE ...

  4. 类加载器子系统——JVM之四

    一.类加载器基本概念 顾名思义,类加载器(class loader)用来加载 Java 类到 Java 虚拟机中.一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java ...

  5. 镍钯金工艺(ENEPIG)详解

    一.镍钯金工艺(ENEPIG)与其他工艺如防氧化(OSP),镍金(ENIG)等相比有如下优点: 1.防止“黑镍问题”的发生–没有置换金攻击镍的表面做成晶粒边界腐蚀现象. 2.化学镀钯会作为阻挡层,不会 ...

  6. 站在巨人的肩膀上,C++开源库大全

    程序员要站在巨人的肩膀上,C++拥有丰富的开源库,这里包括:标准库.Web应用框架.人工智能.数据库.图片处理.机器学习.日志.代码分析等. 标准库 C++ Standard Library:是一系列 ...

  7. LINUX 暂停、继续进程

    LINUX 暂停.继续进程 kill -STOP 1234 将该进程暂停. 如果要让它恢复到后台,用kill -CONT 1234 (很多在前台运行的程序这样是不行的) 如果要恢复到前台,请在当时运行 ...

  8. 关于SubclassWindow()和SubclassDlgItem

    msdn上的解析 CWnd::SubclassWindowBOOL SubclassWindow( HWND hWnd ); Return Value Nonzero if the function ...

  9. 【JSP动态网站】JDBC连接SqlServer 2008数据库

    JSP程序需要通过JDBC接口才能访问数据库. 启动MyEclipse,选择“Window”→“Open Perspective”→“MyEclipse Database Explorer”菜单项,打 ...

  10. Android4.0中蓝牙适配器state machine(状态机)的分析

    今天晓东和大家来一起看一下Android4.0中蓝牙适配器(Bluetooth Adapter)的状态机变化的过程.首先,我们需要了解一下,蓝牙适配器究竟有哪些状态,从代码可以清晰地看到(framew ...