diff options
author | Sumit Jaiswal <sjaiswal@redhat.com> | 2020-02-28 18:29:17 +0530 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-02-28 18:29:17 +0530 |
commit | 4c0eb4396b5665cb940d85f9557fc128e2b953bb (patch) | |
tree | f601157b4acedac237b9e529a42118d782839964 /lib/ansible/modules/network | |
parent | 6629b9feefddd0c289f508fe7cc915ca26dc483b (diff) | |
download | ansible-4c0eb4396b5665cb940d85f9557fc128e2b953bb.tar.gz |
Resource module for IOS static routes (#64632)
* ios_static_routes
Diffstat (limited to 'lib/ansible/modules/network')
-rw-r--r-- | lib/ansible/modules/network/ios/ios_facts.py | 2 | ||||
-rw-r--r-- | lib/ansible/modules/network/ios/ios_static_routes.py | 710 |
2 files changed, 711 insertions, 1 deletions
diff --git a/lib/ansible/modules/network/ios/ios_facts.py b/lib/ansible/modules/network/ios/ios_facts.py index 6a93dc7971..5c3ff8dae3 100644 --- a/lib/ansible/modules/network/ios/ios_facts.py +++ b/lib/ansible/modules/network/ios/ios_facts.py @@ -58,7 +58,7 @@ options: a specific subset should not be collected. Valid subsets are 'all', 'interfaces', 'l2_interfaces', 'vlans', 'lag_interfaces', 'lacp', 'lacp_interfaces', 'lldp_global', - 'lldp_interfaces', 'l3_interfaces', 'acl_interfaces'. + 'lldp_interfaces', 'l3_interfaces', 'acl_interfaces', 'static_routes'. version_added: "2.9" """ diff --git a/lib/ansible/modules/network/ios/ios_static_routes.py b/lib/ansible/modules/network/ios/ios_static_routes.py new file mode 100644 index 0000000000..dc76d04ffe --- /dev/null +++ b/lib/ansible/modules/network/ios/ios_static_routes.py @@ -0,0 +1,710 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# Copyright 2019 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +############################################# +# WARNING # +############################################# +# +# This file is auto generated by the resource +# module builder playbook. +# +# Do not edit this file manually. +# +# Changes to this file will be over written +# by the resource module builder. +# +# Changes should be made in the model used to +# generate this file or in the resource module +# builder template. +# +############################################# + +""" +The module file for ios_static_routes +""" + + +from __future__ import absolute_import, division, print_function +__metaclass__ = type + + +ANSIBLE_METADATA = {'metadata_version': '1.1', + 'status': ['preview'], + 'supported_by': 'network'} + +DOCUMENTATION = """ +--- +module: ios_static_routes +version_added: "2.10" +short_description: Configure and manage static routes on IOS devices. +description: This module configures and manages the static routes on IOS platforms. +author: Sumit Jaiswal (@justjais) +notes: +- Tested against Cisco IOSv Version 15.2 on VIRL +- This module works with connection C(network_cli). + See L(IOS Platform Options,../network/user_guide/platform_ios.html). +options: + config: + description: A dictionary of static route options + type: list + elements: dict + suboptions: + vrf: + description: + - IP VPN Routing/Forwarding instance name. + - NOTE, In case of IPV4/IPV6 VRF routing table should pre-exist before + configuring. + - NOTE, if the vrf information is not provided then the routes shall be + configured under global vrf. + type: str + address_families: + elements: dict + description: + - Address family to use for the static routes + type: list + suboptions: + afi: + description: + - Top level address family indicator. + required: true + type: str + choices: + - ipv4 + - ipv6 + routes: + description: Configuring static route + type: list + elements: dict + suboptions: + dest: + description: Destination prefix with its subnet mask + type: str + required: true + topology: + description: + - Configure static route for a Topology Routing/Forwarding instance + - NOTE, VRF and Topology can be used together only with Multicast and + Topology should pre-exist before it can be used + type: str + next_hops: + description: + - next hop address or interface + type: list + elements: dict + suboptions: + forward_router_address: + description: Forwarding router's address + type: str + interface: + description: Interface for directly connected static routes + type: str + dhcp: + description: Default gateway obtained from DHCP + type: bool + distance_metric: + description: Distance metric for this route + type: int + global: + description: Next hop address is global + type: bool + name: + description: Specify name of the next hop + type: str + multicast: + description: multicast route + type: bool + permanent: + description: permanent route + type: bool + tag: + description: + - Set tag for this route + - Refer to vendor documentation for valid values. + type: int + track: + description: + - Install route depending on tracked item with tracked object number. + - Tracking does not support multicast + - Refer to vendor documentation for valid values. + type: int + running_config: + description: + - The module, by default, will connect to the remote device and + retrieve the current running-config to use as a base for comparing + against the contents of source. There are times when it is not + desirable to have the task get the current running-config for + every task in a playbook. The I(running_config) argument allows the + implementer to pass in the configuration to use as the base + config for comparison. This value of this option should be the + output received from device by executing command + C(show configuration commands | grep 'static route') + type: str + state: + description: + - The state the configuration should be left in + - The states I(rendered), I(gathered) and I(parsed) does not perform any change on the + device. + - The state I(rendered) will transform the configuration in C(config) option to platform + specific CLI commands which will be returned in the I(rendered) key within the result. + For state I(rendered) active connection to remote host is not required. + - The state I(gathered) will fetch the running configuration from device and transform + it into structured data in the format as per the resource module argspec and the + value is returned in the I(gathered) key within the result. + - The state I(parsed) reads the configuration from C(running_config) option and transforms + it into JSON format as per the resource module parameters and the value is returned in + the I(parsed) key within the result. The value of C(running_config) option should be the + same format as the output of command I(show running-config | include ip route|ipv6 route) + executed on device. For state I(parsed) active connection to remote host is not required. + type: str + choices: + - merged + - replaced + - overridden + - deleted + - gathered + - rendered + - parsed + default: merged +""" + +EXAMPLES = """ +--- + +# Using merged + +# Before state: +# ------------- +# +# vios#show running-config | include ip route|ipv6 route + +- name: Merge provided configuration with device configuration + ios_static_routes: + config: + - vrf: blue + address_families: + - afi: ipv4 + routes: + - dest: 192.0.2.0/24 + next_hops: + - forward_router_address: 192.0.2.1 + name: merged_blue + tag: 50 + track: 150 + - address_families: + - afi: ipv4 + routes: + - dest: 198.51.100.0/24 + next_hops: + - forward_router_address: 198.51.101.1 + name: merged_route_1 + distance_metric: 110 + tag: 40 + multicast: True + - forward_router_address: 198.51.101.2 + name: merged_route_2 + distance_metric: 30 + - forward_router_address: 198.51.101.3 + name: merged_route_3 + - afi: ipv6 + routes: + - dest: 2001:DB8:0:3::/64 + next_hops: + - forward_router_address: 2001:DB8:0:3::2 + name: merged_v6 + tag: 105 + state: merged + +# Commands fired: +# --------------- +# ip route vrf blue 192.0.2.0 255.255.255.0 10.0.0.8 name merged_blue track 150 tag 50 +# ip route 198.51.100.0 255.255.255.0 198.51.101.1 110 multicast name merged_route_1 tag 40 +# ip route 198.51.100.0 255.255.255.0 198.51.101.2 30 name merged_route_2 +# ip route 198.51.100.0 255.255.255.0 198.51.101.3 name merged_route_3 +# ipv6 route 2001:DB8:0:3::/64 2001:DB8:0:3::2 name merged_v6 tag 105 + +# After state: +# ------------ +# +# vios#show running-config | include ip route|ipv6 route +# ip route vrf blue 192.0.2.0 255.255.255.0 192.0.2.1 tag 50 name merged_blue track 150 +# ip route 198.51.100.0 255.255.255.0 198.51.101.3 name merged_route_3 +# ip route 198.51.100.0 255.255.255.0 198.51.101.2 30 name merged_route_2 +# ip route 198.51.100.0 255.255.255.0 198.51.101.1 110 tag 40 name merged_route_1 multicast +# ipv6 route 2001:DB8:0:3::/64 2001:DB8:0:3::2 tag 105 name merged_v6 + +# Using replaced + +# Before state: +# ------------- +# +# vios#show running-config | include ip route|ipv6 route +# ip route vrf ansible_temp_vrf 192.0.2.0 255.255.255.0 192.0.2.1 name test_vrf track 150 tag 50 +# ip route 198.51.100.0 255.255.255.0 198.51.101.1 110 multicast name route_1 tag 40 +# ip route 198.51.100.0 255.255.255.0 198.51.101.2 30 name route_2 +# ip route 198.51.100.0 255.255.255.0 198.51.101.3 name route_3 +# ipv6 route 2001:DB8:0:3::/64 2001:DB8:0:3::2 name test_v6 tag 105 + +- name: Replace provided configuration with device configuration + ios_static_routes: + config: + - address_families: + - afi: ipv4 + routes: + - dest: 198.51.100.0/24 + next_hops: + - forward_router_address: 198.51.101.1 + name: replaced_route + distance_metric: 175 + tag: 70 + multicast: True + state: replaced + +# Commands fired: +# --------------- +# no ip route 198.51.100.0 255.255.255.0 198.51.101.1 110 multicast name route_1 tag 40 +# no ip route 198.51.100.0 255.255.255.0 198.51.101.2 30 name route_2 +# no ip route 198.51.100.0 255.255.255.0 198.51.101.3 name route_3 +# ip route 198.51.100.0 255.255.255.0 198.51.101.1 175 name replaced_route track 150 tag 70 + +# After state: +# ------------ +# +# vios#show running-config | include ip route|ipv6 route +# ip route vrf ansible_temp_vrf 192.0.2.0 255.255.255.0 192.0.2.1 name test_vrf track 150 tag 50 +# ip route 198.51.100.0 255.255.255.0 198.51.101.1 175 name replaced_route track 150 tag 70 +# ipv6 route 2001:DB8:0:3::/64 2001:DB8:0:3::2 tag 105 name test_v6 + +# Using overridden + +# Before state: +# ------------- +# +# vios#show running-config | include ip route|ipv6 route +# ip route vrf ansible_temp_vrf 192.0.2.0 255.255.255.0 192.0.2.1 name test_vrf track 150 tag 50 +# ip route 198.51.100.0 255.255.255.0 198.51.101.1 110 multicast name route_1 tag 40 +# ip route 198.51.100.0 255.255.255.0 198.51.101.2 30 name route_2 +# ip route 198.51.100.0 255.255.255.0 198.51.101.3 name route_3 +# ipv6 route 2001:DB8:0:3::/64 2001:DB8:0:3::2 name test_v6 tag 105 + +- name: Override provided configuration with device configuration + ios_static_routes: + config: + - vrf: blue + address_families: + - afi: ipv4 + routes: + - dest: 192.0.2.0/24 + next_hops: + - forward_router_address: 192.0.2.1 + name: override_vrf + tag: 50 + track: 150 + state: overridden + +# Commands fired: +# --------------- +# no ip route 198.51.100.0 255.255.255.0 198.51.101.1 110 multicast name route_1 tag 40 +# no ip route 198.51.100.0 255.255.255.0 198.51.101.2 30 name route_2 +# no ip route 198.51.100.0 255.255.255.0 198.51.101.3 name route_3 +# no ip route vrf ansible_temp_vrf 192.0.2.0 255.255.255.0 198.51.101.8 name test_vrf track 150 tag 50 +# no ipv6 route FD5D:12C9:2201:1::/64 FD5D:12C9:2202::2 name test_v6 tag 105 +# ip route vrf blue 192.0.2.0 255.255.255.0 198.51.101.4 name override_vrf track 150 tag 50 + +# After state: +# ------------ +# +# vios#show running-config | include ip route|ipv6 route +# ip route vrf blue 192.0.2.0 255.255.255.0 192.0.2.1 tag 50 name override_vrf track 150 + +# Using Deleted + +# Example 1: +# ---------- +# To delete the exact static routes, with all the static routes explicitly mentioned in want + +# Before state: +# ------------- +# +# vios#show running-config | include ip route|ipv6 route +# ip route vrf ansible_temp_vrf 192.0.2.0 255.255.255.0 192.0.2.1 name test_vrf track 150 tag 50 +# ip route 198.51.100.0 255.255.255.0 198.51.101.1 110 multicast name route_1 tag 40 +# ip route 198.51.100.0 255.255.255.0 198.51.101.2 30 name route_2 +# ip route 198.51.100.0 255.255.255.0 198.51.101.3 name route_3 +# ipv6 route 2001:DB8:0:3::/64 2001:DB8:0:3::2 name test_v6 tag 105 + +- name: Delete provided configuration from the device configuration + ios_static_routes: + config: + - vrf: ansible_temp_vrf + address_families: + - afi: ipv4 + routes: + - dest: 192.0.2.0/24 + next_hops: + - forward_router_address: 192.0.2.1 + name: test_vrf + tag: 50 + track: 150 + - address_families: + - afi: ipv4 + routes: + - dest: 198.51.100.0/24 + next_hops: + - forward_router_address: 198.51.101.1 + name: route_1 + distance_metric: 110 + tag: 40 + multicast: True + - forward_router_address: 198.51.101.2 + name: route_2 + distance_metric: 30 + - forward_router_address: 198.51.101.3 + name: route_3 + - afi: ipv6 + routes: + - dest: 2001:DB8:0:3::/64 + next_hops: + - forward_router_address: 2001:DB8:0:3::2 + name: test_v6 + tag: 105 + state: deleted + +# Commands fired: +# --------------- +# no ip route vrf ansible_temp_vrf 192.0.2.0 255.255.255.0 198.51.101.8 name test_vrf track 150 tag 50 +# no ip route 198.51.100.0 255.255.255.0 198.51.101.1 110 multicast name route_1 tag 40 +# no ip route 198.51.100.0 255.255.255.0 198.51.101.2 30 name route_2 +# no ip route 198.51.100.0 255.255.255.0 198.51.101.3 name route_3 +# no ipv6 route FD5D:12C9:2201:1::/64 FD5D:12C9:2202::2 name test_v6 tag 105 + +# After state: +# ------------ +# +# vios#show running-config | include ip route|ipv6 route + +# Example 2: +# ---------- +# To delete the destination specific static routes + +# Before state: +# ------------- +# +# vios#show running-config | include ip route|ipv6 route +# ip route vrf ansible_temp_vrf 192.0.2.0 255.255.255.0 192.0.2.1 name test_vrf track 150 tag 50 +# ip route 198.51.100.0 255.255.255.0 198.51.101.1 110 multicast name route_1 tag 40 +# ip route 198.51.100.0 255.255.255.0 198.51.101.2 30 name route_2 +# ip route 198.51.100.0 255.255.255.0 198.51.101.3 name route_3 +# ipv6 route 2001:DB8:0:3::/64 2001:DB8:0:3::2 name test_v6 tag 105 + +- name: Delete provided configuration from the device configuration + ios_static_routes: + config: + - address_families: + - afi: ipv4 + routes: + - dest: 198.51.100.0/24 + state: deleted + +# Commands fired: +# --------------- +# no ip route 198.51.100.0 255.255.255.0 198.51.101.3 name route_3 +# no ip route 198.51.100.0 255.255.255.0 198.51.101.2 30 name route_2 +# no ip route 198.51.100.0 255.255.255.0 198.51.101.1 110 tag 40 name route_1 multicast + +# After state: +# ------------ +# +# vios#show running-config | include ip route|ipv6 route +# ip route vrf ansible_temp_vrf 192.0.2.0 255.255.255.0 192.0.2.1 tag 50 name test_vrf track 150 +# ipv6 route 2001:DB8:0:3::/64 2001:DB8:0:3::2 tag 105 name test_v6 + + +# Example 3: +# ---------- +# To delete the vrf specific static routes + +# Before state: +# ------------- +# +# vios#show running-config | include ip route|ipv6 route +# ip route vrf ansible_temp_vrf 192.0.2.0 255.255.255.0 192.0.2.1 name test_vrf track 150 tag 50 +# ip route 198.51.100.0 255.255.255.0 198.51.101.1 110 multicast name route_1 tag 40 +# ip route 198.51.100.0 255.255.255.0 198.51.101.2 30 name route_2 +# ip route 198.51.100.0 255.255.255.0 198.51.101.3 name route_3 +# ipv6 route 2001:DB8:0:3::/64 2001:DB8:0:3::2 name test_v6 tag 105 + +- name: Delete provided configuration from the device configuration + ios_static_routes: + config: + - vrf: ansible_temp_vrf + state: deleted + +# Commands fired: +# --------------- +# no ip route vrf ansible_temp_vrf 192.0.2.0 255.255.255.0 192.0.2.1 name test_vrf track 150 tag 50 + +# After state: +# ------------ +# +# vios#show running-config | include ip route|ipv6 route +# ip route 198.51.100.0 255.255.255.0 198.51.101.3 name route_3 +# ip route 198.51.100.0 255.255.255.0 198.51.101.2 30 name route_2 +# ip route 198.51.100.0 255.255.255.0 198.51.101.1 110 tag 40 name route_1 multicast +# ipv6 route 2001:DB8:0:3::/64 2001:DB8:0:3::2 tag 105 name test_v6 + +# Using Deleted without any config passed +#"(NOTE: This will delete all of configured resource module attributes from each configured interface)" + +# Before state: +# ------------- +# +# vios#show running-config | include ip route|ipv6 route +# ip route vrf ansible_temp_vrf 192.0.2.0 255.255.255.0 192.0.2.1 name test_vrf track 150 tag 50 +# ip route 198.51.100.0 255.255.255.0 198.51.101.1 110 multicast name route_1 tag 40 +# ip route 198.51.100.0 255.255.255.0 198.51.101.2 30 name route_2 +# ip route 198.51.100.0 255.255.255.0 198.51.101.3 name route_3 +# ipv6 route 2001:DB8:0:3::/64 2001:DB8:0:3::2 name test_v6 tag 105 + +- name: Delete ALL configured IOS static routes + ios_static_routes: + state: deleted + +# Commands fired: +# --------------- +# no ip route vrf ansible_temp_vrf 192.0.2.0 255.255.255.0 192.0.2.1 tag 50 name test_vrf track 150 +# no ip route 198.51.100.0 255.255.255.0 198.51.101.3 name route_3 +# no ip route 198.51.100.0 255.255.255.0 198.51.101.2 30 name route_2 +# no ip route 198.51.100.0 255.255.255.0 198.51.101.1 110 tag 40 name route_1 multicast +# no ipv6 route 2001:DB8:0:3::/64 2001:DB8:0:3::2 tag 105 name test_v6 + +# After state: +# ------------- +# +# vios#show running-config | include ip route|ipv6 route +# + +# Using gathered + +# Before state: +# ------------- +# +# vios#show running-config | include ip route|ipv6 route +# ip route vrf ansible_temp_vrf 192.0.2.0 255.255.255.0 192.0.2.1 name test_vrf track 150 tag 50 +# ip route 198.51.100.0 255.255.255.0 198.51.101.1 110 multicast name route_1 tag 40 +# ip route 198.51.100.0 255.255.255.0 198.51.101.2 30 name route_2 +# ip route 198.51.100.0 255.255.255.0 198.51.101.3 name route_3 +# ipv6 route 2001:DB8:0:3::/64 2001:DB8:0:3::2 name test_v6 tag 105 + +- name: Gather listed static routes with provided configurations + ios_static_routes: + config: + state: gathered + +# Module Execution Result: +# ------------------------ +# +# "gathered": [ +# { +# "address_families": [ +# { +# "afi": "ipv4", +# "routes": [ +# { +# "dest": "192.0.2.0/24", +# "next_hops": [ +# { +# "forward_router_address": "192.0.2.1", +# "name": "test_vrf", +# "tag": 50, +# "track": 150 +# } +# ] +# } +# ] +# } +# ], +# "vrf": "ansible_temp_vrf" +# }, +# { +# "address_families": [ +# { +# "afi": "ipv6", +# "routes": [ +# { +# "dest": "2001:DB8:0:3::/64", +# "next_hops": [ +# { +# "forward_router_address": "2001:DB8:0:3::2", +# "name": "test_v6", +# "tag": 105 +# } +# ] +# } +# ] +# }, +# { +# "afi": "ipv4", +# "routes": [ +# { +# "dest": "198.51.100.0/24", +# "next_hops": [ +# { +# "distance_metric": 110, +# "forward_router_address": "198.51.101.1", +# "multicast": true, +# "name": "route_1", +# "tag": 40 +# }, +# { +# "distance_metric": 30, +# "forward_router_address": "198.51.101.2", +# "name": "route_2" +# }, +# { +# "forward_router_address": "198.51.101.3", +# "name": "route_3" +# } +# ] +# } +# ] +# } +# ] +# } +# ] + +# After state: +# ------------ +# +# vios#show running-config | include ip route|ipv6 route +# ip route vrf ansible_temp_vrf 192.0.2.0 255.255.255.0 192.0.2.1 name test_vrf track 150 tag 50 +# ip route 198.51.100.0 255.255.255.0 198.51.101.1 110 multicast name route_1 tag 40 +# ip route 198.51.100.0 255.255.255.0 198.51.101.2 30 name route_2 +# ip route 198.51.100.0 255.255.255.0 198.51.101.3 name route_3 +# ipv6 route 2001:DB8:0:3::/64 2001:DB8:0:3::2 name test_v6 tag 105 + +# Using rendered + +- name: Render the commands for provided configuration + ios_static_routes: + config: + - vrf: ansible_temp_vrf + address_families: + - afi: ipv4 + routes: + - dest: 192.0.2.0/24 + next_hops: + - forward_router_address: 192.0.2.1 + name: test_vrf + tag: 50 + track: 150 + - address_families: + - afi: ipv4 + routes: + - dest: 198.51.100.0/24 + next_hops: + - forward_router_address: 198.51.101.1 + name: route_1 + distance_metric: 110 + tag: 40 + multicast: True + - forward_router_address: 198.51.101.2 + name: route_2 + distance_metric: 30 + - forward_router_address: 198.51.101.3 + name: route_3 + - afi: ipv6 + routes: + - dest: 2001:DB8:0:3::/64 + next_hops: + - forward_router_address: 2001:DB8:0:3::2 + name: test_v6 + tag: 105 + state: rendered + +# Module Execution Result: +# ------------------------ +# +# "rendered": [ +# "ip route vrf ansible_temp_vrf 192.0.2.0 255.255.255.0 192.0.2.1 name test_vrf track 150 tag 50", +# "ip route 198.51.100.0 255.255.255.0 198.51.101.1 110 multicast name route_1 tag 40", +# "ip route 198.51.100.0 255.255.255.0 198.51.101.2 30 name route_2", +# "ip route 198.51.100.0 255.255.255.0 198.51.101.3 name route_3", +# "ipv6 route 2001:DB8:0:3::/64 2001:DB8:0:3::2 name test_v6 tag 105" +# ] + +""" + +RETURN = """ +before: + description: The configuration as structured data prior to module invocation. + returned: always + type: list + sample: The configuration returned will always be in the same format of the parameters above. +after: + description: The configuration as structured data after module completion. + returned: when changed + type: list + sample: The configuration returned will always be in the same format of the parameters above. +commands: + description: The set of commands pushed to the remote device + returned: always + type: list + sample: ['ip route vrf test 172.31.10.0 255.255.255.0 10.10.10.2 name new_test multicast'] +rendered: + description: The set of CLI commands generated from the value in C(config) option + returned: When C(state) is I(rendered) + type: list + sample: ['interface Ethernet1/1', 'mtu 1800'] +gathered: + description: + - The configuration as structured data transformed for the running configuration + fetched from remote host + returned: When C(state) is I(gathered) + type: list + sample: > + The configuration returned will always be in the same format + of the parameters above. +parsed: + description: + - The configuration as structured data transformed for the value of + C(running_config) option + returned: When C(state) is I(parsed) + type: list + sample: > + The configuration returned will always be in the same format + of the parameters above. +""" + + +from ansible.module_utils.basic import AnsibleModule +from ansible.module_utils.network.ios.argspec.static_routes.static_routes import Static_RoutesArgs +from ansible.module_utils.network.ios.config.static_routes.static_routes import Static_Routes + + +def main(): + """ + Main entry point for module execution + + :returns: the result form module invocation + """ + required_if = [('state', 'merged', ('config',)), + ('state', 'replaced', ('config',)), + ('state', 'overridden', ('config',)), + ('state', 'rendered', ('config',)), + ('state', 'parsed', ('running_config',))] + mutually_exclusive = [('config', 'running_config')] + + module = AnsibleModule(argument_spec=Static_RoutesArgs.argument_spec, + required_if=required_if, + supports_check_mode=True, + mutually_exclusive=mutually_exclusive) + + result = Static_Routes(module).execute_module() + module.exit_json(**result) + + +if __name__ == '__main__': + main() |