def _load_compiled_config(self, compiled_config):
        """
        Build HierarchicalConfiguration object for the Compiled Config
        """
        compiled_config_hier = HierarchicalConfiguration(
            options=self.hier_options)
        compiled_config_hier.from_config_text(compiled_config)

        return compiled_config_hier
    def _load_running_config(self, running_config):
        """
        Build HierarchicalConfiguration object for the Running Config
        """
        running_config_hier = HierarchicalConfiguration(
            options=self.hier_options)
        running_config_hier.from_config_text(running_config)

        return running_config_hier
Beispiel #3
0
def main():
    module = AnsibleModule(
        argument_spec=dict(compiled_config=dict(required=True),
                           running_config=dict(required=True),
                           remediation_config=dict(required=True),
                           os_role=dict(required=True),
                           config_tags=dict(required=False)),
        required_together=([
            'compiled_config', 'running_config', 'remediation_config',
            'os_role'
        ]),
        supports_check_mode=False)

    compiled_config = str(module.params['compiled_config'])
    running_config = str(module.params['running_config'])
    remediation_config = str(module.params['remediation_config'])
    os_role = str(module.params['os_role'])
    if module.params['config_tags']:
        config_tags = list(module.params['config_tags'])
    else:
        config_tags = False

    hier_files = [
        'hierarchical_configuration_options.yml',
        'hierarchical_configuration_tags.yml'
    ]

    for item in hier_files:
        if not os.path.isfile('roles/{}/vars/{}'.format(os_role, item)):
            module.fail_json(msg="Error opening {}.".format(item))

    hier_options = yaml.load(
        open('roles/{}/vars/{}'.format(
            os_role, 'hierarchical_configuration_options.yml')))

    hier_tags = yaml.load(
        open('roles/{}/vars/{}'.format(os_role,
                                       'hierarchical_configuration_tags.yml')))

    if os.path.isfile(running_config):
        running_hier = HierarchicalConfiguration(options=hier_options)
        running_hier.from_file(running_config)
    else:
        module.fail_json(msg="Error opening {}.".format(running_config))

    if os.path.isfile(compiled_config):
        compiled_hier = HierarchicalConfiguration(options=hier_options)
        compiled_hier.from_file(compiled_config)
    else:
        module.fail_json(msg="Error opening {}.".format(compiled_config))

    remediation_hier = compiled_hier.deep_diff_tree_with(running_hier)
    remediation_hier.set_order_weight()
    remediation_hier.add_sectional_exiting()
    remediation_hier.add_tags(hier_tags)

    with open(remediation_config, 'w') as f:
        if config_tags:
            for line in remediation_hier.to_detailed_ouput():
                if line['tags'] in config_tags:
                    f.write('{}\n'.format(line['text']))
        else:
            for line in remediation_hier.to_detailed_ouput():
                f.write('{}\n'.format(line['text']))

    with open(remediation_config) as f:
        remediation_config = f.read()

    results = dict()
    results['response'] = remediation_config

    if len(remediation_config) > 0:
        module.exit_json(changed=True, **results)
    else:
        module.exit_json(changed=False)