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
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
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
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
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)
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)
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
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