def do_nmap(self, host_list): ip_items = HostLoginifo.objects.filter(ip__in=host_list) ns = prpcrypt() for ip_item in ip_items: docker_dct = {} tmp_sship_list = [] doobj = J_ssh_do([ip_item.ip, ip_item.ssh_port, ip_item.ssh_user]) if ip_item.ssh_type == 0: ssh_passwd = ns.decrypt(ip_item.ssh_passwd) login_info = (ip_item.ip, int(ip_item.ssh_port), ip_item.ssh_user, ssh_passwd) res = doobj.pass_do(login_info, self.docker_cmd_list) if ip_item.ssh_type == 1: login_info = (ip_item.ip, int(ip_item.ssh_port), ip_item.ssh_user, ip_item.ssh_rsa) res = doobj.rsa_do(login_info, self.docker_cmd_list) if ip_item.ssh_type == 2: login_info = (ip_item.ip, int(ip_item.ssh_port), ip_item.ssh_user, ip_item.ssh_rsa) res = doobj.dsa_do(login_info, self.docker_cmd_list) if ip_item.ssh_type == 3: login_info = (ip_item.ip, int(ip_item.ssh_port), ip_item.ssh_user, ip_item.ssh_rsa, ip_item.rsa_pass) res = doobj.imoocc_rsa_do(login_info, self.docker_cmd_list) # port_list = res["docker ps |awk -F '->' '{print $1}'|grep -v 'CONTAINER'|awk -F ':' '{print $NF}'|grep '^[0-9]'"].split("\n") port_list = res[ "docker ps |awk -F '->' '{print $1}'|grep -v 'CONTAINER'|awk 'BEGIN{FS~/s+/;}{print $NF\" \"$1\" \"$2;}'|sed s/0.0.0.0://"].split( "\n") for d_item in port_list: if d_item: print("...............d_item", d_item) d_port, d_id, d_dn = re.split('\s+', d_item)[:3] d_cid = d_id + d_dn docker_dct[d_port] = sn_trans(d_cid) sship_list = [(ip_item.ip, port) for port in docker_dct.keys() if port] nr = prpcrypt() canlogin_list, notlogin_list = self.try_docker_login(sship_list, self.password_list, self.docker_cmd) for ip, port in sship_list: # sship_obj = {} # sship_obj[ip] = port if canlogin_list.has_key(port): id = ConnectionInfo.objects.all().count() + 1 item_val = canlogin_list[port] ssh_passwd = nr.encrypt(item_val[1]) ConnectionInfo.objects.create(id=id, ssh_username=item_val[2], ssh_userpasswd=ssh_passwd, ssh_hostip=ip, ssh_host_port=port, ssh_status=1, ssh_type=4, sn_key=docker_dct[port]) py_id = PhysicalServerInfo.objects.get(conn_phy__sn_key=self.ip_key_dic[ip]).id VirtualServerInfo.objects.create(server_ip=ip, server_type="Docker Contianer", system_ver=item_val[3], sys_hostname=item_val[4], mac=item_val[5], sn=docker_dct[port], vir_phy_id=py_id, conn_vir_id=id) if notlogin_list.has_key(port): item_val = notlogin_list[ip] ConnectionInfo.objects.create(id=id, ssh_username=item_val[2], ssh_hostip=ip, ssh_host_port=item_val[0], ssh_status=0, ssh_type=5, sn_key=docker_dct[port]) py_id = PhysicalServerInfo.objects.get(conn_phy__sn_key=self.ip_key_dic[ip]).id VirtualServerInfo.objects.create(server_ip=ip, server_type="Docker Contianer", vir_phy_id=py_id, conn_vir_id=id)
def detail(request, types): """ 详情页 """ did = int(request.GET.get('dID')) machine_obj = Machines() sn_states = SnStates().sn_states() if types == "p": phy_servers = machine_obj.filter_machines(PhysicalServerInfo, pk=did)[0] item = phy_servers.__dict__ detail_name = "物理设备" template = 'detail/detail_p.html' elif types == "v": vir_servers = machine_obj.filter_machines(VirtualServerInfo, pk=did)[0] item = vir_servers.__dict__ detail_name = "虚拟设备" template = 'detail/detail_v.html' elif types == "n": networks = machine_obj.filter_machines(NetWorkInfo, pk=did)[0] print("networks..................."), networks item = networks.__dict__ print("item......................."), item detail_name = "网络设备" template = 'detail/detail_n.html' elif types == "o": others = machine_obj.filter_machines(OtherMachineInfo, pk=did)[0] item = others.__dict__ detail_name = "其它设备" template = "detail/detail_o.html" elif types == "c": conn = machine_obj.filter_machines(ConnectionInfo, pk=did)[0] conn.ssh_userpasswd = prpcrypt().decrypt(conn.ssh_userpasswd) item = conn.__dict__ detail_name = "用户连接" template = 'detail/detail_c.html' elif types == "nc": item = machine_obj.filter_machines(NetConnectionInfo, pk=did)[0] item.tel_userpasswd = prpcrypt().decrypt(item.tel_userpasswd) item.tel_enpasswd = prpcrypt().decrypt(item.tel_enpasswd) detail_name = "用户连接的网络设备" template = 'detail/detail_nc.html' elif types == 'op': item = machine_obj.filter_machines(MachineOperationsInfo, pk=did)[0] detail_name = '设备操作记录' template = 'detail/detail_opts.html' context = { 'title': "详情页", 'item': item, 'detail_name': detail_name, 'sn_states': sn_states } return render(request, template_name=template, context=context)
def dosnmp(self): nr = prpcrypt() for vm_item in self.vmware_p_list: vm_sn = self.ip_key_dic[vm_item] p_item = ConnectionInfo.objects.filter(sn_key=vm_sn) try: vmip = p_item[0].ssh_hostip.split(',')[0] ssh_passwd = nr.decrypt(p_item[0].ssh_userpasswd) ne = SnmpESXI(host=vmip, user=p_item[0].ssh_username, passwd=ssh_passwd) res = ne.dosnmp() py_id = PhysicalServerInfo.objects.get( conn_phy__sn_key=vm_sn).id for v_item in res: v_uuid = v_item['uuid'] v_vmname = v_item['name'] v_obj = VirtualServerInfo.objects.filter( sn__contains=v_uuid) if v_obj: v_obj.update(vir_phy=py_id, server_type=u"VMX:%s" % (v_vmname)) else: logger.error("Error:no vmx matched! %s %s" % (v_uuid, v_vmname)) print("Error:no vmx matched! %s %s" % (v_uuid, v_vmname)) except Exception as e: print("Vmware host sdk connect failed!%s" % (p_item[0].ssh_hostip)) logger.error("Error:Vmware host sdk connect failed!%s" % (p_item[0].ssh_hostip))
def NetDevLogin(dev_ips={}, backup_sw="False", back_server=""): crpt_do = prpcrypt() for ip, login_info in dev_ips.items(): if backup_sw == "True": jn = J_net_do(ip, login_info) res = jn.cisco_backup(back_server=back_server, sw_backup=True) else: jn = J_net_do(ip, login_info) res = jn.cisco_login() if res["status"] == "success" and res["level"] == 2: dev_obj = NetWorkInfo.objects.filter(host_ip=ip) if dev_obj: dev_sn_key = dev_obj[0].sn dev_id = dev_obj[0].id con_obj = NetConnectionInfo.objects.filter(sn_key=dev_sn_key) con_user, con_passwd, con_en_passwd = res["login_info"] crpt_pass = crpt_do.encrypt( con_passwd) if con_passwd else crpt_do.encrypt('') en_crpt_pass = crpt_do.encrypt( con_en_passwd) if con_passwd else crpt_do.encrypt('') if not con_obj: NetConnectionInfo.objects.create(tel_username=con_user, tel_userpasswd=crpt_pass, tel_enpasswd=en_crpt_pass, tel_host_port='21', tel_hostip=ip, sn_key=dev_sn_key, dev_info_id=dev_id, tel_status=1, tel_type=int( res["level"]))
def do_nmap(self, p_kvm_list): for item in p_kvm_list: ip_items = HostLoginifo.objects.filter(ip=item) docker_dct = {} nr = prpcrypt() for ip_item in ip_items: doobj = J_ssh_do([ip_item.ip, ip_item.ssh_port, ip_item.ssh_user]) if ip_item.ssh_type == 0: ssh_passwd = nr.decrypt(ip_item.ssh_passwd) login_info = (ip_item.ip, int(ip_item.ssh_port), ip_item.ssh_user, ssh_passwd) res = doobj.pass_do(login_info, self.p_kvm_cmds) if ip_item.ssh_type == 1: login_info = (ip_item.ip, int(ip_item.ssh_port), ip_item.ssh_user, ip_item.ssh_rsa) res = doobj.rsa_do(login_info, self.p_kvm_cmds) if ip_item.ssh_type == 2: login_info = (ip_item.ip, int(ip_item.ssh_port), ip_item.ssh_user, ip_item.ssh_rsa) res = doobj.dsa_do(login_info, self.p_kvm_cmds) if ip_item.ssh_type == 3: login_info = ( ip_item.ip, int(ip_item.ssh_port), ip_item.ssh_user, ip_item.ssh_rsa, ip_item.rsa_pass) res = doobj.imoocc_rsa_do(login_info, self.p_kvm_cmds) kvm_mac_list = res[self.p_kvm_cmds[0]].split('\n') for kvm_item in kvm_mac_list: if kvm_item: kvm_mac_str = mac_trans(kvm_item)[-10:] py_id = PhysicalServerInfo.objects.get(conn_phy__sn_key=self.ip_key_dic[item]).id v_obj = VirtualServerInfo.objects.filter(mac__contains=kvm_mac_str) if v_obj: v_obj.update(vir_phy=py_id, server_type="KVM") else: p_ob = PhysicalServerInfo.objects.filter(mac__contains=kvm_mac_str) if p_ob and len(p_ob) < 2: p_ob.update(vir_phy=py_id, server_type="KVM")
def run(self, ip, cmd): if ip and cmd: print ".......................ip", ip ip_item = HostLoginifo.objects.get(ip=ip) cn = prpcrypt() if ip_item.ssh_type == 0: ssh_passwd = cn.decrypt(ip_item.ssh_passwd) login_info = (ip_item.ip, int(ip_item.ssh_port), ip_item.ssh_user, ssh_passwd) res = self.pass_do(login_info, cmd) if ip_item.ssh_type == 1: login_info = (ip_item.ip, int(ip_item.ssh_port), ip_item.ssh_user, ip_item.ssh_rsa) res = self.rsa_do(login_info, cmd) if ip_item.ssh_type == 2: login_info = (ip_item.ip, int(ip_item.ssh_port), ip_item.ssh_user, ip_item.ssh_rsa) res = self.dsa_do(login_info, cmd) if ip_item.ssh_type == 3: login_info = (ip_item.ip, int(ip_item.ssh_port), ip_item.ssh_user, ip_item.ssh_rsa, ip_item.rsa_pass) res = self.imoocc_rsa_do(login_info, cmd) return res else: return ""
def pass_do(self, login_info, cmd_list=""): ''' 用户密码方式登录 :param login_info:登录的信息,如:('10.211.55.3', 22, 'parallels', 'xxx777') :param cmd_list:登录机器后,需要执行的命令 :return: ''' try: # transport = paramiko.Transport((login_info[0], login_info[1])) # print(transport.banner_timeout) # transport.banner_timeout = 30 # print(transport.banner_timeout) ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) if len(login_info[3]) == 32: crpt_de = prpcrypt() pp = crpt_de.decrypt(login_info[3]) login_info[3] = str(pp).split('\\')[0].split('\'')[-1] ssh.connect(login_info[0], login_info[1], login_info[2], login_info[3], timeout=3) self.result["status"] = "success" for cmd in cmd_list: stdin, stdout, stderr = ssh.exec_command(cmd, timeout=10) std_res = stdout.read() self.result[cmd] = std_res except Exception as e: self.result["status"] = "failed" self.result["res"] = str(e) return self.result
def snmp_begin(s_ownip, s_net, s_port, s_user, s_key, s_cmds): if not s_net: return False nm_item = NmapDev([]) canlogin_list, notlogin_list = nm_item.try_login(s_net, s_port, s_user, s_key, s_cmds) crpt_do = prpcrypt() if canlogin_list: for item in canlogin_list: # crpt_pass = crpt_do.encrypt(canlogin_list[item][1]) if len(canlogin_list[item][1]) != 32 else \ # canlogin_list[item][1] list = Host.objects.filter(hostip=s_net) for i in list: i.hostip = item i.port = str(canlogin_list[item][0]) i.password = s_key i.username = canlogin_list[item][2] i.ssh_status = 1 i.system_ver = canlogin_list[item][3] if canlogin_list[item][ 3] else "未获取" i.host_name = canlogin_list[item][4] if canlogin_list[item][ 4] else "未获取" i.mac_address = canlogin_list[item][5] if canlogin_list[item][ 5] else "未获取" i.sn = canlogin_list[item][6] if canlogin_list[item][ 6] else "请使用root用户登录获取" i.save() if notlogin_list: list = Host.objects.filter(hostip=s_net) try: for i in list: i.ssh_status = 0 i.save() except Exception as e: print(e) x = 1
def snmp_begin(nmap_type, ports, password_list, i_key_file, syscmd_list, black_list, s_emails): ''' 执行系统主机扫描 :param nmap_type: :param ports: :param password_list: :param i_key_file: :param i_key_file: :param syscmd_list: :param black_list: :param s_emails: :return: ''' if nmap_type is None: return False nmap_net = '%s.0/24' % nmap_type #实例化扫描 nm_item = NmapDev(black_list) #启动了SSH的设备IP和端口(sship_list),所有扫描到的主机IP(host_list),未启动SSH的设备(unkown__list) sship_list, host_list, unkown_list = nm_item.nmap_sship(ports, nmap_net) #可以登录SSH的设备IP,端口及登录信息等(canlogin_list);无法登录的SSH(notlogin_list) # 说明 # canlogin_lst = {port, password,root,system_info, sys_hostname, sys_mac, machine_type} # canlogin_lst = {端口,密码,root,系统信息,系统名,mac地址,sn号,机器类型} canlogin_list, notlogin_list = nm_item.try_login(sship_list, password_list, syscmd_list) #可以通过密钥登录的设备(key_login_list),无法通过密钥登录的设备(key_not_login_list) key_login_list, key_not_login_list = nm_item.try_key_login( notlogin_list, i_key_file, syscmd_list) print("Password Login ...", canlogin_list, notlogin_list) logger.info("Use password login:%s,%s" % (canlogin_list, notlogin_list)) print("Key Login ...", key_login_list, key_not_login_list) logger.info("Use key login:%s,%s" % (key_login_list, key_not_login_list)) email_message = u"(1)可以ssh 用户密码登录的服务器列表: \n %s \n \n (2)可以ssh 用户密钥登录的服务器列表 \n %s \n \n(3)无法ssh登录列表 \n %s \n \n (4)未知主机 \n %s" % ( canlogin_list, key_login_list, notlogin_list, unkown_list) # email_message = u"发不出去我现在也很绝望啊" email_sub = u"系统扫描结果" receive_addr = s_emails email_s = sendmail(receive_addr, email_sub, email_message) x = email_s.send() print(x) HostLoginifo.objects.filter(ip__contains=nmap_type).delete() crpt_do = prpcrypt() if canlogin_list: for item in canlogin_list: mathine_t = canlogin_list[item][7] if canlogin_list[item][ 7] else u"未知(需要安装dmidecode工具)" crpt_pass = crpt_do.encrypt( canlogin_list[item] [1]) if canlogin_list[item][1] else crpt_do.encrypt('') HostLoginifo.objects.update_or_create( ip=item, ssh_port=str(canlogin_list[item][0]), ssh_passwd=crpt_pass, ssh_user=canlogin_list[item][2], ssh_status=1, ssh_type=0, system_ver=canlogin_list[item][3], hostname=canlogin_list[item][4], mac_address=canlogin_list[item][5], sn=canlogin_list[item][6], mathine_type=mathine_t) if key_login_list: for item in key_login_list: mathine_t = key_login_list[item][9] if key_login_list[item][ 9] else u"未知(需要安装dmidecode工具)" HostLoginifo.objects.update_or_create( ip=item, ssh_port=key_login_list[item][0], ssh_rsa=key_login_list[item][1], ssh_user=key_login_list[item][2], rsa_pass=key_login_list[item][3], ssh_status=1, ssh_type=key_login_list[item][4], system_ver=key_login_list[item][5], hostname=key_login_list[item][6], mac_address=key_login_list[item][7], sn=key_login_list[item][8], mathine_type=mathine_t) return unkown_list, key_not_login_list
def snmp_begin(nmap_type, ports, password_list, imoocc_key_file, syscmd_list, black_list, s_emails): ''' 执行系统主机扫描 :param nmap_type: :param ports: :param password_list: :param imoocc_key_file: :param imoocc_key_file: :param syscmd_list: :param black_list: :param s_emails: :return: ''' if nmap_type is None: return False nmap_net = '%s.0/24' % nmap_type nm_item = NmapDev(black_list) sship_list, host_list, unkown_list = nm_item.nmap_sship(ports, nmap_net) print(".................ssh ip list", sship_list) canlogin_list, notlogin_list = nm_item.try_login(sship_list, password_list, syscmd_list) key_login_list, key_not_login_list = nm_item.try_key_login( notlogin_list, imoocc_key_file, syscmd_list) print("Password Login ...", canlogin_list, notlogin_list) logger.info("Use password login:%s,%s" % (canlogin_list, notlogin_list)) print("Key Login ...", key_login_list, key_not_login_list) logger.info("Use key login:%s,%s" % (key_login_list, key_not_login_list)) email_message = u"可以ssh 用户密码登录的服务器列表 \n %s \n 可以ssh 用户密钥登录的服务器列表 \n %s \n 无法ssh登录列表 \n %s \n 未知主机 \n %s"%(canlogin_list,\ key_login_list,notlogin_list,unkown_list) email_sub = u"系统扫描结果" receive_addr = s_emails email_s = sendmail(receive_addr, email_sub, email_message) email_s.send() HostLoginifo.objects.filter(ip__contains=nmap_type).delete() crpt_do = prpcrypt() if canlogin_list: for item in canlogin_list: mathine_t = canlogin_list[item][7] if canlogin_list[item][ 7] else u"未知(需要安装dmidecode工具)" crpt_pass = crpt_do.encrypt( canlogin_list[item] [1]) if canlogin_list[item][1] else crpt_do.encrypt('') HostLoginifo.objects.update_or_create( ip=item, ssh_port=str(canlogin_list[item][0]), ssh_passwd=crpt_pass, ssh_user=canlogin_list[item][2], ssh_status=1, ssh_type=0, system_ver=canlogin_list[item][3], hostname=canlogin_list[item][4], mac_address=canlogin_list[item][5], sn=canlogin_list[item][6], mathine_type=mathine_t) if key_login_list: for item in key_login_list: mathine_t = key_login_list[item][9] if key_login_list[item][ 9] else u"未知(需要安装dmidecode工具)" HostLoginifo.objects.update_or_create( ip=item, ssh_port=key_login_list[item][0], ssh_rsa=key_login_list[item][1], ssh_user=key_login_list[item][2], rsa_pass=key_login_list[item][3], ssh_status=1, ssh_type=key_login_list[item][4], system_ver=key_login_list[item][5], hostname=key_login_list[item][6], mac_address=key_login_list[item][7], sn=key_login_list[item][8], mathine_type=mathine_t) return unkown_list, key_not_login_list
def adhoc_task(request): if request.method == "POST": result = {} jobs = request.body init_jobs = json.loads(jobs) mod_type = init_jobs[ "mod_type"] if not init_jobs["mod_type"] else "shell" sn_keys = init_jobs["sn_key"] exec_args = init_jobs[u"exec_args"] group_name = init_jobs[ u"group_name"] if not init_jobs[u"group_name"] else "imoocc" taskid = init_jobs.get("taskid") if not sn_keys or not exec_args or not taskid: result = { 'status': "failed", "code": 002, "info": u"传入的参数mod_type不匹配!" } return HttpResponse(json.dumps(result), content_type="application/json") else: rlog = InsertAdhocLog(taskid=taskid) if mod_type not in ("shell", "yum", "copy"): result = {'status': "failed", "code": 003, "info": u"传入的参数不完整!"} rlog.record(id=10008) else: try: sn_keys = set(sn_keys) hosts_obj = ConnectionInfo.objects.filter(sn_key__in=sn_keys) rlog.record(id=10000) if len(sn_keys) != len(hosts_obj): rlog.record(id=40004) else: rlog.record(id=10002) resource = {} hosts_list = [] vars_dic = {} cn = prpcrypt() hosts_ip = [] for host in hosts_obj: sshpasswd = cn.decrypt(host.ssh_userpasswd) if host.ssh_type in (1, 2): """ resource = { "dynamic_host": { "hosts": [ {"hostname": "192.168.1.108", "port": "22", "username": "******", "ssh_key": "/etc/ansible/ssh_keys/id_rsa"}, {"hostname": "192.168.1.109", "port": "22", "username": "******","ssh_key": "/etc/ansible/ssh_keys/id_rsa"} ], "vars": { "var1":"ansible", "var2":"saltstack" } } } """ hosts_list.append({ "hostname": host.sn_key, "ip": host.ssh_hostip, "port": host.ssh_host_port, "username": host.ssh_username, "ssh_key": host.ssh_rsa }) hosts_ip.append(host.sn_key) elif host.ssh_type in (0, 4): hosts_list.append({ "hostname": host.sn_key, "ip": host.ssh_hostip, "port": host.ssh_host_port, "username": host.ssh_username, "password": sshpasswd }) hosts_ip.append(host.sn_key) elif host.ssh_type == 3: hosts_list.append({ "hostname": host.sn_key, "ip": host.ssh_hostip, "port": host.ssh_host_port, "username": host.ssh_username, "ssh_key": host.ssh_rsa, "password": sshpasswd }) hosts_ip.append(host.sn_key) resource[group_name] = { "hosts": hosts_list, "vars": vars_dic } rlog.record(id=10004) #任务锁检查 lockstatus = DsRedis.get(rkey="tasklock") if lockstatus is False or lockstatus == '1': # 已经有任务在执行 rlog.record(id=40005) else: # 开始执行任务 DsRedis.setlock("tasklock", 1) jdo = ANSRunner(resource=resource, redisKey='1') jdo.run_model(host_list=hosts_ip, module_name=mod_type, module_args=exec_args) res = jdo.get_model_result() rlog.record(id=19999, input_con=res) rlog.record(id=20000) DsRedis.setlock("tasklock", 0) result = {"status": "success", "info": res} except Exception as e: import traceback print traceback.print_exc() DsRedis.setlock("tasklock", 0) result = {"status": "failed", "code": 005, "info": e} finally: return HttpResponse(json.dumps(result), content_type="application/json")
def adhoc_task_g(request): if request.method == "POST": result = {} mod_type_tmp = request.POST.get('gmod').strip() mod_type = mod_type_tmp if mod_type_tmp else "shell" exec_args = request.POST.get('gexecargs') taskid = request.POST.get('gtaskid').strip() group_name = request.POST.get('group').strip() gob = GroupInfo.objects.filter(group_name=group_name) if not gob: result = {'status': "failed", "code": 006, "info": u"传入的组名不存在!"} return HttpResponse(json.dumps(result), content_type="application/json") if group_name.split('_')[1] == '1': zhuji_obj = ConnectionInfo.objects.filter(conn_grp1_id=gob[0].id) if group_name.split('_')[1] == '2': zhuji_obj = ConnectionInfo.objects.filter(conn_grp2_id=gob[0].id) if group_name.split('_')[1] == '3': zhuji_obj = ConnectionInfo.objects.filter(conn_grp3_id=gob[0].id) if group_name.split('_')[1] == '4': zhuji_obj = ConnectionInfo.objects.filter(conn_grp4_id=gob[0].id) if group_name.split('_')[1] == '5': zhuji_obj = ConnectionInfo.objects.filter(conn_grp5_id=gob[0].id) if group_name.split('_')[1] == '6': zhuji_obj = ConnectionInfo.objects.filter(conn_grp6_id=gob[0].id) if group_name.split('_')[1] == '7': zhuji_obj = ConnectionInfo.objects.filter(conn_grp7_id=gob[0].id) if group_name.split('_')[1] == '8': zhuji_obj = ConnectionInfo.objects.filter(conn_grp8_id=gob[0].id) if group_name.split('_')[1] == '9': zhuji_obj = ConnectionInfo.objects.filter(conn_grp9_id=gob[0].id) if group_name.split('_')[1] == '10': zhuji_obj = ConnectionInfo.objects.filter(conn_grp10_id=gob[0].id) if group_name.split('_')[1] == '11': zhuji_obj = ConnectionInfo.objects.filter(conn_grp11_id=gob[0].id) if group_name.split('_')[1] == '12': zhuji_obj = ConnectionInfo.objects.filter(conn_grp12_id=gob[0].id) if group_name.split('_')[1] == '13': zhuji_obj = ConnectionInfo.objects.filter(conn_grp13_id=gob[0].id) if group_name.split('_')[1] == '14': zhuji_obj = ConnectionInfo.objects.filter(conn_grp14_id=gob[0].id) if group_name.split('_')[1] == '15': zhuji_obj = ConnectionInfo.objects.filter(conn_grp15_id=gob[0].id) if not zhuji_obj: result = { 'status': "failed", "code": 007, "info": u"传入的组为空,没有包含主机!" } return HttpResponse(json.dumps(result), content_type="application/json") zhuji_list = [i.ssh_hostip for i in zhuji_obj] if not exec_args or not taskid: result = {'status': "failed", "code": 002, "info": u"传入的参数不完整!"} return HttpResponse(json.dumps(result), content_type="application/json") else: rlog = InsertAdhocLog(taskid=taskid) if mod_type not in ("shell", "yum", "copy"): result = { 'status': "failed", "code": 003, "info": u"传入的参数mod_type不匹配!" } rlog.record(id=10008) return HttpResponse(json.dumps(result), content_type="application/json") else: try: zhuji_list = set(zhuji_list) hosts_obj = ConnectionInfo.objects.filter( ssh_hostip__in=zhuji_list) rlog.record(id=10000) if len(zhuji_list) != len(hosts_obj): rlog.record(id=40004) else: rlog.record(id=10002) resource = {} hosts_list = [] vars_dic = {} cn = prpcrypt() hosts_ip = [] for host in hosts_obj: sshpasswd = cn.decrypt(host.ssh_userpasswd) if host.ssh_type in (1, 2): """ #组装符合下面格式的resource传入到封装好的ansible API中 resource = { "dynamic_host": { "hosts": [ {"hostname": "192.168.1.108", "port": "22", "username": "******", "ssh_key": "/etc/ansible/ssh_keys/id_rsa"}, {"hostname": "192.168.1.109", "port": "22", "username": "******","ssh_key": "/etc/ansible/ssh_keys/id_rsa"} ], "vars": { "var1":"ansible", "var2":"saltstack" } } } """ hosts_list.append({ "hostname": host.sn_key, "ip": host.ssh_hostip, "port": host.ssh_host_port, "username": host.ssh_username, "ssh_key": host.ssh_rsa }) hosts_ip.append(host.sn_key) elif host.ssh_type in (0, 4): hosts_list.append({ "hostname": host.sn_key, "ip": host.ssh_hostip, "port": host.ssh_host_port, "username": host.ssh_username, "password": sshpasswd }) hosts_ip.append(host.sn_key) elif host.ssh_type == 3: hosts_list.append({ "hostname": host.sn_key, "ip": host.ssh_hostip, "port": host.ssh_host_port, "username": host.ssh_username, "ssh_key": host.ssh_rsa, "password": sshpasswd }) hosts_ip.append(host.sn_key) resource[group_name] = { "hosts": hosts_list, "vars": vars_dic } rlog.record(id=10003) #任务锁检查 lockstatus = DsRedis.get(rkey="tasklock") if lockstatus is None or lockstatus == '1': # 已经有任务在执行 rlog.record(id=40005) result = { 'status': "failed", "code": 004, "info": u"已经有任务在执行,或者tasklock没有设置初始值!" } else: # 开始执行任务 rlog.record(id=10004) DsRedis.setlock("tasklock", 1) jdo = ANSRunner(resource=resource) jdo.run_model(host_list=hosts_ip, module_name=mod_type, module_args=exec_args) res = jdo.get_model_result() rlog.record(id=19999, input_con=res) rlog.record(id=20000) DsRedis.setlock("tasklock", 0) result = { "status": "success", "code": 001, "info": res } except Exception as e: import traceback print traceback.print_exc() DsRedis.setlock("tasklock", 0) result = {"status": "failed", "code": 005, "info": e} finally: return HttpResponse(json.dumps(result), content_type="application/json")
def gen_new_passwd(): # 生成新用户名密码 crpt_do = prpcrypt() crpt_new = crpt_do.encrypt(str(random.randint(0, 600000))) return crpt_new