.. code-block:: yaml

        /home/saltminion/api-paste.ini:
          ini.options_present:
            - separator: '='
            - strict: True
            - sections:
                test:
                  testkey: 'testval'
                  secondoption: 'secondvalue'
                test1:
                  testkey1: 'testval121'

    options present in file and not specified in sections
    dict will be untouched, unless `strict: True` flag is
    used

    changes dict will contain the list of changes made

def options_present(name, sections=None, separator='=', strict=False):
    '''
    .. code-block:: yaml

        /home/saltminion/api-paste.ini:
          ini.options_present:
            - separator: '='
            - strict: True
            - sections:
                test:
                  testkey: 'testval'
                  secondoption: 'secondvalue'
                test1:
                  testkey1: 'testval121'

    options present in file and not specified in sections
    dict will be untouched, unless `strict: True` flag is
    used

    changes dict will contain the list of changes made
    '''
    ret = {'name': name,
           'changes': {},
           'result': True,
           'comment': 'No anomaly detected'
           }
    if __opts__['test']:
        ret['comment'] = ''
    # pylint: disable=too-many-nested-blocks
    try:
        changes = {}
        if sections:
            options = {}
            for sname, sbody in sections.items():
                if not isinstance(sbody, (dict, OrderedDict)):
                    options.update({sname: sbody})
            cur_ini = __salt__['ini.get_ini'](name, separator)
            original_top_level_opts = {}
            original_sections = {}
            for key, val in cur_ini.items():
                if isinstance(val, (dict, OrderedDict)):
                    original_sections.update({key: val})
                else:
                    original_top_level_opts.update({key: val})
            if __opts__['test']:
                for option in options:
                    if option in original_top_level_opts:
                        if six.text_type(original_top_level_opts[option]) == six.text_type(options[option]):
                            ret['comment'] += 'Unchanged key {0}.\n'.format(option)
                        else:
                            ret['comment'] += 'Changed key {0}.\n'.format(option)
                            ret['result'] = None
                    else:
                        ret['comment'] += 'Changed key {0}.\n'.format(option)
                        ret['result'] = None
            else:
                options_updated = __salt__['ini.set_option'](name, options, separator)
                changes.update(options_updated)
            if strict:
                for opt_to_remove in set(original_top_level_opts).difference(options):
                    if __opts__['test']:
                        ret['comment'] += 'Removed key {0}.\n'.format(opt_to_remove)
                        ret['result'] = None
                    else:
                        __salt__['ini.remove_option'](name, None, opt_to_remove, separator)
                        changes.update({opt_to_remove: {'before': original_top_level_opts[opt_to_remove],
                                                        'after': None}})
            for section_name, section_body in [(sname, sbody) for sname, sbody in sections.items()
                                               if isinstance(sbody, (dict, OrderedDict))]:
                section_descr = ' in section ' + section_name if section_name else ''
                changes[section_name] = {}
                if strict:
                    original = cur_ini.get(section_name, {})
                    for key_to_remove in set(original.keys()).difference(section_body.keys()):
                        orig_value = original_sections.get(section_name, {}).get(key_to_remove, '#-#-')
                        if __opts__['test']:
                            ret['comment'] += 'Deleted key {0}{1}.\n'.format(key_to_remove, section_descr)
                            ret['result'] = None
                        else:
                            __salt__['ini.remove_option'](name, section_name, key_to_remove, separator)
                            changes[section_name].update({key_to_remove: ''})
                            changes[section_name].update({key_to_remove: {'before': orig_value,
                                                                          'after': None}})
                if __opts__['test']:
                    for option in section_body:
                        if six.text_type(section_body[option]) == \
                                six.text_type(original_sections.get(section_name, {}).get(option, '#-#-')):
                            ret['comment'] += 'Unchanged key {0}{1}.\n'.format(option, section_descr)
                        else:
                            ret['comment'] += 'Changed key {0}{1}.\n'.format(option, section_descr)
                            ret['result'] = None
                else:
                    options_updated = __salt__['ini.set_option'](name, {section_name: section_body}, separator)
                    if options_updated:
                        changes[section_name].update(options_updated[section_name])
                    if not changes[section_name]:
                        del changes[section_name]
        else:
            if not __opts__['test']:
                changes = __salt__['ini.set_option'](name, sections, separator)
    except (IOError, KeyError) as err:
        ret['comment'] = "{0}".format(err)
        ret['result'] = False
        return ret
    if 'error' in changes:
        ret['result'] = False
        ret['comment'] = 'Errors encountered. {0}'.format(changes['error'])
        ret['changes'] = {}
    else:
        for ciname, body in changes.items():
            if body:
                ret['comment'] = 'Changes take effect'
                ret['changes'].update({ciname: changes[ciname]})
    return ret