@ -16,6 +16,7 @@
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
#
#
ANSIBLE_METADATA = { ' metadata_version ' : ' 1.1 ' ,
ANSIBLE_METADATA = { ' metadata_version ' : ' 1.1 ' ,
' status ' : [ ' preview ' ] ,
' status ' : [ ' preview ' ] ,
' supported_by ' : ' network ' }
' supported_by ' : ' network ' }
@ -83,6 +84,7 @@ options:
required : true
required : true
default : present
default : present
choices : [ ' present ' , ' absent ' ]
choices : [ ' present ' , ' absent ' ]
'''
'''
EXAMPLES = '''
EXAMPLES = '''
@ -91,29 +93,67 @@ EXAMPLES = '''
snmp_host : 3.3 .3 .3
snmp_host : 3.3 .3 .3
community : TESTING
community : TESTING
state : present
state : present
host : " {{ inventory_hostname }} "
username : " {{ un }} "
password : " {{ pwd }} "
'''
'''
RETURN = '''
RETURN = '''
commands :
proposed :
description : k / v pairs of parameters passed into module
returned : always
type : dict
sample : { " community " : " TESTING " , " snmp_host " : " 3.3.3.3 " ,
" snmp_type " : " trap " , " version " : " v2c " , " vrf_filter " : " one_more_vrf " }
existing :
description : k / v pairs of existing snmp host
returned : always
type : dict
sample : { " community " : " TESTING " , " snmp_type " : " trap " ,
" udp " : " 162 " , " v3 " : " noauth " , " version " : " v2c " ,
" vrf " : " test_vrf " , " vrf_filter " : [ " test_vrf " ,
" another_test_vrf " ] }
end_state :
description : k / v pairs of switchport after module execution
returned : always
type : dict
sample : { " community " : " TESTING " , " snmp_type " : " trap " ,
" udp " : " 162 " , " v3 " : " noauth " , " version " : " v2c " ,
" vrf " : " test_vrf " , " vrf_filter " : [ " test_vrf " ,
" another_test_vrf " , " one_more_vrf " ] }
updates :
description : commands sent to the device
description : commands sent to the device
returned : always
returned : always
type : list
type : list
sample : [ " snmp-server host 3.3.3.3 filter-vrf another_test_vrf " ]
sample : [ " snmp-server host 3.3.3.3 filter-vrf another_test_vrf " ]
changed :
description : check to see if a change was made on the device
returned : always
type : boolean
sample : true
'''
'''
from ansible . module_utils . nxos import load_config , run_commands
from ansible . module_utils . nxos import get_config, load_config, run_commands
from ansible . module_utils . nxos import nxos_argument_spec , check_args
from ansible . module_utils . nxos import nxos_argument_spec , check_args
from ansible . module_utils . basic import AnsibleModule
from ansible . module_utils . basic import AnsibleModule
def execute_show_command ( command , module ) :
import re
command = {
import re
' command ' : command ,
' output ' : ' json ' ,
}
return run_commands ( module , command )
def execute_show_command ( command , module , command_type = ' cli_show ' ) :
if module . params [ ' transport ' ] == ' cli ' :
if ' show run ' not in command :
command + = ' | json '
cmds = [ command ]
body = run_commands ( module , cmds )
elif module . params [ ' transport ' ] == ' nxapi ' :
cmds = [ command ]
body = run_commands ( module , cmds )
return body
def apply_key_map ( key_map , table ) :
def apply_key_map ( key_map , table ) :
@ -129,18 +169,9 @@ def apply_key_map(key_map, table):
return new_dict
return new_dict
def flatten_list ( command_lists ) :
flat_command_list = [ ]
for command in command_lists :
if isinstance ( command , list ) :
flat_command_list . extend ( command )
else :
flat_command_list . append ( command )
return flat_command_list
def get_snmp_host ( host , module ) :
def get_snmp_host ( host , module ) :
body = execute_show_command ( ' show snmp host ' , module )
command = ' show snmp host '
body = execute_show_command ( command , module )
host_map = {
host_map = {
' port ' : ' udp ' ,
' port ' : ' udp ' ,
@ -161,19 +192,19 @@ def get_snmp_host(host, module):
for each in resource_table :
for each in resource_table :
key = str ( each [ ' host ' ] )
key = str ( each [ ' host ' ] )
src = each . get ( ' src_intf ' )
src = each . get ( ' src_intf ' , None )
host_resource = apply_key_map ( host_map , each )
host_resource = apply_key_map ( host_map , each )
if src :
if src :
host_resource [ ' src_intf ' ] = src . split ( ' : ' ) [ 1 ] . strip ( )
host_resource [ ' src_intf ' ] = src . split ( ' : ' ) [ 1 ] . strip ( )
vrf_filt = each . get ( ' TABLE_vrf_filters ' )
vrf_filt = each . get ( ' TABLE_vrf_filters ' , None )
if vrf_filt :
if vrf_filt :
vrf_filter = vrf_filt [ ' ROW_vrf_filters ' ] [ ' vrf_filter ' ] . split ( ' : ' ) [ 1 ] . split ( ' , ' )
vrf_filter = vrf_filt [ ' ROW_vrf_filters ' ] [ ' vrf_filter ' ] . split ( ' : ' ) [ 1 ] . split ( ' , ' )
filters = [ vrf . strip ( ) for vrf in vrf_filter ]
filters = [ vrf . strip ( ) for vrf in vrf_filter ]
host_resource [ ' vrf_filter ' ] = filters
host_resource [ ' vrf_filter ' ] = filters
vrf = each . get ( ' vrf ' )
vrf = each . get ( ' vrf ' , None )
if vrf :
if vrf :
host_resource [ ' vrf ' ] = vrf . split ( ' : ' ) [ 1 ] . strip ( )
host_resource [ ' vrf ' ] = vrf . split ( ' : ' ) [ 1 ] . strip ( )
resource [ key ] = host_resource
resource [ key ] = host_resource
@ -181,7 +212,7 @@ def get_snmp_host(host, module):
except ( KeyError , AttributeError , TypeError ) :
except ( KeyError , AttributeError , TypeError ) :
return resource
return resource
find = resource . get ( host )
find = resource . get ( host , None )
if find :
if find :
fix_find = { }
fix_find = { }
@ -191,7 +222,9 @@ def get_snmp_host(host, module):
else :
else :
fix_find [ key ] = value
fix_find [ key ] = value
return fix_find
return fix_find
else :
return { }
else :
return { }
return { }
@ -218,10 +251,10 @@ def config_snmp_host(delta, proposed, existing, module):
host = proposed [ ' snmp_host ' ]
host = proposed [ ' snmp_host ' ]
cmd = ' snmp-server host {0} ' . format ( proposed [ ' snmp_host ' ] )
cmd = ' snmp-server host {0} ' . format ( proposed [ ' snmp_host ' ] )
snmp_type = delta . get ( ' snmp_type ' )
snmp_type = delta . get ( ' snmp_type ' , None )
version = delta . get ( ' version ' )
version = delta . get ( ' version ' , None )
ver = delta . get ( ' v3 ' )
ver = delta . get ( ' v3 ' , None )
community = delta . get ( ' community ' )
community = delta . get ( ' community ' , None )
command_builder . append ( cmd )
command_builder . append ( cmd )
if any ( [ snmp_type , version , ver , community ] ) :
if any ( [ snmp_type , version , ver , community ] ) :
@ -258,14 +291,26 @@ def config_snmp_host(delta, proposed, existing, module):
' src_intf ' : ' snmp-server host {0} source-interface {src_intf} '
' src_intf ' : ' snmp-server host {0} source-interface {src_intf} '
}
}
for key in delta :
for key , value in delta . items ( ) :
command = CMDS . get ( key )
if key in [ ' vrf_filter ' , ' vrf ' , ' udp ' , ' src_intf ' ] :
command = CMDS . get ( key , None )
if command :
if command :
cmd = command . format ( host , * * delta )
cmd = command . format ( host , * * delta )
commands . append ( cmd )
commands . append ( cmd )
cmd = None
return commands
return commands
def flatten_list ( command_lists ) :
flat_command_list = [ ]
for command in command_lists :
if isinstance ( command , list ) :
flat_command_list . extend ( command )
else :
flat_command_list . append ( command )
return flat_command_list
def main ( ) :
def main ( ) :
argument_spec = dict (
argument_spec = dict (
snmp_host = dict ( required = True , type = ' str ' ) ,
snmp_host = dict ( required = True , type = ' str ' ) ,
@ -282,11 +327,13 @@ def main():
argument_spec . update ( nxos_argument_spec )
argument_spec . update ( nxos_argument_spec )
module = AnsibleModule ( argument_spec = argument_spec , supports_check_mode = True )
module = AnsibleModule ( argument_spec = argument_spec ,
supports_check_mode = True )
warnings = list ( )
warnings = list ( )
check_args ( module , warnings )
check_args ( module , warnings )
results = { ' changed ' : False , ' commands ' : [ ] , ' warnings ' : warnings }
snmp_host = module . params [ ' snmp_host ' ]
snmp_host = module . params [ ' snmp_host ' ]
community = module . params [ ' community ' ]
community = module . params [ ' community ' ]
@ -297,6 +344,7 @@ def main():
vrf_filter = module . params [ ' vrf_filter ' ]
vrf_filter = module . params [ ' vrf_filter ' ]
vrf = module . params [ ' vrf ' ]
vrf = module . params [ ' vrf ' ]
snmp_type = module . params [ ' snmp_type ' ]
snmp_type = module . params [ ' snmp_type ' ]
state = module . params [ ' state ' ]
state = module . params [ ' state ' ]
if snmp_type == ' inform ' and version != ' v3 ' :
if snmp_type == ' inform ' and version != ' v3 ' :
@ -321,19 +369,13 @@ def main():
# existing returns the list of vrfs configured for a given host
# existing returns the list of vrfs configured for a given host
# checking to see if the proposed is in the list
# checking to see if the proposed is in the list
store = existing . get ( ' vrf_filter ' )
store = existing . get ( ' vrf_filter ' , None )
if existing and store :
if existing and store :
if vrf_filter not in existing [ ' vrf_filter ' ] :
if vrf_filter not in existing [ ' vrf_filter ' ] :
existing [ ' vrf_filter ' ] = None
existing [ ' vrf_filter ' ] = None
else :
else :
existing [ ' vrf_filter ' ] = vrf_filter
existing [ ' vrf_filter ' ] = vrf_filter
commands = [ ]
if state == ' absent ' and existing :
command = remove_snmp_host ( snmp_host , existing )
commands . append ( command )
elif state == ' present ' :
args = dict (
args = dict (
community = community ,
community = community ,
snmp_host = snmp_host ,
snmp_host = snmp_host ,
@ -345,25 +387,49 @@ def main():
vrf = vrf ,
vrf = vrf ,
snmp_type = snmp_type
snmp_type = snmp_type
)
)
proposed = dict ( ( k , v ) for k , v in args . items ( ) if v is not None )
proposed = dict ( ( k , v ) for k , v in args . items ( ) if v is not None )
delta = dict ( set ( proposed . items ( ) ) . difference ( existing . items ( ) ) )
delta = dict ( set ( proposed . items ( ) ) . difference ( existing . items ( ) ) )
changed = False
commands = [ ]
end_state = existing
if state == ' absent ' :
if existing :
command = remove_snmp_host ( snmp_host , existing )
commands . append ( command )
elif state == ' present ' :
if delta :
if delta :
command = config_snmp_host ( delta , proposed , existing , module )
command = config_snmp_host ( delta , proposed , existing , module )
commands . append ( command )
commands . append ( command )
cmds = flatten_list ( commands )
cmds = flatten_list ( commands )
if cmds :
if cmds :
results [ ' changed ' ] = True
if module . check_mode :
if not module . check_mode :
module . exit_json ( changed = True , commands = cmds )
else :
changed = True
load_config ( module , cmds )
load_config ( module , cmds )
end_state = get_snmp_host ( snmp_host , module )
if ' configure ' in cmds :
if ' configure ' in cmds :
cmds . pop ( 0 )
cmds . pop ( 0 )
results [ ' commands ' ] = cmds
if store :
existing [ ' vrf_filter ' ] = store
results = { }
results [ ' proposed ' ] = proposed
results [ ' existing ' ] = existing
results [ ' end_state ' ] = end_state
results [ ' updates ' ] = cmds
results [ ' changed ' ] = changed
results [ ' warnings ' ] = warnings
module . exit_json ( * * results )
module . exit_json ( * * results )
if __name__ == ' __main__ ' :
if __name__ == " __main__ " :
main ( )
main ( )