def execute(self, results):
        """
        Executes the action_block in the PinFile
        """
        self.load()
        extra_vars = {}

        for action in self.action_data["actions"]:
            result = {}
            path = self.action_data["path"]
            playbook = action.get("playbook")

            if not (os.path.isfile(playbook)):
                playbook = "{0}/{1}".format(path, playbook)

            if "vars" in action:
                var_file = "{0}/{1}".format(path, action.get("vars"))
                ext = var_file.split(".")[-1]
                extra_vars = open(var_file, "r").read()

                if ("yaml" in ext) or ("yml" in ext):
                    extra_vars = yaml.load(extra_vars)
                else:
                    extra_vars = json.loads(extra_vars)

            e_vars = action.get("extra_vars", {})
            extra_vars.update(e_vars)
            extra_vars['hook_data'] = results
            verbosity = self.kwargs.get('verbosity', 1)

            if self.context:
                extra_vars.update(self.get_ctx_params())
            if 'inventory_file' in self.target_data and self.context:
                inv_file = self.target_data["inventory_file"]
                runner = ansible_runner(playbook,
                                        "",
                                        extra_vars,
                                        inventory_src=inv_file,
                                        verbosity=verbosity)

                result['state'] = str(self.state)
                result['return_code'] = runner[0]
                result['data'] = runner[1]
            else:
                # runner : the data from the ansible runner, which will be
                # associated with that state
                runner = ansible_runner(playbook,
                                        "",
                                        extra_vars,
                                        inventory_src="localhost",
                                        verbosity=verbosity)
                result['state'] = str(self.state)
                result['return_code'] = runner[0]
                result['data'] = runner[1]
            results.append(result)
        return results
Beispiel #2
0
    def execute(self):

        """
        Executes the action_block in the PinFile
        """

        self.load()
        extra_vars = {}
        runners = []

        for action in self.action_data["actions"]:
            path = self.action_data["path"]
            playbook = action.get("playbook")

            if not(os.path.isfile(playbook)):
                playbook = "{0}/{1}".format(path, playbook)

            if "vars" in action:
                var_file = "{0}/{1}".format(path, action.get("vars"))
                ext = var_file.split(".")[-1]
                extra_vars = open(var_file, "r").read()

                if ("yaml" in ext) or ("yml" in ext):
                    extra_vars = yaml.load(extra_vars)
                else:
                    extra_vars = json.loads(extra_vars)

            e_vars = action.get("extra_vars", {})
            extra_vars.update(e_vars)
            verbosity = self.kwargs.get('verbosity', 1)

            if self.context:
                extra_vars.update(self.get_ctx_params())
            if 'inventory_file' in self.target_data and self.context:
                inv_file = self.target_data["inventory_file"]
                runners.append(ansible_runner(playbook,
                                              "",
                                              extra_vars,
                                              inventory_src=inv_file,
                                              verbosity=verbosity))
            else:
                runners.append(ansible_runner(playbook,
                                              "",
                                              extra_vars,
                                              inventory_src="localhost",
                                              verbosity=verbosity))
        return runners
Beispiel #3
0
 def _find_n_run_pb(self, pb_name, inv_src, console=True):
     pb_path = self._find_playbook_path(pb_name)
     playbook_path = '{0}/{1}{2}'.format(pb_path, pb_name, self.pb_ext)
     extra_vars = self.get_evar()
     return_code, res = ansible_runner(playbook_path,
                                       self._get_module_path(),
                                       extra_vars,
                                       inventory_src=inv_src,
                                       verbosity=self.ctx.verbosity,
                                       console=console)
     return return_code, res
Beispiel #4
0
 def _find_n_run_pb(self, pb_name, inv_src, console=True):
     pb_path = self._find_playbook_path(pb_name)
     playbook_path = '{0}/{1}{2}'.format(pb_path, pb_name, self.pb_ext)
     extra_vars = self.get_evar()
     return_code, res = ansible_runner(playbook_path,
                                       self._get_module_path(),
                                       extra_vars,
                                       inventory_src=inv_src,
                                       verbosity=self.ctx.verbosity,
                                       console=console)
     return return_code, res
Beispiel #5
0
    def _invoke_playbooks(self, resources, action='up', console=True):
        """
        Uses the Ansible API code to invoke the specified linchpin playbook

        :param resources: dict of resources to provision
        :param action: Which ansible action to run (default: 'up')
        :param console: Whether to display the ansible console (default: True)
        """

        return_code = 0
        results = []

        self.set_evar('_action', action)
        self.set_evar('state', 'present')

        if action == 'destroy':
            self.set_evar('state', 'absent')

        for resource in resources:
            self.set_evar('resources', resource)
            playbook = resource.get('resource_group_type')
            pb_path = self._find_playbook_path(playbook)
            playbook_path = '{0}/{1}{2}'.format(pb_path, playbook, self.pb_ext)

            module_paths = []
            module_folder = self.get_cfg('lp',
                                         'module_folder',
                                         default='library')

            for path in reversed(self.pb_path):
                module_paths.append('{0}/{1}/'.format(path, module_folder))

            extra_vars = self.get_evar()
            inventory_src = '{0}/localhost'.format(self.workspace)

            verbosity = self.ctx.verbosity
            return_code, res = ansible_runner(playbook_path,
                                              module_paths,
                                              extra_vars,
                                              inventory_src=inventory_src,
                                              verbosity=verbosity,
                                              console=console)

            if res:
                results.append(res)


        if not len(results):
            results = None

        return (return_code, results)
