Skip to content

Templating in Automation

Jinja Templating

As you enter the automation world, you inevitably learn about Jinja templates.

Jinja is a templating engine that, with the help of a programming language like Python, can be used to create network configuration like this:

interface GigabitEthernet0/1
 description Uplink to ISP
 ip address 192.168.1.1 255.255.255.0
 no shutdown
!
router ospf 1
 network 192.168.1.0 0.0.0.255 area 0

From a template like this:

interface {{ interface_name }}
 description {{ description }}
 ip address {{ ip_address }} {{ subnet_mask }}
{% if shutdown %}
 shutdown
{% else %}
 no shutdown
{% endif %}
!
router ospf {{ ospf_process_id }}
 network {{ network }} {{ wildcard_mask }} area {{ area }}

This is a rudimentary example. However, you may be thinking,

  • What if I have different platforms with different syntax?
  • Can I do for-loops for interfaces?
  • What about secret keys?
  • How do I give the templates my variables in the first place?

Questions like these are why examples can be helpful! This section is intended to be a landing area for examples across the network automation community. With enough examples, it gets easier to analyze and build what works for you and your institution.

For those with templates already, this is your call to action to contribute your own examples!

Dartmouth College

Github Link to Templates

README

Date: September 9, 2024

Contact: networkengineers@dartmouth.onmicrosoft.com

These templates are from Dartmouth College and are provided as examples of what we are currently using with our automated device deployments. Each update to a configuration does a 'config replace' of the existing configuration with the newly generated configuration.

These templates will create an EVPN campus network using Juniper devices.

The access layer devices generally do not route and are generally connected to two distribution routers via an ESI-LAG, or occassionally to the aggregation layer. The access layer does not run EVPN.

The aggregation layer devices do not route and are connected to two distribution routers via an ESI-LAG. The aggregation layer does not run EVPN.

The core routers create the spines of the underlay network for the distribution and services devices and run BGP route reflectors for the EVPN overlay networks.

The distrubtion routers run EVPN and carry all VRFs that are relevant to any downstream devices and have anycast gateways for any routed downstream VLANs.

The WAN routers connect to ISPs and the service nodes. They do not run EVPN.

The service nodes run EVPN and interconnect all of the VRFs. They do not connect to any buildings. The inter-VRF routing is done on a firewall that connects to the service node, but there are currently no templates for the firewalls. The service nodes interconnect with each other via iBGP. The service nodes also use BGP connect to Infoblox DNS/DHCP servers that advertise anycast DNS servers. The service nodes also connect to any other internal BGP devices.

These templates are intended to be used with a variable named 'config', which contains definitions for all of the template variables. We create this dynamically based on information from NetBox. When data from NetBox is turned into variables, any tag on an object will be added as <tag_name>: <bool> if the tag does not contain an '='. If the tag contains and '=' then it will be added as <tag_name>: <value>, where <value> is the part after the '=' and <'tag_name'> is the part before the '='. Examples of tags are 'can_have_phones', 'acl_eth_in=block-chatter', 'mtu=9216', 'forrc_100_full', and 'dhcp_snooping_trusted'. If you find fields in the templates that aren't listed below by name then they are probably set via tags.

Some of the fields listed below will only be present if they are defined.

For the various classes of devices the rough definition is expected to be:

Access and Aggregation

