docs: def varReplace(basedir, raw, vars, lookup_fatal=True, depth=0, expand_lists=False):
      ''' Perform variable replacement of $variables in string raw using vars dictionary '''
      # this code originally from yum
  
      if (depth > 20):
          raise errors.AnsibleError("template recursion depth exceeded")
  
      done = [] # Completed chunks to return
  
      while raw:
          m = _varFind(basedir, raw, vars, lookup_fatal, depth)
          if not m:
              done.append(raw)
              break
  
          # Determine replacement value (if unknown variable then preserve
          # original)
  
          replacement = m['replacement']
          if expand_lists and isinstance(replacement, (list, tuple)):
              replacement = ",".join(replacement)
          if isinstance(replacement, (str, unicode)):
              replacement = varReplace(basedir, replacement, vars, lookup_fatal, depth=depth+1, expand_lists=expand_lists)
          if replacement is None:
              replacement = raw[m['start']:m['end']]
  
          start, end = m['start'], m['end']
          done.append(raw[:start])          # Keep stuff leading up to token
          done.append(unicode(replacement)) # Append replacement value
          raw = raw[end:]                   # Continue with remainder of string
  
      return ''.join(done)