def generate_filenames(host, inject, filename): """ Render the raw filename into 3 forms """ # filename2 is the templated version of the filename, which will # be fully rendered if any variables contained within it are # non-inventory related filename2 = template(self.basedir, filename, self.vars) # filename3 is the same as filename2, but when the host object is # available, inventory variables will be expanded as well since the # name is templated with the injected variables filename3 = filename2 if host is not None: filename3 = template(self.basedir, filename2, inject) # filename4 is the dwim'd path, but may also be mixed-scope, so we use # both play scoped vars and host scoped vars to template the filepath if utils.contains_vars(filename3) and host is not None: inject.update(self.vars) filename4 = template(self.basedir, filename3, inject) filename4 = utils.path_dwim(self.basedir, filename4) else: filename4 = utils.path_dwim(self.basedir, filename3) return filename2, filename3, filename4
def process_files(filename, filename2, filename3, filename4, host=None): """ pseudo-algorithm for deciding where new vars should go """ data = utils.parse_yaml_from_file(filename4, vault_password=self.vault_password) if data: if type(data) != dict: raise errors.AnsibleError("%s must be stored as a dictionary/hash" % filename4) if host is not None: target_filename = None if utils.contains_vars(filename2): if not utils.contains_vars(filename3): target_filename = filename3 else: target_filename = filename4 update_vars_cache(host, data, target_filename=target_filename) else: self.vars_file_vars = utils.combine_vars(self.vars_file_vars, data) # we did process this file return True # we did not process this file return False
def _update_vars_files_for_host(self, host, vault_password=None): def generate_filenames(host, inject, filename): """ Render the raw filename into 3 forms """ # filename2 is the templated version of the filename, which will # be fully rendered if any variables contained within it are # non-inventory related filename2 = template(self.basedir, filename, self.vars) # filename3 is the same as filename2, but when the host object is # available, inventory variables will be expanded as well since the # name is templated with the injected variables filename3 = filename2 if host is not None: filename3 = template(self.basedir, filename2, inject) # filename4 is the dwim'd path, but may also be mixed-scope, so we use # both play scoped vars and host scoped vars to template the filepath if utils.contains_vars(filename3) and host is not None: inject.update(self.vars) filename4 = template(self.basedir, filename3, inject) filename4 = utils.path_dwim(self.basedir, filename4) else: filename4 = utils.path_dwim(self.basedir, filename3) return filename2, filename3, filename4 def update_vars_cache(host, data, target_filename=None): """ update a host's varscache with new var data """ self.playbook.VARS_CACHE[host] = utils.combine_vars(self.playbook.VARS_CACHE.get(host, {}), data) if target_filename: self.playbook.callbacks.on_import_for_host(host, target_filename) def process_files(filename, filename2, filename3, filename4, host=None): """ pseudo-algorithm for deciding where new vars should go """ data = utils.parse_yaml_from_file(filename4, vault_password=self.vault_password) if data: if type(data) != dict: raise errors.AnsibleError("%s must be stored as a dictionary/hash" % filename4) if host is not None: target_filename = None if utils.contains_vars(filename2): if not utils.contains_vars(filename3): target_filename = filename3 else: target_filename = filename4 update_vars_cache(host, data, target_filename=target_filename) else: self.vars_file_vars = utils.combine_vars(self.vars_file_vars, data) # we did process this file return True # we did not process this file return False # Enforce that vars_files is always a list if type(self.vars_files) != list: self.vars_files = [ self.vars_files ] # Build an inject if this is a host run started by self.update_vars_files if host is not None: inject = {} inject.update(self.playbook.inventory.get_variables(host, vault_password=vault_password)) inject.update(self.playbook.SETUP_CACHE.get(host, {})) inject.update(self.playbook.VARS_CACHE.get(host, {})) else: inject = None processed = [] for filename in self.vars_files: if type(filename) == list: # loop over all filenames, loading the first one, and failing if none found found = False sequence = [] for real_filename in filename: filename2, filename3, filename4 = generate_filenames(host, inject, real_filename) sequence.append(filename4) if os.path.exists(filename4): found = True if process_files(filename, filename2, filename3, filename4, host=host): processed.append(filename) elif host is not None: self.playbook.callbacks.on_not_import_for_host(host, filename4) if found: break if not found and host is not None: raise errors.AnsibleError( "%s: FATAL, no files matched for vars_files import sequence: %s" % (host, sequence) ) else: # just one filename supplied, load it! filename2, filename3, filename4 = generate_filenames(host, inject, filename) if utils.contains_vars(filename4): continue if process_files(filename, filename2, filename3, filename4, host=host): processed.append(filename) return processed
def _update_vars_files_for_host(self, host, vault_password=None): def generate_filenames(host, inject, filename): """ Render the raw filename into 3 forms """ # filename2 is the templated version of the filename, which will # be fully rendered if any variables contained within it are # non-inventory related filename2 = template(self.basedir, filename, self.vars) # filename3 is the same as filename2, but when the host object is # available, inventory variables will be expanded as well since the # name is templated with the injected variables filename3 = filename2 if host is not None: filename3 = template(self.basedir, filename2, inject) # filename4 is the dwim'd path, but may also be mixed-scope, so we use # both play scoped vars and host scoped vars to template the filepath if utils.contains_vars(filename3) and host is not None: inject.update(self.vars) filename4 = template(self.basedir, filename3, inject) filename4 = utils.path_dwim(self.basedir, filename4) else: filename4 = utils.path_dwim(self.basedir, filename3) return filename2, filename3, filename4 def update_vars_cache(host, data, target_filename=None): """ update a host's varscache with new var data """ self.playbook.VARS_CACHE[host] = utils.combine_vars( self.playbook.VARS_CACHE.get(host, {}), data) if target_filename: self.playbook.callbacks.on_import_for_host( host, target_filename) def process_files(filename, filename2, filename3, filename4, host=None): """ pseudo-algorithm for deciding where new vars should go """ data = utils.parse_yaml_from_file( filename4, vault_password=self.vault_password) if data: if type(data) != dict: raise errors.AnsibleError( "%s must be stored as a dictionary/hash" % filename4) if host is not None: target_filename = None if utils.contains_vars(filename2): if not utils.contains_vars(filename3): target_filename = filename3 else: target_filename = filename4 update_vars_cache(host, data, target_filename=target_filename) else: self.vars = utils.combine_vars(self.vars, data) # we did process this file return True # we did not process this file return False # Enforce that vars_files is always a list if type(self.vars_files) != list: self.vars_files = [self.vars_files] # Build an inject if this is a host run started by self.update_vars_files if host is not None: inject = {} inject.update( self.playbook.inventory.get_variables( host, vault_password=vault_password)) inject.update(self.playbook.SETUP_CACHE.get(host, {})) inject.update(self.playbook.VARS_CACHE.get(host, {})) else: inject = None processed = [] for filename in self.vars_files: if type(filename) == list: # loop over all filenames, loading the first one, and failing if none found found = False sequence = [] for real_filename in filename: filename2, filename3, filename4 = generate_filenames( host, inject, real_filename) sequence.append(filename4) if os.path.exists(filename4): found = True if process_files(filename, filename2, filename3, filename4, host=host): processed.append(filename) elif host is not None: self.playbook.callbacks.on_not_import_for_host( host, filename4) if found: break if not found and host is not None: raise errors.AnsibleError( "%s: FATAL, no files matched for vars_files import sequence: %s" % (host, sequence)) else: # just one filename supplied, load it! filename2, filename3, filename4 = generate_filenames( host, inject, filename) if utils.contains_vars(filename4): continue if process_files(filename, filename2, filename3, filename4, host=host): processed.append(filename) return processed