def run_model(self, group_ids, host_ids, selected_module_name, custom_model_name, module_args): gen_resource = GenResource() if group_ids == ['custom'] or group_ids == ['all']: resource = gen_resource.gen_host_list(host_ids) else: resource = gen_resource.gen_group_dict(group_ids) host_list = [ServerAssets.objects.get(id=host_id).assets.asset_management_ip for host_id in host_ids] module_name = selected_module_name if selected_module_name != 'custom' else custom_model_name unique_key = '{}.{}.{}'.format(host_ids, module_name, module_args) if self.redis_instance.get(unique_key): self.send('<code style="color: #FF0000">\n有相同的任务正在进行!请稍后重试!\n</code>', close=True) else: try: self.redis_instance.set(unique_key, 1) ans = ANSRunner(resource, become='yes', become_method='sudo', become_user='******', sock=self) ans.run_module(host_list=host_list, module_name=module_name, module_args=module_args) module_record.delay(ans_user=UserProfile.objects.get(id=self.ans_info['run_user']), ans_remote_ip=self.ans_info['remote_ip'], ans_module=module_name, ans_args=module_args, ans_server=host_list, ans_result=ans.get_module_results) except Exception as e: self.send('<code style="color: #FF0000">\nansible执行模块出错:{}\n</code>'.format(str(e))) finally: self.redis_instance.delete(unique_key) self.close()
def run_module(request): if request.method == 'POST': gen_resource = GenResource() redis_conn = RedisOps(settings.REDIS_HOST, settings.REDIS_PORT, settings.REDIS_DB) remote_ip = request.META['REMOTE_ADDR'] group_ids = request.POST.getlist('hostGroup') host_ids = request.POST.getlist('ans_group_hosts') if group_ids == ['custom'] or group_ids == ['all']: resource = gen_resource.gen_host_list(host_ids) else: resource = gen_resource.gen_group_dict(group_ids) host_list = [ ServerAssets.objects.get(id=host_id).assets.asset_management_ip for host_id in host_ids ] selected_module_name = request.POST.get('ansibleModule') custom_model_name = request.POST.get('customModule') module_name = selected_module_name if selected_module_name != 'custom' else custom_model_name module_args = request.POST.get('ansibleModuleArgs') unique_key = '{}.{}.{}'.format(host_ids, module_name, module_args) if redis_conn.exists(unique_key): return JsonResponse({'msg': ['有相同的任务正在执行,请稍后再试'], 'code': 403}) else: try: redis_conn.set(unique_key, 1) ans = ANSRunner(resource, become='yes', become_method='sudo', become_user='******') ans.run_module(host_list=host_list, module_name=module_name, module_args=module_args) res = ans.get_model_result() return JsonResponse({'code': 200, 'msg': res}) except Exception as e: return JsonResponse({ 'code': 500, 'msg': ['任务执行失败:{}'.format(e)] }) finally: redis_conn.delete(unique_key) inventory = AnsibleInventory.objects.prefetch_related('ans_group_hosts') hosts = ServerAssets.objects.select_related('assets') return render(request, 'task/run_module.html', locals())
def run_playbook(self, group_ids, playbook_id): playbook = AnsiblePlaybook.objects.select_related('playbook_user').get( id=playbook_id) unique_key = '{}.{}'.format(playbook.playbook_name, group_ids) if self.redis_instance.get(unique_key): self.send( '<code style="color: #FF0000">\n有相同的任务正在进行!请稍后重试!\n</code>', close=True) else: try: self.redis_instance.set(unique_key, 1) resource = GenResource().gen_group_dict(group_ids) ans = ANSRunner(resource, sock=self) ans.run_playbook(playbook.playbook_file.path) playbook_record.delay( playbook_user=UserProfile.objects.get( id=self.ans_info['run_user']), playbook_remote_ip=self.ans_info['remote_ip'], playbook_name=playbook.playbook_name, playbook_result=ans.get_playbook_results) except Exception as e: self.send( '<code style="color: #FF0000">\nansible执行playbook出错:{}\n</code>' .format(str(e))) finally: self.redis_instance.delete(unique_key) self.close()
def get_playbook_res(group_ids, playbook_file): resource = GenResource().gen_group_dict(group_ids) ans = ANSRunner(resource) ans.run_playbook(playbook_file) res = ans.get_playbook_result() return res
def fort_server(request): fort_servers = FortServer.objects.select_related('server') black_commands, created = FortBlackCommand.objects.get_or_create(id=1) fort_users = FortServerUser.objects.select_related('fort_server') if request.method == 'POST': try: new_black_commands = request.POST.get('black_commands') if fort_users.count() > 0: old_format_commands = format_commands( black_commands.black_commands) new_format_commands = format_commands(new_black_commands) for fort_server_obj in fort_servers: sudo_users = [ user.fort_username for user in fort_server_obj.fortserveruser_set.all() ] resource = GenResource().gen_host_list( list(str(fort_server_obj.server.id))) ans = ANSRunner(resource) ans.run_module( host_list=fort_server_obj.server.assets. asset_management_ip, module_name='shell', module_args= r"cd /etc/sudoers.d/ && sed -i 's@{}@{}@' {}".format( old_format_commands, new_format_commands, ' '.join(sudo_users))) FortBlackCommand.objects.filter(id=1).update( black_commands=new_black_commands) return JsonResponse({'code': 200, 'msg': '更新成功!'}) else: FortBlackCommand.objects.filter(id=1).update( black_commands=new_black_commands) return JsonResponse({'code': 200, 'msg': '更新成功!'}) except Exception as e: return JsonResponse({'code': 500, 'msg': '更新失败!:{}'.format(e)}) hosts = ServerAssets.objects.select_related('assets') server_protocols = FortServer.server_protocols server_status = FortServer.server_status_ fort_user_status = FortServerUser.fort_user_status_ users = UserProfile.objects.all() groups = Group.objects.all() remote_ip = request.META['REMOTE_ADDR'] return render(request, 'fort/fort_server.html', locals())
def get_inventory_hosts(request): if request.method == 'POST': group_ids = request.POST.getlist('hostGroup') hosts = GenResource().gen_host_dict(group_ids) return JsonResponse({'code': 200, 'hosts': hosts})
def get_inventory_hosts(request): group_ids = request.GET.getlist('hostGroup') print(group_ids, type(group_ids)) hosts = GenResource().gen_host_dict(group_ids) return JsonResponse({'code': 200, 'hosts': hosts})