YAMLEX is a format that allows for things like sls files to be more intuitive.

It's an extension of YAML that implements all the salt magic: - it implies omap for any dict like. - it implies that string like data are str, not unicode - ...

For example, the file states.sls has this contents:

  bar: 42
  baz: [1, 2, 3]

The file can be parsed into Python like this

from salt.serializers import yamlex

with open('state.sls', 'r') as stream:
    obj = yamlex.deserialize(stream)

Check that obj is an OrderedDict

from salt.utils.odict import OrderedDict

assert isinstance(obj, dict)
assert isinstance(obj, OrderedDict)

yamlex __repr__ and __str__ objects' methods render YAML understandable string. It means that they are template friendly.

print '{0}'.format(obj)


{foo: {bar: 42, baz: [1, 2, 3]}}

and they are still valid YAML:

from salt.serializers import yaml
yml_obj = yaml.deserialize(str(obj))
assert yml_obj == obj

yamlex implements also custom tags:


this tag allows structures aggregation.

For example:

placeholder: !aggregate foo
placeholder: !aggregate bar
placeholder: !aggregate baz

is rendered as

placeholder: [foo, bar, baz]


this tag flushes the computing value.
placeholder: {!aggregate foo: {foo: 42}}
placeholder: {!aggregate foo: {bar: null}}
!reset placeholder: {!aggregate foo: {baz: inga}}

is roughly equivalent to

placeholder: {!aggregate foo: {baz: inga}}

Document is defacto an aggregate mapping.

salt.serializers.yamlex.deserialize(stream_or_string, **options)

Deserialize any string of stream like object into a Python data structure.

  • stream_or_string -- stream or string to deserialize.
  • options -- options given to lower yaml module.
salt.serializers.yamlex.serialize(obj, **options)

Serialize Python data to YAML.

  • obj -- the data structure to serialize
  • options -- options given to lower yaml module.