{ 'addresses': [],
  'basenames': [ <interface_name>, <interface_name>, ... ],
  'can_deploy': <bool>,
  'custom_config_text': <config stanzas>,
  'custom_fields': { 'ASN': <ASN>,
                     'System_MAC_Limit': <int>,
                     'building_code': <text>,
                     'config_frozen': <bool>,
                     'custom_config_text': <config stanzas>,
                     'in_maintenance_mode': <bool>,
                     'mist_site': <text>,
                     'mist_wired_assurance': <'enabled'|'disabled'>,
                     'stp_bridge_priority': <int>,
                     'vlan_group': <text>},
  'device_platform': <device-model>,
  'dhcp_servers': [<ip>, <ip>],
  'dhcp_vrf': '<VRF-name>',
  'dns': { 'domainname': <domain>,
           'network-device-domainname': <domain>,
           'servers': [<ip>]},
  'fullnames': [ <interface_name>, <interface_name>, ... ],
  'has_phones': <bool>,
  'hostname': <text>,
  'interfaces': [ { 'description': <text>,
                    'enabled': <bool>,
                    'mode': 'access',
                    'name': <interface_name>,
                    'type': { 'label': <interface_type_label>,
                              'value': <interface_type>},
                    'vlans': <vlan_name>},
                  { 'description': <text>,
                    'enabled': <bool>,
                    'mode': 'trunk',
                    'name': <interface_name>,
                    'native_vlan': <vlan_name>,
                    'type': { 'label': <interface_type_label>,
                              'value': <interface_type>},
                    'vlans': [<vlan_name>, <vlan_name>, ... ] },
                  ... ],
  'lacp': [ {'members': [<interface_name>, <interface_name>], 'name': <lag_name>}, ... ],
  'lacp_interfaces': [<interface_name>, <interface_name>, ... ],
  'lag_count': <int>,
  'mgmt_hosts': [ <ip>, <ip>, ... ],
  'mgmt_ip': { 'default_gateway': <ip>,
               'ip': <ip>,
               'mask': <mask_length>,
               'vlan': <vlan_id> },
  'monitors': {'local': {}, 'remote': {}},
  'ntp': { 'servers': [ <ip>, <ip>, ... ],
           'timezone': <timezone> },
  'port_groups': {},
  'primary_ip4': None,
  'root': { 'password': <passwd> },
  'routed-vlans': [],
  'rstp_priority': <int>,
  'servers': [<ip>],
  'snmp': { 'communities': {<community>: [<subnet>]},
            'trap_receivers': [<ip>] },
  'snmp-v3': { 'authentication-password': <passwd>,
               'privacy-password': <passwd>,
               'target-address': <ip>,
               'target-name': <text>,
               'user-name': <username> },
  'snmp_location': <text>,
  'syslog': { 'messages_ignore': [ <text>, <text>, <text>, ... ],
              'servers': [<ip>, <ip>] },
  'tags': [],
  'users': { <username>: { 'class': 'super-user',
                     'ssh': 'ssh-rsa '
                            <key>
                            <description>,
                     'uid': <int>},
             ... },
  'vendor': <device_vendor>,
  'vendor_model': <device_model>,
  'virtual_chassis': [ { 'alias': '0',
                         'priority': '1',
                         'role': 'routing-engine',
                         'serial': <text>}],
  'vlans': [ { 'description': <text>,
               'name': <text>,
               'routed': <bool>,
               'tags': {<name>: <value>, ... },
               'vid': <int>,
               'vni': <int>},
             ... ]
}

Core

