# Buggy code
def _process_stack_cfg(cfg, stack, minion_id, pillar):
    basedir, filename = os.path.split(cfg)
    jenv = Environment(loader=FileSystemLoader(basedir))
    jenv.globals.update(
        {
            "__opts__": __opts__,
            "__salt__": __salt__,
            "__grains__": __grains__,
            "minion_id": minion_id,
            "pillar": pillar,
        }
    )
    for path in _parse_top_cfg(jenv.get_template(filename).render(stack=stack)):
        try:
            obj = yaml.safe_load(jenv.get_template(path).render(stack=stack))
            if not isinstance(obj, dict):
                log.info(
                    'Ignoring pillar stack template "{0}": Can\'t parse '
                    "as a valid yaml dictionary".format(path)
                )
                continue
            stack = _merge_dict(stack, obj)
        except TemplateNotFound as e:
            if hasattr(e, "name") and e.name != path:
                log.info(
                    'Jinja include file "{0}" not found '
                    'from root dir "{1}", which was included '
                    'by stack template "{2}"'.format(e.name, basedir, path)
                )
            else:
                log.info(
                    'Ignoring pillar stack template "{0}": can\'t find from '
                    'root dir "{1}"'.format(path, basedir)
                )
            continue
    return stack


# Traceback (ParserError)
li1105-12 ~ master # salt jmoney-master state.show_top
jmoney-master:
The minion function caused an exception: Traceback (most recent call last):
File "/root/salt/salt/minion.py", line 1173, in _thread_return
return_data = func(*args, **kwargs)
File "/root/salt/salt/modules/state.py", line 1045, in show_top
top_ = st_.get_top()
File "/root/salt/salt/state.py", line 2436, in get_top
tops = self.get_tops()
File "/root/salt/salt/state.py", line 2313, in get_tops
saltenv=saltenv
File "/root/salt/salt/template.py", line 79, in compile_template
ret = render(input_data, saltenv, sls, **render_kwargs)
File "/root/salt/salt/renderers/yaml.py", line 50, in render
data = load(yaml_data, Loader=get_yaml_loader(argline))
File "/usr/lib/python2.7/dist-packages/yaml/__init__.py", line 71, in load
return loader.get_single_data()
File "/usr/lib/python2.7/dist-packages/yaml/constructor.py", line 37, in get_single_data
node = self.get_single_node()
File "/usr/lib/python2.7/dist-packages/yaml/composer.py", line 36, in get_single_node
document = self.compose_document()
File "/usr/lib/python2.7/dist-packages/yaml/composer.py", line 55, in compose_document
node = self.compose_node(None, None)
File "/usr/lib/python2.7/dist-packages/yaml/composer.py", line 84, in compose_node
node = self.compose_mapping_node(anchor)
File "/usr/lib/python2.7/dist-packages/yaml/composer.py", line 127, in compose_mapping_node
while not self.check_event(MappingEndEvent):
File "/usr/lib/python2.7/dist-packages/yaml/parser.py", line 98, in check_event
self.current_event = self.state()
File "/usr/lib/python2.7/dist-packages/yaml/parser.py", line 439, in parse_block_mapping_key
"expected <block end>, but found %r" % token.id, token.start_mark)
ParserError: while parsing a block mapping
in "<unicode string>", line 1, column 1:
base:
^
expected <block end>, but found '<block sequence start>'
in "<unicode string>", line 3, column 5:
- state1
^

# Fixed code
def _process_stack_cfg(cfg, stack, minion_id, pillar):
    log.debug("Config: {0}".format(cfg))
    basedir, filename = os.path.split(cfg)
    jenv = Environment(loader=FileSystemLoader(basedir))
    jenv.globals.update(
        {
            "__opts__": __opts__,
            "__salt__": __salt__,
            "__grains__": __grains__,
            "minion_id": minion_id,
            "pillar": pillar,
        }
    )
    for path in _parse_stack_cfg(jenv.get_template(filename).render(stack=stack)):
        try:
            log.debug("YAML: basedir={0}, path={1}".format(basedir, path))
            obj = yaml.safe_load(jenv.get_template(path).render(stack=stack))
            if not isinstance(obj, dict):
                log.info(
                    'Ignoring pillar stack template "{0}": Can\'t parse '
                    "as a valid yaml dictionary".format(path)
                )
                continue
            stack = _merge_dict(stack, obj)
        except TemplateNotFound as e:
            if hasattr(e, "name") and e.name != path:
                log.info(
                    'Jinja include file "{0}" not found '
                    'from root dir "{1}", which was included '
                    'by stack template "{2}"'.format(e.name, basedir, path)
                )
            else:
                log.info(
                    'Ignoring pillar stack template "{0}": can\'t find from '
                    'root dir "{1}"'.format(path, basedir)
                )
            continue
    return stack