Add source interface and use-vrf features (#43418)
This commit is contained in:
parent
bc84f69ae0
commit
59cd693218
2 changed files with 143 additions and 20 deletions
|
@ -41,6 +41,18 @@ options:
|
||||||
description:
|
description:
|
||||||
- Hostname or IP Address for remote logging (when dest is 'server').
|
- Hostname or IP Address for remote logging (when dest is 'server').
|
||||||
version_added: '2.7'
|
version_added: '2.7'
|
||||||
|
use_vrf:
|
||||||
|
description:
|
||||||
|
- VRF to be used while configuring remote logging (when dest is 'server').
|
||||||
|
version_added: '2.7'
|
||||||
|
interface_type:
|
||||||
|
description:
|
||||||
|
- Type of interface to be used when configuring Source-Interface for logging (e.g., 'Ethernet', 'mgmt').
|
||||||
|
version_added: '2.7'
|
||||||
|
interface:
|
||||||
|
description:
|
||||||
|
- Interface number to be used when configuring Source-Interface for logging (e.g., '1/1', '1/3', '0').
|
||||||
|
version_added: '2.7'
|
||||||
name:
|
name:
|
||||||
description:
|
description:
|
||||||
- If value of C(dest) is I(logfile) it indicates file-name.
|
- If value of C(dest) is I(logfile) it indicates file-name.
|
||||||
|
@ -91,6 +103,19 @@ EXAMPLES = """
|
||||||
facility: daemon
|
facility: daemon
|
||||||
facility_level: 0
|
facility_level: 0
|
||||||
state: absent
|
state: absent
|
||||||
|
- name: Configure Remote Logging
|
||||||
|
nxos_logging:
|
||||||
|
dest: server
|
||||||
|
remote_server: test-syslogserver.com
|
||||||
|
facility: auth
|
||||||
|
facility_level: 1
|
||||||
|
use_vrf: management
|
||||||
|
state: present
|
||||||
|
- name: Configure Source Interface for Logging
|
||||||
|
nxos_logging:
|
||||||
|
interface_type: mgmt
|
||||||
|
interface: 0
|
||||||
|
state: present
|
||||||
|
|
||||||
- name: Configure logging using aggregate
|
- name: Configure logging using aggregate
|
||||||
nxos_logging:
|
nxos_logging:
|
||||||
|
@ -144,6 +169,9 @@ def map_obj_to_commands(updates):
|
||||||
if w['dest'] == 'server':
|
if w['dest'] == 'server':
|
||||||
commands.append('no logging server {}'.format(w['remote_server']))
|
commands.append('no logging server {}'.format(w['remote_server']))
|
||||||
|
|
||||||
|
if w['interface_type']:
|
||||||
|
commands.append('no logging source-interface')
|
||||||
|
|
||||||
if state == 'present' and w not in have:
|
if state == 'present' and w not in have:
|
||||||
if w['facility'] is None:
|
if w['facility'] is None:
|
||||||
if w['dest']:
|
if w['dest']:
|
||||||
|
@ -154,26 +182,44 @@ def map_obj_to_commands(updates):
|
||||||
commands.append('logging logfile {} {}'.format(w['name'], w['dest_level']))
|
commands.append('logging logfile {} {}'.format(w['name'], w['dest_level']))
|
||||||
|
|
||||||
elif w['dest'] == 'server':
|
elif w['dest'] == 'server':
|
||||||
if w['dest_level']:
|
if w['facility_level']:
|
||||||
commands.append('logging server {0} {1}'.format(
|
if w['use_vrf']:
|
||||||
w['remote_server'], w['dest_level']))
|
commands.append('logging server {0} {1} use-vrf {2}'.format(
|
||||||
|
w['remote_server'], w['facility_level'], w['use_vrf']))
|
||||||
|
else:
|
||||||
|
commands.append('logging server {0} {1}'.format(
|
||||||
|
w['remote_server'], w['facility_level']))
|
||||||
|
|
||||||
else:
|
else:
|
||||||
commands.append('logging server {0}'.format(w['remote_server']))
|
if w['use_vrf']:
|
||||||
else:
|
commands.append('logging server {0} use-vrf {1}'.format(
|
||||||
pass
|
w['remote_server'], w['use_vrf']))
|
||||||
|
else:
|
||||||
|
commands.append('logging server {0}'.format(w['remote_server']))
|
||||||
|
|
||||||
if w['facility']:
|
if w['facility']:
|
||||||
if w['dest'] == 'server':
|
if w['dest'] == 'server':
|
||||||
if w['dest_level']:
|
if w['facility_level']:
|
||||||
commands.append('logging server {0} {1} facility {2}'.format(
|
if w['use_vrf']:
|
||||||
w['remote_server'], w['dest_level'], w['facility']))
|
commands.append('logging server {0} {1} facility {2} use-vrf {3}'.format(
|
||||||
|
w['remote_server'], w['facility_level'], w['facility'], w['use_vrf']))
|
||||||
|
else:
|
||||||
|
commands.append('logging server {0} {1} facility {2}'.format(
|
||||||
|
w['remote_server'], w['facility_level'], w['facility']))
|
||||||
else:
|
else:
|
||||||
commands.append('logging server {0} facility {1}'.format(w['remote_server'],
|
if w['use_vrf']:
|
||||||
w['facility']))
|
commands.append('logging server {0} facility {1} use-vrf {2}'.format(
|
||||||
|
w['remote_server'], w['facility'], w['use_vrf']))
|
||||||
|
else:
|
||||||
|
commands.append('logging server {0} facility {1}'.format(w['remote_server'],
|
||||||
|
w['facility']))
|
||||||
else:
|
else:
|
||||||
commands.append('logging level {} {}'.format(w['facility'],
|
commands.append('logging level {} {}'.format(w['facility'],
|
||||||
w['facility_level']))
|
w['facility_level']))
|
||||||
|
|
||||||
|
if w['interface_type']:
|
||||||
|
commands.append('logging source-interface {0} {1}'.format(w['interface_type'],
|
||||||
|
w['interface']))
|
||||||
return commands
|
return commands
|
||||||
|
|
||||||
|
|
||||||
|
@ -214,7 +260,7 @@ def parse_dest_level(line, dest, name):
|
||||||
pass
|
pass
|
||||||
return level
|
return level
|
||||||
|
|
||||||
if dest is not None:
|
if dest and dest != 'server':
|
||||||
if dest == 'logfile':
|
if dest == 'logfile':
|
||||||
match = re.search(r'logging logfile {} (\S+)'.format(name), line, re.M)
|
match = re.search(r'logging logfile {} (\S+)'.format(name), line, re.M)
|
||||||
if match:
|
if match:
|
||||||
|
@ -232,10 +278,15 @@ def parse_dest_level(line, dest, name):
|
||||||
return dest_level
|
return dest_level
|
||||||
|
|
||||||
|
|
||||||
def parse_facility_level(line, facility):
|
def parse_facility_level(line, facility, dest):
|
||||||
facility_level = None
|
facility_level = None
|
||||||
|
|
||||||
if facility is not None:
|
if dest == 'server':
|
||||||
|
match = re.search(r'logging server (?:\S+) (\d+)', line, re.M)
|
||||||
|
if match:
|
||||||
|
facility_level = match.group(1)
|
||||||
|
|
||||||
|
elif facility is not None:
|
||||||
match = re.search(r'logging level {} (\S+)'.format(facility), line, re.M)
|
match = re.search(r'logging level {} (\S+)'.format(facility), line, re.M)
|
||||||
if match:
|
if match:
|
||||||
facility_level = match.group(1)
|
facility_level = match.group(1)
|
||||||
|
@ -253,6 +304,37 @@ def parse_facility(line):
|
||||||
return facility
|
return facility
|
||||||
|
|
||||||
|
|
||||||
|
def parse_use_vrf(line, dest):
|
||||||
|
use_vrf = None
|
||||||
|
|
||||||
|
if dest and dest == 'server':
|
||||||
|
match = re.search(r'logging server (?:\S+) (?:\d+) use-vrf (\S+)', line, re.M)
|
||||||
|
if match:
|
||||||
|
use_vrf = match.group(1)
|
||||||
|
|
||||||
|
return use_vrf
|
||||||
|
|
||||||
|
|
||||||
|
def parse_interface_type(line):
|
||||||
|
interface_type = None
|
||||||
|
|
||||||
|
match = re.search(r'logging source-interface (\D+)', line, re.M)
|
||||||
|
if match:
|
||||||
|
interface_type = match.group(1)
|
||||||
|
|
||||||
|
return interface_type
|
||||||
|
|
||||||
|
|
||||||
|
def parse_interface(line):
|
||||||
|
interface = None
|
||||||
|
|
||||||
|
match = re.search(r'logging source-interface (?:\D+)(\d*([/]?\d+))', line, re.M)
|
||||||
|
if match:
|
||||||
|
interface = match.group(1)
|
||||||
|
|
||||||
|
return interface
|
||||||
|
|
||||||
|
|
||||||
def map_config_to_obj(module):
|
def map_config_to_obj(module):
|
||||||
obj = []
|
obj = []
|
||||||
|
|
||||||
|
@ -280,10 +362,13 @@ def map_config_to_obj(module):
|
||||||
|
|
||||||
obj.append({'dest': dest,
|
obj.append({'dest': dest,
|
||||||
'remote_server': parse_remote_server(line, dest),
|
'remote_server': parse_remote_server(line, dest),
|
||||||
|
'use_vrf': parse_use_vrf(line, dest),
|
||||||
'name': parse_name(line, dest),
|
'name': parse_name(line, dest),
|
||||||
'facility': facility,
|
'facility': facility,
|
||||||
'dest_level': parse_dest_level(line, dest, parse_name(line, dest)),
|
'dest_level': parse_dest_level(line, dest, parse_name(line, dest)),
|
||||||
'facility_level': parse_facility_level(line, facility)})
|
'facility_level': parse_facility_level(line, facility, dest),
|
||||||
|
'interface_type': parse_interface_type(line),
|
||||||
|
'interface': parse_interface(line)})
|
||||||
|
|
||||||
cmd = [{'command': 'show logging | section enabled | section console', 'output': 'text'},
|
cmd = [{'command': 'show logging | section enabled | section console', 'output': 'text'},
|
||||||
{'command': 'show logging | section enabled | section monitor', 'output': 'text'}]
|
{'command': 'show logging | section enabled | section monitor', 'output': 'text'}]
|
||||||
|
@ -306,7 +391,10 @@ def map_config_to_obj(module):
|
||||||
'name': None,
|
'name': None,
|
||||||
'facility': None,
|
'facility': None,
|
||||||
'dest_level': dest_level,
|
'dest_level': dest_level,
|
||||||
'facility_level': None})
|
'facility_level': None,
|
||||||
|
'use_vrf': None,
|
||||||
|
'interface_type': None,
|
||||||
|
'interface': None})
|
||||||
|
|
||||||
return obj
|
return obj
|
||||||
|
|
||||||
|
@ -317,10 +405,13 @@ def map_params_to_obj(module):
|
||||||
if 'aggregate' in module.params and module.params['aggregate']:
|
if 'aggregate' in module.params and module.params['aggregate']:
|
||||||
args = {'dest': '',
|
args = {'dest': '',
|
||||||
'remote_server': '',
|
'remote_server': '',
|
||||||
|
'use_vrf': '',
|
||||||
'name': '',
|
'name': '',
|
||||||
'facility': '',
|
'facility': '',
|
||||||
'dest_level': '',
|
'dest_level': '',
|
||||||
'facility_level': ''}
|
'facility_level': '',
|
||||||
|
'interface_type': '',
|
||||||
|
'interface': ''}
|
||||||
|
|
||||||
for c in module.params['aggregate']:
|
for c in module.params['aggregate']:
|
||||||
d = c.copy()
|
d = c.copy()
|
||||||
|
@ -335,6 +426,9 @@ def map_params_to_obj(module):
|
||||||
if d['facility_level'] is not None:
|
if d['facility_level'] is not None:
|
||||||
d['facility_level'] = str(d['facility_level'])
|
d['facility_level'] = str(d['facility_level'])
|
||||||
|
|
||||||
|
if d['interface_type']:
|
||||||
|
d['interface'] = str(d['interface'])
|
||||||
|
|
||||||
if 'state' not in d:
|
if 'state' not in d:
|
||||||
d['state'] = module.params['state']
|
d['state'] = module.params['state']
|
||||||
|
|
||||||
|
@ -353,10 +447,13 @@ def map_params_to_obj(module):
|
||||||
obj.append({
|
obj.append({
|
||||||
'dest': module.params['dest'],
|
'dest': module.params['dest'],
|
||||||
'remote_server': module.params['remote_server'],
|
'remote_server': module.params['remote_server'],
|
||||||
|
'use_vrf': module.params['use_vrf'],
|
||||||
'name': module.params['name'],
|
'name': module.params['name'],
|
||||||
'facility': module.params['facility'],
|
'facility': module.params['facility'],
|
||||||
'dest_level': dest_level,
|
'dest_level': dest_level,
|
||||||
'facility_level': facility_level,
|
'facility_level': facility_level,
|
||||||
|
'interface_type': module.params['interface_type'],
|
||||||
|
'interface': module.params['interface'],
|
||||||
'state': module.params['state']
|
'state': module.params['state']
|
||||||
})
|
})
|
||||||
return obj
|
return obj
|
||||||
|
@ -370,8 +467,11 @@ def main():
|
||||||
name=dict(),
|
name=dict(),
|
||||||
facility=dict(),
|
facility=dict(),
|
||||||
remote_server=dict(),
|
remote_server=dict(),
|
||||||
|
use_vrf=dict(),
|
||||||
dest_level=dict(type='int', aliases=['level']),
|
dest_level=dict(type='int', aliases=['level']),
|
||||||
facility_level=dict(type='int'),
|
facility_level=dict(type='int'),
|
||||||
|
interface_type=dict(),
|
||||||
|
interface=dict(),
|
||||||
state=dict(default='present', choices=['present', 'absent']),
|
state=dict(default='present', choices=['present', 'absent']),
|
||||||
aggregate=dict(type='list')
|
aggregate=dict(type='list')
|
||||||
)
|
)
|
||||||
|
@ -383,6 +483,7 @@ def main():
|
||||||
|
|
||||||
module = AnsibleModule(argument_spec=argument_spec,
|
module = AnsibleModule(argument_spec=argument_spec,
|
||||||
required_if=required_if,
|
required_if=required_if,
|
||||||
|
required_together=[['interface_type', 'interface']],
|
||||||
supports_check_mode=True)
|
supports_check_mode=True)
|
||||||
|
|
||||||
warnings = list()
|
warnings = list()
|
||||||
|
|
|
@ -175,7 +175,8 @@
|
||||||
dest: server
|
dest: server
|
||||||
remote_server: test-syslogserver.com
|
remote_server: test-syslogserver.com
|
||||||
facility: auth
|
facility: auth
|
||||||
dest_level: 1
|
facility_level: 1
|
||||||
|
use_vrf: management
|
||||||
state: present
|
state: present
|
||||||
provider: "{{ connection }}"
|
provider: "{{ connection }}"
|
||||||
register: result
|
register: result
|
||||||
|
@ -183,7 +184,7 @@
|
||||||
- assert:
|
- assert:
|
||||||
that:
|
that:
|
||||||
- 'result.changed == true'
|
- 'result.changed == true'
|
||||||
- '"logging server test-syslogserver.com 1 facility auth" in result.commands'
|
- '"logging server test-syslogserver.com 1 facility auth use-vrf management" in result.commands'
|
||||||
|
|
||||||
- name: Configure Remote Logging (idempotent)
|
- name: Configure Remote Logging (idempotent)
|
||||||
nxos_logging: *rlog
|
nxos_logging: *rlog
|
||||||
|
@ -191,6 +192,25 @@
|
||||||
|
|
||||||
- assert: *false
|
- assert: *false
|
||||||
|
|
||||||
|
- name: Configure Source Interface for Logging
|
||||||
|
nxos_logging: &srcint
|
||||||
|
interface_type: mgmt
|
||||||
|
interface: 0
|
||||||
|
register: result
|
||||||
|
|
||||||
|
- assert:
|
||||||
|
that:
|
||||||
|
- 'result.changed == true'
|
||||||
|
- '"logging source-interface mgmt 0" in result.commands'
|
||||||
|
|
||||||
|
- name: Configure Source Interface for Logging (idempotent)
|
||||||
|
nxos_logging: *srcint
|
||||||
|
register: result
|
||||||
|
|
||||||
|
- assert:
|
||||||
|
that:
|
||||||
|
- 'result.changed == false'
|
||||||
|
|
||||||
- name: remove logging as collection tearDown
|
- name: remove logging as collection tearDown
|
||||||
nxos_logging: &agg
|
nxos_logging: &agg
|
||||||
aggregate:
|
aggregate:
|
||||||
|
@ -199,7 +219,8 @@
|
||||||
- { dest: monitor, dest_level: 5 }
|
- { dest: monitor, dest_level: 5 }
|
||||||
- { dest: logfile, dest_level: 1, name: test }
|
- { dest: logfile, dest_level: 1, name: test }
|
||||||
- { facility: daemon, facility_level: 4 }
|
- { facility: daemon, facility_level: 4 }
|
||||||
- { dest: server, remote_server: test-syslogserver.com, facility: auth, dest_level: 1 }
|
- { dest: server, remote_server: test-syslogserver.com, facility: auth, facility_level: 1, use_vrf: management }
|
||||||
|
- { interface_type: mgmt, interface: 0 }
|
||||||
provider: "{{ connection }}"
|
provider: "{{ connection }}"
|
||||||
state: absent
|
state: absent
|
||||||
register: result
|
register: result
|
||||||
|
@ -212,6 +233,7 @@
|
||||||
- '"no logging monitor" in result.commands'
|
- '"no logging monitor" in result.commands'
|
||||||
- '"no logging module" in result.commands'
|
- '"no logging module" in result.commands'
|
||||||
- '"no logging server test-syslogserver.com" in result.commands'
|
- '"no logging server test-syslogserver.com" in result.commands'
|
||||||
|
- '"no logging source-interface" in result.commands'
|
||||||
|
|
||||||
- name: remove aggregate logging (idempotent)
|
- name: remove aggregate logging (idempotent)
|
||||||
nxos_logging: *agg
|
nxos_logging: *agg
|
||||||
|
|
Loading…
Add table
Reference in a new issue