{ 'bgp': { 'keys': [ { 'secret': <passwd>,
                       'start': <date-time> }],
           'overlay_asn': <ASN>,
           'overlay_device_id': <ip>,
           'overlay_peers': [ {'ip': <peer-ip>, 'name': <peer-name>}, ... ],
           'rr_cluster_id': <ip>,
           'underlay_asn': <ASN>,
           'underlay_peers': [ { 'asn': <ASN>, 'ip': <peer-ip>, 'name': <peer-name> }, ... ] },
  'can_deploy': <bool>,
  'config_frozen': <bool>,
  'device_platform': <device-model>,
  'device_role': 'Core',
  'dhcp_servers': [<ip>, <ip>],
  'dhcp_vrf': '<VRF-name>',
  'dns': { 'domainname': <domain>,
           'network-device-domainname': <domain>,
           'servers': [<ip>]},
  'evpn': {'target_asn': <ASN>, 'target_switching_rd': <int>},
  'hostname': <text>,
  'in_maintenance_mode': <bool>,
  'interfaces': [ { 'description': <text>,
                    'enabled': <bool>,
                    'ipv4': [<ip>],
                    'ipv6': [],
                    'mtu': <int>,
                    'name': <interface-name>,
                    'routed': <bool>,
                    'type': { 'label': <interface_type_label>,
                              'value': <interface_type> },
                  {'name': <interface-name>, 'unused': True},
                  ... ],
  'lag_count': 0,
  'mgmt_hosts': [ <ip>, <ip>, ... ],
  'mgmt_ip': { 'default_gateway': <ip>,
               'ip': <ip>,
               'mask': <mask_length>,
               'vlan': <vlan_id> },
  'ntp': { 'servers': [ <ip>, <ip>, ... ],
           'timezone': <timezone> },
  'port_groups': { <port-id>: <port-speed>,
                   ... },
  'root': { 'password': <passwd> },
  'router_id': <ip>,
  'servers': [<ip>],
  'snmp': { 'communities': {<community>: [<subnet>]},
            'trap_receivers': [<ip>] },
  'snmp-v3': { 'authentication-password': <passwd>,
               'privacy-password': <passwd>,
               'target-address': <ip>,
               'target-name': <text>,
               'user-name': <username> },
  'snmp_location': <text>,
  'syslog': { 'facility': <syslog_level>,
              'messages_ignore': [ <text>, <text>, <text>, ... ],
              'servers': [<ip>, <ip>] },
  'underlay_loopbacks': [<subnet>],
  'underlay_transport': [<subnet>],
  'users': { <username>: { 'class': 'super-user',
                     'ssh': 'ssh-rsa '
                            <key>
                            <description>,
                     'uid': <int>},
             ... },
  'vendor': <device_vendor>,
  'vendor_model': <device_model>
}

Distribution

{ 'autoirbs': [ { 'description': <text>,
                  'enabled': True,
                  'gateway': <ip>,
                  'gateway_ipv6': <ip>,
                  'gw_mac': <mac-address>,
                  'label': '',
                  'mac_address': '',
                  'mode': {'label': 'Access', 'value': 'access'},
                  'mtu': '',
                  'name': <interface-name>,
                  'native_vlan': <vlan-name>,
                  'routed': True,
                  'tags': [],
                  'type': {'label': 'Virtual', 'value': 'virtual'},
                  'vrf': <vrf-name> },
                ... ],
  'bgp': { 'keys': [ { 'secret': <passwd>,
                       'start': <date-time> } ],
           'overlay_asn': <ASN>,
           'overlay_device_id': <ip>,
           'overlay_peers': [ {'ip': <ip>, 'name': <peer-name>}, ... ],
           'rr_cluster_id': <ip>,
           'underlay_asn': <ASN>,
           'underlay_peers': [ { 'asn': <ASN>,
                                 'ip': <ip>,
                                 'name': <peer-name> },
                               ... ] },
  'can_deploy': <bool>,
  'config_frozen': <bool>,
  'connected_devices': [ { 'local_interface': <interface-name>,
                           'name': <neighbor-device-name>,
                           'role': <neighbor-device-role>,
                           'vlans': [ { 'description': <text>,
                                        'name': <vlan-name>,
                                        'tags': [<tag>, <tag>, ... ],
                                        'vid': <int>,
                                        'vni': <int> },
                                      ... ] },
                         ... ],
  'custom_config_text': <text>,
  'device_platform': <device-model>,
  'device_role': 'Distribution',
  'dhcp_servers': [<ip>, <ip>],
  'dhcp_vrf': '<VRF-name>',
  'dns': { 'domainname': <domain>,
           'network-device-domainname': <domain>,
           'servers': [<ip>]},
  'evpn': {'target_asn': <ASN>, 'target_switching_rd': <int>},
  'hostname': <text>,
  'in_maintenance_mode': <bool>,
  'interfaces': [ { 'description': <text>,
                    'enabled': True,
                    'ipv4': [<ip>],
                    'ipv6': [],
                    'name': <interface-name>,
                    'routed': True,
                    'type': { 'label': <interface_type_label>,
                              'value': <interface_type> } },
                  { 'description': <text>,
                    'enabled': True,
                    'ipv4': [],
                    'ipv6': [],
                    'name': <interface-name>,
                    'type': { 'label': <interface_type_label>,
                              'value': <interface_type> } },
                  {'name': <interface-name>, 'unused': True},
                  { 'description': <text>,
                    'enabled': <bool>,
                    'ipv4': [],
                    'ipv6': [],
                    'mac_address': <mac-address>,
                    'mode': 'trunk',
                    'name': <lag-name>,
                    'switched': True,
                    'type': { 'label': 'Link Aggregation Group (LAG)',
                              'value': 'lag'},
                    'vlans': [ <vlan-name>, <vlan-name>, ... ] },
                  { 'description': '',
                    'enabled': <bool>,
                    'ipv4': [<ip>],
                    'ipv6': [<ip>],
                    'name': <interface-name>,
                    'routed': True,
                    'type': {'label': 'Virtual', 'value': 'virtual'},
                    'vrf': <vrf-name> },
                  { 'description': <text>,
                    'enabled': <bool>,
                    'gateway': <ip>,
                    'gateway_ipv6': <ip>,
                    'gw_mac': <mac-address>,
                    'label': '',
                    'mac_address': '',
                    'mode': {'label': 'Access', 'value': 'access'},
                    'mtu': '',
                    'name': <interface-name>,
                    'native_vlan': <vlan-name>,
                    'routed': True,
                    'tags': [],
                    'type': {'label': 'Virtual', 'value': 'virtual'},
                    'vrf': <vrf-name> },
                  ... ],
  'lacp': [ { 'lacp_id': <mac-address>,
              'members': [<interface-name>],
              'name': <lag-name>,
              'tags': [] },
            ... ],
  'lacp_interfaces': [<interface_name>, <interface_name>, ... ],
  'lag_count': <int>,
  'loopback_ips': [ {'address': <ip>, 'vrf': <vrf-name>}, ... ],
  'mgmt_hosts': [ <ip>, <ip>, ... ],
  'mgmt_ip': { 'default_gateway': <ip>,
               'ip': <ip>,
               'mask': <mask_length>,
               'vlan': <vlan_id> },
  'multicast_rp': { <vrf-name>: <ip>, ... },
  'ntp': { 'servers': [ <ip>, <ip>, ... ],
           'timezone': <timezone> },
  'peers': [ { 'device': <peer-name>,
               'interface': <remote-interface-name>,
               'local_interface': <local-interface-name> },
             ... ],
  'port_groups': { <port-id>: <port-speed>,
                   ... },
  'root': { 'password': <passwd> },
  'router_id': <ip>,
  'rstp_priority': <int>,
  'servers': [<ip>],
  'snmp': { 'communities': {<community>: [<subnet>]},
            'trap_receivers': [<ip>] },
  'snmp-v3': { 'authentication-password': <passwd>,
               'privacy-password': <passwd>,
               'target-address': <ip>,
               'target-name': <text>,
               'user-name': <username> },
  'snmp_location': <text>,
  'syslog': { 'facility': <syslog_level>,
              'messages_ignore': [ <text>, <text>, <text>, ... ],
              'servers': [<ip>, <ip>] },
  'underlay_loopbacks': [<subnet>],
  'underlay_transport': [<subnet>],
  'users': { <username>: { 'class': 'super-user',
                     'ssh': 'ssh-rsa '
                            <key>
                            <description>,
                     'uid': <int>},
             ... },
  'vendor': <device_vendor>,
  'vendor_model': <device_model>,
  'vids': { <vlan-name>: <int>, <vlan-name>: <int>, ... },
  'vlans': [ { 'description': <text>,
               'name': <text>,
               'vid': <int>,
               'vni': <int> },
             { 'description': <text>,
               'name': <text>,
               'routed': True,
               'tags': [<tag>, <tag>, ... ],
               'vid': <int>,
               'vni': <int> },
             ... ],
  'vrfs': [ { 'ipv4_filtered_prefixes': {},
              'ipv6_filtered_prefixes': {},
              'name': <vrf_name>,
              'rd': <int>},
            { 'ipv4_filtered_prefixes': {<tag>: [<ip-prefix>, <ip-prefix>, ... ]},
              'ipv6_filtered_prefixes': {},
              'name': <vrf_name>,
              'rd': <int>},
            ... ]
}

Services

{ 'bgp': { 'auth': [ { 'ip': <ip>,
                       'key': <passwd>,
                       'peer': <peer-name> },
                     ... ],
           'bgp_networks': [ <ip-prefix>, <ip-prefix>, ... ],
           'default_ipv4_filter': [ <ip-prefix>, <ip-prefix>, ... ],
           'default_ipv6_filter': [ <ip-prefix>, <ip-prefix>, ... ],
           'keys': [ { 'secret': <passwd>,
                       'start': <date-time> } ],
           'overlay_asn': <ASN>,
           'overlay_device_id': <ip>,
           'overlay_peers': [ {'ip': <ip>, 'name': <peer-name>}, ... ],
           'public_ipv4_filter': [ <ip-prefix> ],
           'public_ipv6_filter': [ <ip-prefix> ],
           'rr_cluster_id': <ip>,
           'underlay_asn': <ASN>,
           'underlay_peers': [ { 'asn': <ASN>,
                                 'ip': <ip>,
                                 'name': <peer-name> },
                               ... ] },
           'vrf_peers': { 'dns_peers': [ { 'asn': <ASN>,
                                           'ip': <ip>,
                                           'name': <peer-description>,
                                           'vrf': <vrf-name> },
                                         ... ],
                          'firewall_peers': [ { 'asn': <ASN>,
                                                'ip': <ip>,
                                                'name': <peer-description>,
                                                'trusted': <bool>,
                                                'vrf': <vrf-name> },
                                              ... ],
                          'ibgp_peers': [ { 'ip': <ip>,
                                            'name': <peer-description>,
                                            'trusted': <bool>,
                                            'vrf': <vrf-name> },
                                          ... ],
                          'isp_peers': [ { 'asn': <ASN>,
                                           'filter': <tag-name>,
                                           'ip': <ip>,
                                           'name': <peer-description>,
                                           'vrf': <vrf-name> },
                                         ... ],
                          'other_peers': [ { 'asn': <ASN>,
                                             'filter': <tag-name>,
                                             'ip': <ip>,
                                             'name': <peer-description>,
                                             'trusted': <bool>,
                                             'vrf': <vrf-name> },
                                           ... ],
                          'self_peers': [ { 'ip': <ip>,
                                            'remote-vrf': 'Internet',
                                            'trusted': <bool>,
                                            'vrf': <vrf-name> },
                                          ... ],
                          'wan_peers': [ { 'asn': <ASN>,
                                           'ip': <ip>,
                                           'name': <peer-description>,
                                           'trusted': <bool>},
                                         ... ],
  'can_deploy': <bool>,
  'config_frozen': <bool>,
  'custom_config_text': <text>,
  'device_platform': <device-model>,
  'device_role': 'Distribution',
  'dhcp_servers': [<ip>, <ip>],
  'dhcp_vrf': '<VRF-name>',
  'dns': { 'domainname': <domain>,
           'network-device-domainname': <domain>,
           'servers': [<ip>]},
  'evpn': {'target_asn': <ASN>, 'target_switching_rd': <int>},
  'hostname': <text>,
  'in_maintenance_mode': <bool>,
  'interfaces': [ { 'description': <text>,
                    'enabled': True,
                    'ipv4': [<ip>],
                    'ipv6': [],
                    'name': <interface-name>,
                    'routed': True,
                    'type': { 'label': <interface_type_label>,
                              'value': <interface_type> } },
                  { 'description': <text>,
                    'enabled': True,
                    'ipv4': [],
                    'ipv6': [],
                    'name': <interface-name>,
                    'type': { 'label': <interface_type_label>,
                              'value': <interface_type> } },
                  {'name': <interface-name>, 'unused': True},
                  { 'description': <text>,
                    'enabled': <bool>,
                    'ipv4': [],
                    'ipv6': [],
                    'mac_address': <mac-address>,
                    'mode': 'trunk',
                    'name': <lag-name>,
                    'switched': True,
                    'type': { 'label': 'Link Aggregation Group (LAG)',
                              'value': 'lag'},
                    'vlans': [ <vlan-name>, <vlan-name>, ... ] },
                  { 'description': '',
                    'enabled': <bool>,
                    'ipv4': [<ip>],
                    'ipv6': [<ip>],
                    'name': <interface-name>,
                    'routed': True,
                    'type': {'label': 'Virtual', 'value': 'virtual'},
                    'vrf': <vrf-name> },
                  { 'description': <text>,
                    'enabled': <bool>,
                    'gateway': <ip>,
                    'gateway_ipv6': <ip>,
                    'gw_mac': <mac-address>,
                    'label': '',
                    'mac_address': '',
                    'mode': {'label': 'Access', 'value': 'access'},
                    'mtu': '',
                    'name': <interface-name>,
                    'native_vlan': <vlan-name>,
                    'routed': True,
                    'tags': [],
                    'type': {'label': 'Virtual', 'value': 'virtual'},
                    'vrf': <vrf-name> },
                  ... ],
  'lacp': [ { 'lacp_id': <mac-address>,
              'members': [<interface-name>],
              'name': <lag-name>,
              'tags': [] },
            ... ],
  'lacp_interfaces': [<interface_name>, <interface_name>, ... ],
  'lag_count': <int>,
  'loopback_ips': [ {'address': <ip>, 'vrf': <vrf-name>}, ... ],
  'mgmt_hosts': [ <ip>, <ip>, ... ],
  'mgmt_ip': { 'default_gateway': <ip>,
               'ip': <ip>,
               'mask': <mask_length>,
               'vlan': <vlan_id> },
  'multicast_rp': { <vrf-name>: <ip>, ... },
  'network_announcements': { 'announce_network': [ { 'children': <int>,
                                                     'family': [IPv4|IPv6],
                                                     'network': <ip-prefix> },
                                                   ... ],
                             'announce_wan_network': [ { 'children': <int>,
                                                         'family': [IPv4|IPv6],
                                                         'network': <ip-prefix> },
                                                       ... ],
  'ntp': { 'servers': [ <ip>, <ip>, ... ],
           'timezone': <timezone> },
  'port_groups': { <port-id>: <port-speed>,
                   ... },
  'rds': { <vrf-name>: <int>, <vrf-name>: <int>, ... },
  'root': { 'password': <passwd> },
  'router_id': <ip>,
  'rstp_priority': <int>,
  'servers': [<ip>],
  'snmp': { 'communities': {<community>: [<subnet>]},
            'trap_receivers': [<ip>] },
  'snmp-v3': { 'authentication-password': <passwd>,
               'privacy-password': <passwd>,
               'target-address': <ip>,
               'target-name': <text>,
               'user-name': <username> },
  'snmp_location': <text>,
  'syslog': { 'facility': <syslog_level>,
              'messages_ignore': [ <text>, <text>, <text>, ... ],
              'servers': [<ip>, <ip>] },
  'transit_vrf': <vrf-name>,
  'underlay_loopbacks': [<subnet>],
  'underlay_transport': [<subnet>],
  'users': { <username>: { 'class': 'super-user',
                     'ssh': 'ssh-rsa '
                            <key>
                            <description>,
                     'uid': <int>},
             ... },
  'vendor': <device_vendor>,
  'vendor_model': <device_model>,
  'vlans': [ { 'description': <text>,
               'name': <text>,
               'vid': <int>,
               'vni': <int> },
             { 'description': <text>,
               'name': <text>,
               'routed': True,
               'tags': [<tag>, <tag>, ... ],
               'vid': <int>,
               'vni': <int> },
             ... ],
  'vrfs': [ { 'default_announce': <bool>,
              'default_receive': <bool>,
              'ipv4_filtered_prefixes': { <tag>: [ <ip-prefix>, <ip-prefix>, ... ],
                                          <tag>: [ <ip-prefix>, <ip-prefix>, ... ],
                                          ... },
              'ipv4_other_prefixes': [ <ip-prefix>, <ip-prefix>, ... ],
              'ipv4_routed_prefixes': [ <ip-prefix>, <ip-prefix>, ... ],
              'ipv6_filtered_prefixes': { <tag>: [ <ip-prefix>, <ip-prefix>, ... ],
                                          <tag>: [ <ip-prefix>, <ip-prefix>, ... ],
                                          ... },
              'ipv6_other_prefixes': [ <ip-prefix>, <ip-prefix>, ... ],
              'ipv6_routed_prefixes': [ <ip-prefix>, <ip-prefix>, ... ],
              'leak_vrf': <bool>,
              'name': <vrf-name>,
              'rd': <int>,
              'receive_leaks': <bool>,
              'strict_filtering': <bool> },
              'tags': [ <tag>, <tag>, ... ] },
            ... ],
}

WAN

  'bgp': { 'allowed_ISP_netblocks': [ <ip>, <ip>, ... ],
           'allowed_snmp_hosts': [ <ip>, <ip, ... ],
           'auth': [ { 'ip': <ip>,
                       'key': <passwd>,
                       'peer': <peer-description> },
                     ... ],
           'bgp_networks': [<ip-prefix>],
           'bogons': [ <ip-prefix>, <ip-prefix>, ... ],
           'bogons_ipv6': [ <ip-prefix>, <ip-prefix>, ... ],
           'default_ipv4_filter': [ <ip-prefix>, <ip-prefix>, ... ],
           'default_ipv6_filter': [ <ip-prefix>, <ip-prefix>, ... ],
           'overlay_asn': <ASN>,
           'public_ipv4_filter': [<ip-prefix>],
           'public_ipv6_filter': [<ip-prefix>],
           'wan_peers': { 'border-routers': [ { 'asn': <ASN>,
                                                'ip': <ip>,
                                                'name': <peer-name> },
                                              ... ],
                          'ddos': [ { 'as_prepend': None,
                                      'asn': <ASN>,
                                      'communities': ['target:<community-name>'],
                                      'ip': <ip>,
                                      'local_pref': None,
                                      'name': <peer-description> },
                                    ... ],
                          'providers': [ { 'as_prepend': [None|<int>],
                                           'asn': <peer-ASN>,
                                           'disabled': <bool>,
                                           'ip': <ip>,
                                           'local_pref': [None|<int>],
                                           'name': <peer-description> },
                                         ... ],
                          'service-nodes': [ { 'ip': <ip>,
                                               'name': <peer-name> },
                                             ... ] },
  'can_deploy': <bool>,
  'custom_config_text': <text>,
  'ddos_filters': { 'ddos_ipv4_filter': [<ip-prefix>],
                    'ddos_ipv6_filter': [<ip-prefix>]},
  'device_platform': <device-model>,
  'device_role': 'WAN',
  'dhcp_servers': [<ip>, <ip>],
  'dhcp_vrf': '<VRF-name>',
  'dns': { 'domainname': <domain>,
           'network-device-domainname': <domain>,
           'servers': [<ip>]},
  'hostname': <device-name>,
  'interfaces': [ { 'description': <interface-description>,
                    'enabled': <bool>,
                    'ipv4': [],
                    'ipv6': [],
                    'name': <interface-name>,
                    'type': { 'label': <interface_type_label>,
                              'value': <interface_type>},
                  { 'description': <interface-description>,
                    'enabled': <bool>,
                    'gw_mac': <mac-address>,
                    'ipv4': [<ip>],
                    'ipv6': [<ip>],
                    'local_pref': <int>,
                    'name': <interface-name>,
                    'native_vlan': <vlan-name>,
                    'routed': True,
                    'subinterface': True,
                    'type': {'label': 'Virtual', 'value': 'virtual'},
                    'vrf': <vrf-name> },
                  {'name': <interface-name>, 'unused': True},
                  ... ],
  'lacp': [ {'members': [<interface-name>, <interface-name>], 'name': <lag-name>, 'tags': []}, ... ],
  'lacp_interfaces': [ <interface-name>, <interface-name>, ... ],
  'lag_count': <int>,
  'mgmt_hosts': [ <ip>, <ip>, ... ],
  'mgmt_ip': { 'default_gateway': <ip>,
               'ip': <ip>,
               'mask': <mask_length>,
               'vlan': <vlan_id> },
  'network_announcements': { 'announce_network': [ { 'children': <int>,
                                                     'family': ['IPv4'|'IPv6'],
                                                     'network': <ip-prefix> },
                                                   ... ],
                             'announce_wan_network': [ { 'children': <int>,
                                                         'family': ['IPv4'|'IPv6'],
                                                         'network': <ip-prefix> },
                                                       ... ] },
  'ntp': { 'servers': [ <ip>, <ip>, ... ],
           'timezone': <timezone> },
  'port_groups': { <port-id>: <port-speed>,
                   ... },
  'root': { 'password': <passwd> },
  'router_id': <ip>,
  'rstp_priority': <int>,
  'servers': [<ip>],
  'snmp': { 'communities': {<community>: [<subnet>]},
            'trap_receivers': [<ip>] },
  'snmp-v3': { 'authentication-password': <passwd>,
               'privacy-password': <passwd>,
               'target-address': <ip>,
               'target-name': <text>,
               'user-name': <username> },
  'snmp_location': <text>,
  'syslog': { 'messages_ignore': [ <text>, <text>, <text>, ... ],
              'servers': [<ip>, <ip>] },
  'telemetry': {'target-address': <ip>},
  'transit_vrf': <vrf-name>,
  'users': { <username>: { 'class': 'super-user',
                     'ssh': 'ssh-rsa '
                            <key>
                            <description>,
                     'uid': <int>},
             ... },
  'vendor': <device-manufacturer>,
  'vendor_model': <device-model>,
  'vlans': [ {'name': <vlan-name>, 'tags': [], 'vid': <int>, 'vni': <int>}, ... ]
}

Your Institution Here

Your README

Look how cool you'll be.

Contributing

Use the handy link at the top-right to reach the Network Automation Forum's handyinfo repository (that's this site!)

Create a fork, clone your forked repository, add your awesome templates to this section, and then submit your pull request to be merged in. Learn more on how to contribute with our contributing guidelines and at our README.