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 process_response(request, response): if request.method == 'POST' and 'run_module' in request.path and response.status_code == 200: post_data = dict(request._post) ans_server = [ ServerAssets.objects.get(id=host_id).assets.asset_management_ip for host_id in post_data['ans_group_hosts'] ] response_data = str(response.__dict__.get('_container')[0], encoding="utf-8") res = eval(response_data)['msg'] module_record.delay(ans_user=request.user, ans_remote_ip=request.META['REMOTE_ADDR'], ans_module=''.join(post_data['ansibleModule']) if post_data['ansibleModule'] != ['custom'] else ''.join(post_data['customModule']), ans_args=''.join( post_data['ansibleModuleArgs']), ans_server=ans_server, ans_result=res) elif request.method == 'GET' and response.status_code == 200: user_infos = [] users = UserProfile.objects.all() for user in users: user_info = { 'user_id': user.id, 'username': user.username, 'user_image': str(user.image), 'login_status': user.login_status } user_infos.append(user_info) request.session['user_infos'] = user_infos return response