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')
Exemplo n.º 3
0
            "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')
Exemplo n.º 4
0
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')
Exemplo n.º 5
0
        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')
Exemplo n.º 6
0
              "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')
Exemplo n.º 7
0
        "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')
Exemplo n.º 8
0
            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>')
Exemplo n.º 9
0
                            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')
Exemplo n.º 10
0
        }
    ])
    @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>')
Exemplo n.º 11
0
        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')
Exemplo n.º 12
0
            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')
Exemplo n.º 13
0
    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>')