簡單主機批量管理工具

需求:web

  1. 主機分組
  2. 主機信息配置文件用configparser解析
  3. 可批量執行命令、發送文件,結果實時返回,執行格式以下 (小寫的h被系統佔中,H表示主機名,g表示組)
    1. batch_run  -H h1,h2,h3   -g web_clusters,db_servers    --cmd  "df -h"
  4. 主機用戶名密碼、端口能夠不一樣
  5. 執行遠程命令使用paramiko模塊
  6. 批量命令需使用multiprocessing併發
import  configparser
import  paramiko
import time
import os
import optparse
from multiprocessing import Process, Lock

class Tools(object):
  def __init__(self):
      parser = optparse.OptionParser()
      parser.add_option("-H", "--H", dest="high", help="high")
      parser.add_option("-g", "--g", dest="g", help="g")
      parser.add_option("--cmd", "--cmd", dest="cmd", help="cmd")
      self.options, self.args = parser.parse_args()
      self._data(self._file(self.options,self.args))
  def _file(self,options,args):
      """判斷屬性是否爲空,取出H和g"""
      file_list = []
      file_list1=[]
      if args and args[0] == "batch_run":
          if options.high is not None or options.g is not None or options.cmd is not None:
              config = configparser.ConfigParser()
              config.read("host.conf")
              g = options.g.split(",")
              h = options.high.split(",")
              for i in g:
                if i not in config.options("server-g"):
                  print("找不到%s信息組"%i)
                  g.remove(i)
              for i in h:
                 file_list.append(i)
              for i in g:
                s = config["server-g"][i]
                s = s.split(",")
                file_list = file_list +s
              ret1 = config.sections()
              del ret1[0]
              for i in file_list:
                if i in ret1:
                  file_list1.append(i)
                else:
                  print("找不到主機名%s" %i)
                  continue
              return file_list1
      else:
        exit("請輸入正確的參數")

  def _data(self,file_list):
      data_dic = {}
      config = configparser.ConfigParser()
      config.read("host.conf")
      for i in file_list:
        data_dic[i] = {
          "server": config[i]["server"],
          "port": config[i]["port"],
          "username": config[i]["username"],
          "password": config[i]["password"]
        }
      lock = Lock()
      for i in data_dic:
          Process(target=self._ssh, args=(lock,data_dic[i])).start()

  def _ssh(self,l,data_dic):
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        l.acquire()
        print("---------%s----------" %data_dic["server"])
        ssh.connect(data_dic["server"], int(data_dic["port"]),data_dic["username"], data_dic["password"])
        stdin, stdout, stderr = ssh.exec_command(self.options.cmd)
        if stdout.read().decode():
            stdin, stdout, stderr = ssh.exec_command(self.options.cmd)
            print(stdout.read().decode())
        else:
            print (stderr.read().decode())
        l.release()
        #判斷是否進程同步
        time.sleep(2)

if __name__ == "__main__":
  t =Tools()

host.conf文件信息併發

[server-g]
server1 = h1,h2
server2 = h3,h4

[h1]
port = 22
username = root
server = 172.16.240.80
password = root123

[h2]
port = 22
username = root
server = 172.16.240.96
password = root123

[h3]
port = 22
username = root
server = 172.16.240.82
password = root123

[h4]
port = 22
username = root
server = 172.16.240.95
password = root123

缺點:-H,-g 這兩個必須也要同時執行。app

相關文章
相關標籤/搜索