Beispiel #6
0
    def _invoke_playbooks(self, resources, action='up', console=True):
        """
        Uses the Ansible API code to invoke the specified linchpin playbook

        :param resources: dict of resources to provision
        :param action: Which ansible action to run (default: 'up')
        :param console: Whether to display the ansible console (default: True)
        """

        return_code = 0
        results = []

        self.set_evar('_action', action)
        self.set_evar('state', 'present')

        if action == 'destroy':
            self.set_evar('state', 'absent')

        for resource in resources:
            self.set_evar('resources', resource)
            playbook = resource.get('resource_group_type')
            pb_path = self._find_playbook_path(playbook)
            playbook_path = '{0}/{1}{2}'.format(pb_path, playbook, self.pb_ext)

            module_paths = []
            module_folder = self.get_cfg('lp',
                                         'module_folder',
                                         default='library')

            for path in reversed(self.pb_path):
                module_paths.append('{0}/{1}/'.format(path, module_folder))

            extra_vars = self.get_evar()
            inventory_src = '{0}/localhost'.format(self.workspace)

            verbosity = self.ctx.verbosity
            return_code, res = ansible_runner(playbook_path,
                                              module_paths,
                                              extra_vars,
                                              inventory_src=inventory_src,
                                              verbosity=verbosity,
                                              console=console)

            if res:
                results.append(res)

        if not len(results):
            results = None

        return (return_code, results)
Beispiel #7
0
    def _find_n_run_pb(self, pb_name, inv_src, console=True):
        self._get_role(pb_name)
        use_shell = ast.literal_eval(str(self.ctx.get_cfg("ansible",
                                                          "use_shell")))
        if pb_name == 'setup':
            pb_path = self._find_playbook_path("setup.yml")
            playbook_path = '{0}/{1}{2}'.format(pb_path, 'setup', self.pb_ext)
        else:
            pb_path = self._find_playbook_path("linchpin.yml")
            playbook_path = '{0}/{1}{2}'.format(pb_path,
                                                'linchpin',
                                                self.pb_ext)
        extra_vars = self.get_evar()
        env_vars = self.ctx.get_env_vars()
        if self.ctx.no_monitor:
            return_code, res = ansible_runner(playbook_path,
                                              self._get_module_path(),
                                              extra_vars,
                                              vault_password_file=None,
                                              inventory_src=inv_src,
                                              verbosity=self.ctx.verbosity,
                                              console=console,
                                              env_vars=env_vars,
                                              use_shell=use_shell
                                             )
        else:
            res = extra_vars['resources']
            group = res['resource_group_name']
            self.pbar.postfix[0] = dict(group="resource group '%s'" % group)
            self.pbar.refresh()
            with ProcessPoolExecutor() as executor:
                executor.submit(progress_monitor, self.disable_pbar, res)
                ansible_thread = executor.submit(
                    ansible_runner,
                    playbook_path,
                    self._get_module_path(),
                    extra_vars,
                    vault_password_file=None,
                    inventory_src=inv_src,
                    verbosity=self.ctx.verbosity,
                    console=console,
                    env_vars=env_vars,
                    use_shell=use_shell)

                return_code, res = ansible_thread.result()
            self.pbar.postfix[0] = dict(group="Finishing resource group " +
                                        group)
            self.pbar.refresh()
            self.pbar.update()
        return return_code, res
Beispiel #8
0
 def _find_n_run_pb(self, pb_name, inv_src, console=True):
     use_shell = ast.literal_eval(str(self.ctx.get_cfg("ansible",
                                                       "use_shell")))
     pb_path = self._find_playbook_path(pb_name)
     playbook_path = '{0}/{1}{2}'.format(pb_path, pb_name, self.pb_ext)
     extra_vars = self.get_evar()
     env_vars = self.ctx.get_env_vars()
     return_code, res = ansible_runner(playbook_path,
                                       self._get_module_path(),
                                       extra_vars,
                                       vault_password_file=None,
                                       inventory_src=inv_src,
                                       verbosity=self.ctx.verbosity,
                                       console=console,
                                       env_vars=env_vars,
                                       use_shell=use_shell)
     return return_code, res