示例#1
0
    def test_load_from_file(self):
        hier = HConfig(host=self.host_a)
        config = 'interface Vlan2\n ip address 1.1.1.1 255.255.255.0'

        with tempfile.NamedTemporaryFile(mode='r+') as myfile:
            myfile.file.write(config)
            myfile.file.flush()
            hier.load_from_file(myfile.name)

        self.assertEqual(2, len(list(hier.all_children())))
示例#2
0
    def test_load_from_file(self):
        hier = HConfig(host=self.host_a)
        config = "interface Vlan2\n ip address 1.1.1.1 255.255.255.0"

        with tempfile.NamedTemporaryFile(mode="r+", delete=False) as myfile:
            myfile.file.write(config)
            myfile.file.flush()
            myfile.close()
            hier.load_from_file(myfile.name)
            os.remove(myfile.name)

        assert len(list(hier.all_children())) == 2
def main():
    module = AnsibleModule(
        argument_spec=dict(
            hostname=dict(required=True),
            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=(
            ['hostname',
             'compiled_config',
             'running_config',
             'remediation_config',
             'os_role']
        ),
        supports_check_mode=False
    )

    hostname = str(module.params['hostname'])
    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'])
    operating_system = os_role.strip('os_')
    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 = HConfig(hostname=hostame,
                               os=operating_system,
                               options=hier_options
        )
        running_hier.load_from_file(running_config)
    else:
        module.fail_json(msg="Error opening {}.".format(running_config))

    if os.path.isfile(compiled_config):
        compiled_hier = HConfig(hostname=hostame,
                                os=operating_system,
                                options=hier_options
        )
        compiled_hier.load_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 = running_hier.config_to_get_to(compiled_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.dump():
                if line['tags'] in config_tags:
                    f.write('{}\n'.format(line['text']))
        else:
            for line in remediation_hier.all_children():
                f.write('{}\n'.format(line.cisco_style_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)