resp = app.make_response((result, 404)) return resp elif task.state == 'PROGRESS': result_obj = { 'Status': "PROGRESS", 'description': "Task is currently running", 'returncode': None } else: try: return_code = task.info['returncode'] description = task.info['description'] if return_code is 0: result_obj = { 'Status': "SUCCESS", 'description': description } else: result_obj = { 'Status': "FLANSIBLE_TASK_FAILURE", 'description': description, 'returncode': return_code } except Exception as e: result_obj = {'Status': "CELERY_FAILURE: %s" % str(e)} return result_obj api.add_resource(AnsibleTaskStatus, '/api/ansibletaskstatus/<string:task_id>')
has_inv_access = get_inventory_access(curr_user, inventory) if not has_inv_access: resp = app.make_response((str.format("User does not have access to inventory {0}", inventory), 403)) return resp else: if not os.path.exists(inventory): resp = app.make_response((str.format("Inventory path not found: {0}", inventory), 404)) return resp inventory = str.format(" -i {0}", inventory) if become: become_string = ' --become' else: become_string = '' extra_vars_string = '' if extra_vars: #extra_vars_string = str.format(" --extra-vars \'{0}\'", (json.dumps(extra_vars))) extra_vars_string = " --extra-vars '%s'" % (json.dumps(extra_vars).replace("'", "'\\''")) if vault_file: vault_file_string = " --vault-password-file '%s'" % (vault_file) command = str.format("cd {0};ansible-playbook {1}{2}{3}{4}{5}", playbook_dir, playbook, become_string, inventory, extra_vars_string, vault_file_string) task_result = celery_runner.do_long_running_task.apply_async([command], soft=task_timeout, hard=task_timeout) result = {'task_id': task_result.id} return result api.add_resource(RunAnsiblePlaybook, '/api/ansibleplaybook')
"code": 200, "message": "List of playbooks" }]) @auth.login_required def get(self): curr_user = auth.username() yamlfiles = [] print("listing playbooks in " + playbook_root) for root, dirs, files in os.walk(playbook_root): for name in files: if (get_playbook_repo_access(curr_user, root)): if name.endswith((".yaml", ".yml")): fileobj = {'playbook': name, 'playbook_dir': root} yamlfiles.append(fileobj) returnedfiles = [] for fileobj in yamlfiles: if 'group_vars' in fileobj['playbook_dir']: pass elif fileobj['playbook_dir'].endswith('handlers'): pass elif fileobj['playbook_dir'].endswith('vars'): pass else: returnedfiles.append(fileobj) return returnedfiles api.add_resource(Playbooks, '/api/listplaybooks')
class DownloadLogs(Resource): @swagger.operation(notes='download logs from ansible server', nickname='download logs', responseMessages=[{ "code": 200, "message": "successfully downloaded flansible logs" }, { "code": 404, "message": "fail to archive ansible playbook" }]) @auth.login_required def get(self): log_files = '/tmp/flansible_logs_{0}'.format( time.strftime("%Y%m%d_%H%M%S")) playbook_root = config.get("Default", "playbook_root") try: shutil.make_archive(log_files, 'zip', playbook_root) except Exception as e: logger.debug("fail to archive {0}: {1}".format( playbook_root, e.message)) return "fail to archive log files", 404 return send_file('{0}.zip'.format(log_files), as_attachment=True) api.add_resource(DownloadLogs, '/api/download-logs')
else: become_string = '' if become_method: become_method_string = str.format(' --become-method={0}', become_method) else: become_method_string = '' if become_user: become_user_string = str.format(' --become-user={0}', become_user) else: become_user_string = '' command = str.format("ansible {9} -m {0} {1} {2} {3}{4}{5}{6}{7}{8}", req_module, module_args_string, fork_string, verb_string, become_string, become_method_string, become_user_string, inventory, extra_vars_string, host_pattern ) task_result = celery_runner.do_long_running_task.apply_async([command], soft=task_timeout, hard=task_timeout) result = {'task_id': task_result.id} return result api.add_resource(RunAnsibleCommand, '/api/ansiblecommand')
"code": 200, "message": "List of playbooks" } ] ) @auth.login_required def get(self): yamlfiles = [] print("listing playbooks in " + playbook_root) for root, dirs, files in os.walk(playbook_root): for name in files: if name.endswith((".yaml", ".yml")): fileobj = {'playbook': name, 'playbook_dir': root} yamlfiles.append(fileobj) returnedfiles = [] for fileobj in yamlfiles: if 'group_vars' in fileobj['playbook_dir']: pass elif fileobj['playbook_dir'].endswith('handlers'): pass elif fileobj['playbook_dir'].endswith('vars'): pass else: returnedfiles.append(fileobj) return returnedfiles api.add_resource(Playbooks, '/api/listplaybooks')
"allowMultiple": False, "dataType": 'bool', "paramType": "body" }, ]) @auth.login_required def post(self): parser = reqparse.RequestParser() parser.add_argument('playbook_dir', type=str, help='folder where playbook file resides', required=True) parser.add_argument('remote_name', type=str, help='remote name', required=False) parser.add_argument('branch_name', type=str, help='branch name', required=False) parser.add_argument('reset', type=bool, help='hard reset', required=False) args = parser.parse_args() playbook_dir = args['playbook_dir'] remote_name = args['remote_name'] branch_name = args['branch_name'] reset = args['reset'] if not remote_name: remote_name = 'origin' if not branch_name: branch_name = 'master' if not reset: reset = False task_result = FlansibleGit.update_git_repo(playbook_dir, remote_name, branch_name, reset) result = {'task_id': task_result.id} return result api.add_resource(git, '/api/git')
return { 'Status': "ERROR", 'description': e.message, 'returncode': 1 }, 404 if task.state == 'PENDING': result_obj = { 'Status': "PENDING", 'description': "Task not found", 'output': None, 'returncode': None } elif task.state == "PROGRESS": result_obj = { 'Status': "PROGRESS", 'description': "Task not found", 'output': task.info['output'], 'returncode': None } else: result_obj = { 'Status': "SUCCESS", 'description': "Task not found", 'output': task.info['output'], 'returncode': 0 } return result_obj, 200 api.add_resource(AnsibleTaskOutput, '/api/ansibletaskoutput/<string:task_id>')
help='remote name', required=False) parser.add_argument('branch_name', type=str, help='branch name', required=False) parser.add_argument('reset', type=bool, help='hard reset', required=False) args = parser.parse_args() playbook_dir = args['playbook_dir'] remote_name = args['remote_name'] branch_name = args['branch_name'] reset = args['reset'] if not remote_name: remote_name = 'origin' if not branch_name: branch_name = 'master' if not reset: reset = False task_result = FlansibleGit.update_git_repo(playbook_dir, remote_name, branch_name, reset) result = {'task_id': task_result.id} return result api.add_resource(git, '/api/git')
} ]) @auth.login_required def get(self, task_id): task = celery_runner.do_long_running_task.AsyncResult(task_id) if task.state == 'PENDING': result = "Task not found" resp = app.make_response((result, 404)) return resp elif task.state == 'PROGRESS': result_obj = {'Status': "PROGRESS", 'description': "Task is currently running", 'returncode': None} else: try: return_code = task.info['returncode'] description = task.info['description'] if return_code is 0: result_obj = {'Status': "SUCCESS", 'description': description} else: result_obj = {'Status': "FLANSIBLE_TASK_FAILURE", 'description': description, 'returncode': return_code} except Exception as e: result_obj = {'Status': "CELERY_FAILURE: %s" % str(e)} return result_obj api.add_resource(AnsibleTaskStatus, '/api/ansibletaskstatus/<string:task_id>')
book_name = req_args['book_name'] book_plays = req_args['book_plays'] if not book_plays: result = "playbook content is empty" logger.debug(result) return result, 400 if not allowed_file(book_name): result = "playbook name no valid" logger.debug(result) return result, 400 playbook_root = config.get("Default", "playbook_root") logger.debug("playbook {0} will be saved to {1}".format( book_name, playbook_root)) valid_data = data_validator(book_plays) if valid_data is None: return "can not convert string to yaml format", 400 with open(os.path.join(playbook_root, book_name), "w") as F: yaml.safe_dump(valid_data, F, default_flow_style=False) logger.debug("saved {0} to playbook {1} in dir {2}".format( book_plays, book_name, playbook_root)) return "playbook uploaded", 201 api.add_resource(PostAnsiblePlaybook, '/api/post-ansible-playbook')
verb_string = " -" while verb_counter <= verbose_level: verb_string += "v" verb_counter += 1 else: verb_string = '' if become: become_string = ' --become' else: become_string = '' if become_method: become_method_string = str.format(' --become-method={0}', become_method) else: become_method_string = '' if become_user: become_user_string = str.format(' --become-user={0}', become_user) else: become_user_string = '' command = str.format("ansible {9} -m {0} {1} {2} {3}{4}{5}{6}{7}{8}", req_module, module_args_string, fork_string, verb_string, become_string, become_method_string, become_user_string, inventory, extra_vars_string ,host_pattern) task_result = celery_runner.do_long_running_task.apply_async([command], soft=task_timeout, hard=task_timeout) result = {'task_id': task_result.id} return result api.add_resource(RunAnsibleCommand, '/api/ansiblecommand')
nickname='ansibletaskoutput', parameters=[ { "name": "task_id", "description": "The ID of the task/job to get status for", "required": True, "allowMultiple": False, "dataType": 'string', "paramType": "path" } ]) @auth.login_required def get(self, task_id): task = celery_runner.do_long_running_task.AsyncResult(task_id) if task.state == 'PENDING': result = "Task not found" resp = app.make_response((result, 404)) return resp if task.state == "PROGRESS": result = task.info['output'] else: result = task.info['output'] #result_out = task.info.replace('\n', "<br>") #result = result.replace('\n', '<br>') #return result, 200, {'Content-Type': 'text/html; charset=utf-8'} resp = app.make_response((result, 200)) resp.headers['content-type'] = 'text/plain' return resp api.add_resource(AnsibleTaskOutput, '/api/ansibletaskoutput/<string:task_id>')