def _get_role_path(self, role): """ Returns the path on disk to the directory containing the role directories like tasks, templates, etc. Also returns any variables that were included with the role """ orig_path = template(self.basedir, role, self.vars) role_vars = {} if type(orig_path) == dict: # what, not a path? parsed_role = utils.role_yaml_parse(orig_path) role_name = parsed_role.get('role', parsed_role.get('name')) if role_name is None: raise errors.AnsibleError( "expected a role name in dictionary: %s" % orig_path) role_vars = orig_path else: role_name = utils.role_spec_parse(orig_path)["name"] role_path = None possible_paths = [ utils.path_dwim(self.basedir, os.path.join('roles', role_name)), utils.path_dwim(self.basedir, role_name) ] if C.DEFAULT_ROLES_PATH: search_locations = C.DEFAULT_ROLES_PATH.split(os.pathsep) for loc in search_locations: loc = os.path.expanduser(loc) possible_paths.append(utils.path_dwim(loc, role_name)) for path_option in possible_paths: if os.path.isdir(path_option): role_path = path_option break if role_path is None: raise errors.AnsibleError("cannot find role in %s" % " or ".join(possible_paths)) return (role_path, role_vars)
def _get_role_path(self, role): """ Returns the path on disk to the directory containing the role directories like tasks, templates, etc. Also returns any variables that were included with the role """ orig_path = template(self.basedir,role,self.vars) role_vars = {} if type(orig_path) == dict: # what, not a path? parsed_role = utils.role_yaml_parse(orig_path) role_name = parsed_role.get('role', parsed_role.get('name')) if role_name is None: raise errors.AnsibleError("expected a role name in dictionary: %s" % orig_path) role_vars = orig_path else: role_name = utils.role_spec_parse(orig_path)["name"] role_path = None possible_paths = [ utils.path_dwim(self.basedir, os.path.join('roles', role_name)), utils.path_dwim(self.basedir, role_name) ] if C.DEFAULT_ROLES_PATH: search_locations = C.DEFAULT_ROLES_PATH.split(os.pathsep) for loc in search_locations: loc = os.path.expanduser(loc) possible_paths.append(utils.path_dwim(loc, role_name)) for path_option in possible_paths: if os.path.isdir(path_option): role_path = path_option break if role_path is None: raise errors.AnsibleError("cannot find role in %s" % " or ".join(possible_paths)) return (role_path, role_vars)
def _load_roles(self, roles, ds): # a role is a name that auto-includes the following if they exist # <rolename>/tasks/main.yml # <rolename>/handlers/main.yml # <rolename>/vars/main.yml # <rolename>/library # and it auto-extends tasks/handlers/vars_files/module paths as appropriate if found if roles is None: roles = [] if type(roles) != list: raise errors.AnsibleError("value of 'roles:' must be a list") new_tasks = [] new_handlers = [] new_vars_files = [] defaults_files = [] pre_tasks = ds.get('pre_tasks', None) if type(pre_tasks) != list: pre_tasks = [] for x in pre_tasks: new_tasks.append(x) # flush handlers after pre_tasks new_tasks.append(dict(meta='flush_handlers')) roles = self._build_role_dependencies(roles, [], self.vars) # give each role an uuid and # make role_path available as variable to the task for idx, val in enumerate(roles): this_uuid = str(uuid.uuid4()) roles[idx][-2]['role_uuid'] = this_uuid roles[idx][-2]['role_path'] = roles[idx][1] role_names = [] for (role,role_path,role_vars,default_vars) in roles: # special vars must be extracted from the dict to the included tasks special_keys = [ "sudo", "sudo_user", "when", "with_items" ] special_vars = {} for k in special_keys: if k in role_vars: special_vars[k] = role_vars[k] task_basepath = utils.path_dwim(self.basedir, os.path.join(role_path, 'tasks')) handler_basepath = utils.path_dwim(self.basedir, os.path.join(role_path, 'handlers')) vars_basepath = utils.path_dwim(self.basedir, os.path.join(role_path, 'vars')) meta_basepath = utils.path_dwim(self.basedir, os.path.join(role_path, 'meta')) defaults_basepath = utils.path_dwim(self.basedir, os.path.join(role_path, 'defaults')) task = self._resolve_main(task_basepath) handler = self._resolve_main(handler_basepath) vars_file = self._resolve_main(vars_basepath) meta_file = self._resolve_main(meta_basepath) defaults_file = self._resolve_main(defaults_basepath) library = utils.path_dwim(self.basedir, os.path.join(role_path, 'library')) missing = lambda f: not os.path.isfile(f) if missing(task) and missing(handler) and missing(vars_file) and missing(defaults_file) and missing(meta_file) and not os.path.isdir(library): raise errors.AnsibleError("found role at %s, but cannot find %s or %s or %s or %s or %s or %s" % (role_path, task, handler, vars_file, defaults_file, meta_file, library)) if isinstance(role, dict): role_name = role['role'] else: role_name = utils.role_spec_parse(role)["name"] role_names.append(role_name) if os.path.isfile(task): nt = dict(include=pipes.quote(task), vars=role_vars, default_vars=default_vars, role_name=role_name) for k in special_keys: if k in special_vars: nt[k] = special_vars[k] new_tasks.append(nt) if os.path.isfile(handler): nt = dict(include=pipes.quote(handler), vars=role_vars, role_name=role_name) for k in special_keys: if k in special_vars: nt[k] = special_vars[k] new_handlers.append(nt) if os.path.isfile(vars_file): new_vars_files.append(vars_file) if os.path.isfile(defaults_file): defaults_files.append(defaults_file) if os.path.isdir(library): utils.plugins.module_finder.add_directory(library) tasks = ds.get('tasks', None) post_tasks = ds.get('post_tasks', None) handlers = ds.get('handlers', None) vars_files = ds.get('vars_files', None) if type(tasks) != list: tasks = [] if type(handlers) != list: handlers = [] if type(vars_files) != list: vars_files = [] if type(post_tasks) != list: post_tasks = [] new_tasks.extend(tasks) # flush handlers after tasks + role tasks new_tasks.append(dict(meta='flush_handlers')) new_tasks.extend(post_tasks) # flush handlers after post tasks new_tasks.append(dict(meta='flush_handlers')) new_handlers.extend(handlers) new_vars_files.extend(vars_files) ds['tasks'] = new_tasks ds['handlers'] = new_handlers ds['vars_files'] = new_vars_files ds['role_names'] = role_names self.default_vars = self._load_role_defaults(defaults_files) return ds
def _load_roles(self, roles, ds): # a role is a name that auto-includes the following if they exist # <rolename>/tasks/main.yml # <rolename>/handlers/main.yml # <rolename>/vars/main.yml # <rolename>/library # and it auto-extends tasks/handlers/vars_files/module paths as appropriate if found if roles is None: roles = [] if type(roles) != list: raise errors.AnsibleError("value of 'roles:' must be a list") new_tasks = [] new_handlers = [] new_vars_files = [] defaults_files = [] pre_tasks = ds.get('pre_tasks', None) if type(pre_tasks) != list: pre_tasks = [] for x in pre_tasks: new_tasks.append(x) # flush handlers after pre_tasks new_tasks.append(dict(meta='flush_handlers')) roles = self._build_role_dependencies(roles, [], {}) # give each role an uuid and # make role_path available as variable to the task for idx, val in enumerate(roles): this_uuid = str(uuid.uuid4()) roles[idx][-2]['role_uuid'] = this_uuid roles[idx][-2]['role_path'] = roles[idx][1] role_names = [] for (role, role_path, role_vars, default_vars) in roles: # special vars must be extracted from the dict to the included tasks special_keys = ["sudo", "sudo_user", "when", "with_items"] special_vars = {} for k in special_keys: if k in role_vars: special_vars[k] = role_vars[k] task_basepath = utils.path_dwim(self.basedir, os.path.join(role_path, 'tasks')) handler_basepath = utils.path_dwim( self.basedir, os.path.join(role_path, 'handlers')) vars_basepath = utils.path_dwim(self.basedir, os.path.join(role_path, 'vars')) meta_basepath = utils.path_dwim(self.basedir, os.path.join(role_path, 'meta')) defaults_basepath = utils.path_dwim( self.basedir, os.path.join(role_path, 'defaults')) task = self._resolve_main(task_basepath) handler = self._resolve_main(handler_basepath) vars_file = self._resolve_main(vars_basepath) meta_file = self._resolve_main(meta_basepath) defaults_file = self._resolve_main(defaults_basepath) library = utils.path_dwim(self.basedir, os.path.join(role_path, 'library')) missing = lambda f: not os.path.isfile(f) if missing(task) and missing(handler) and missing( vars_file) and missing(defaults_file) and missing( meta_file) and not os.path.isdir(library): raise errors.AnsibleError( "found role at %s, but cannot find %s or %s or %s or %s or %s or %s" % (role_path, task, handler, vars_file, defaults_file, meta_file, library)) if isinstance(role, dict): role_name = role['role'] else: role_name = utils.role_spec_parse(role)["name"] role_names.append(role_name) if os.path.isfile(task): nt = dict(include=pipes.quote(task), vars=role_vars, default_vars=default_vars, role_name=role_name) for k in special_keys: if k in special_vars: nt[k] = special_vars[k] new_tasks.append(nt) if os.path.isfile(handler): nt = dict(include=pipes.quote(handler), vars=role_vars, role_name=role_name) for k in special_keys: if k in special_vars: nt[k] = special_vars[k] new_handlers.append(nt) if os.path.isfile(vars_file): new_vars_files.append(vars_file) if os.path.isfile(defaults_file): defaults_files.append(defaults_file) if os.path.isdir(library): utils.plugins.module_finder.add_directory(library) tasks = ds.get('tasks', None) post_tasks = ds.get('post_tasks', None) handlers = ds.get('handlers', None) vars_files = ds.get('vars_files', None) if type(tasks) != list: tasks = [] if type(handlers) != list: handlers = [] if type(vars_files) != list: vars_files = [] if type(post_tasks) != list: post_tasks = [] new_tasks.extend(tasks) # flush handlers after tasks + role tasks new_tasks.append(dict(meta='flush_handlers')) new_tasks.extend(post_tasks) # flush handlers after post tasks new_tasks.append(dict(meta='flush_handlers')) new_handlers.extend(handlers) new_vars_files.extend(vars_files) ds['tasks'] = new_tasks ds['handlers'] = new_handlers ds['vars_files'] = new_vars_files ds['role_names'] = role_names self.default_vars = self._load_role_defaults(defaults_files) return ds