一.需求
二.流程图
三.代码目录结构
四.源代码
small ansible.py(执行脚本)
import os,sys base_path=os.path.dirname(os.path.dirname(__file__)) # print(base_path) sys.path.append(base_path) from core import main from conf import setting main.main() # grouplist=setting.group_list() # print(grouplist)
setings.py(定义组和帐号信息)
msg_dic = { "group1":{ #分组1 "h1":{"IP":"192.168.117.11", "username":"root", "password":"26", "port":22}, "h2":{"IP":"192.168.117.1", "username":"root", "password":"54", "port":22} }, "group2":{ #分组2 "h1":{"IP":"192.168.2.1", "username":"111", "password":"aaa", "port":22}, "h2":{"IP":"192.168.2.2", "username":"222", "password":"bbb", "port":22}, "h3":{"IP":"192.168.2.3", "username":"333", "password":"ccc", "port":22}, }, "group3":{ "h1":{"IP":"192.168.179.13", "username":"root", "password":"11", "port":22}, } }
main.py(主函数)
import configparser,paramiko,threading,os from conf import settings class client(): def __init__(self,ip,username,passwd,port): self.ip=ip self.username=username self.passwd=passwd self.port=port def run(self,cmd): #进行映射 执行相应的函数 cmd_first=cmd.split()[0] if hasattr(self,cmd_first): func=getattr(self,cmd_first) func(cmd) else: print("命令不存在") def batch_run(self,cmd): ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(hostname=self.ip, port=self.port, username=self.username, password=self.passwd) cmd_com=cmd.split()[1] print("--------") print(cmd_com) stdin, stdout, stderr = ssh.exec_command(cmd_com) result = stdout.read() print(result.decode())#不加decode打印出的内容为一行 ssh.close() def batch_put(self,cmd): local_file=cmd.split()[1] remote_file=cmd.split()[2] print("local:%s remote:%s "%(local_file,remote_file)) if os.path.isfile(local_file): transport = paramiko.Transport((self.ip, self.port)) transport.connect(username=self.username, password=self.passwd) sftp = paramiko.SFTPClient.from_transport(transport) sftp.put(local_file, remote_file) transport.close() else: print("file is not exsit") def show_group_list(): for index,item in enumerate(settings.msg_dic,1): print(index,item,":",len(settings.msg_dic[item])) group=input(">>select group (ex group1):") group_check=settings.msg_dic.get(group) if group_check: for i in range(1,len(settings.msg_dic[group])+1): print(settings.msg_dic[group]["h"+str(i)]["IP"]) return group_check else: print("group is not exsit") exit() def thread(choose_group): thread_list=[] while True: cmd=input("input command >>>:") if cmd: #如果输入为空则不执行 for key in choose_group: IP=choose_group[key]["IP"] username=choose_group[key]["username"] passwd=choose_group[key]["password"] port=choose_group[key]["port"] func=client(IP,username,passwd,port) t=threading.Thread(target=func.run,args=(cmd,)) t.start() thread_list.append(t) for i in thread_list: i.join() def main(): list_dir = show_group_list() thread(list_dir)