hobarton_config_templates/juniper-macros.j2

289 lines
8.2 KiB
Django/Jinja

{% macro systemsection(device) %}
system {
host-name {{ device['name'] }};
root-authentication {
encrypted-password "{{ device['config_context']['root_pw'] }}"; ## Client Higher
}
login {
class sysadmin {
permissions [ admin clear configure control firewall-control interface interface-control network reset rollback routing routing-control snmp snmp-control trace-control view view-configuration ];
}
{% for user, details in device['config_context']['users'].items() %}
user {{ user }} {
uid 200{{ loop.index }};
class {{ details['role'] }};
authentication {
encrypted-password "{{ details['password'] }}"; ## SECRET-DATA
}
}
{% endfor %}
}
services {
ssh;
}
syslog {
{% for server in device['config_context']['syslog_servers'] %}
host {{ server }} {
any notice;
authorization info;
}
{% endfor %}
file interactive-commands {
interactive-commands any;
}
file messages {
any notice;
authorization info;
}
}
{% if device['config_context']['ntp_servers']|length > 0 %}
ntp {
{% for server in device['config_context']['ntp_servers'] %}
server {{ server }};
{% endfor %}
}
{% endif %}
}
{%- endmacro %}
{% macro chassissection(device) %}
chassis {
aggregated-devices {
ethernet {
device-count {{ device['interfaces']|selectattr('type','eq','LAG')|list|count }};
}
}
{% if device['config_context']['breakout_ports'] %}
{% for fpc, fpcdata in device['config_context']['breakout_ports'].items() %}
fpc {{ fpc }} {
{% for pic, picdata in fpcdata.items() %}
pic {{ pic }} {
{% for port, speed in picdata.items() %}
port {{ port }} {
channel-speed {{ speed }};
}
{% endfor %}
}
{% endfor %}
}
{% endfor %}
{% endif %}
}
{%- endmacro %}
{% macro interfaceconfig(interface,rack = None) %}
{{ interface['name'] }} {
{% if interface.get('description') != '' %}
description "{{ interface['description'] }}";
{% endif %}
{% if interface.get('mtu') and not interface.get('lag') %}
mtu {{ interface['mtu'] }};
{% endif %}
{% if interface.get('lag') %}
ether-options {
802.3ad {{ interface['lag']['name'] }};
}
{% endif %}
{% if interface['name'].startswith('ae') %}
{% if interface['_custom_field_data']['esi_lag'] %}
esi {
auto-derive {
lacp;
}
all-active;
}
{% endif %}
aggregated-ether-options {
lacp {
periodic fast;
{% if interface['_custom_field_data']['system_id'] %}
system-id {{ interface['_custom_field_data']['system_id'] }};
{% elif interface['_custom_field_data']['esi_lag'] %}
system-id 00:00:{{ '%02d' % rack|int }}:{% if interface['name'][2:]|int < 99 %}{{ '%02d' % interface['name'][2:]|int }}{% else %}{{ '%02x' % interface['name'][2:]|int }}{% endif %}:00:01;
{% endif %}
}
}
{% endif %}
{% if interface['ip_addresses']|length > 0 %}
unit 0 {
family inet {
address {{ interface['ip_addresses'][0]['address'] }};
}
}
{% endif %}
{% if interface.get('mode') is not none %}
unit 0 {
family ethernet-switching {
{% if interface['mode']=='ACCESS' %}
interface-mode access;
vlan {
members {{ interface['untagged_vlan']['vid'] }};
}
{% elif interface['mode']=='TAGGED' %}
interface-mode trunk;
vlan {
members [ {% for vlan in interface['tagged_vlans'] %}{{ vlan['vid'] }} {% endfor %}];
}
{% endif %}
storm-control default;
}
}
{% endif %}
}
{%- endmacro %}
{% macro interfacesection(device,vlans) %}
interfaces {
{% for interface in device['interfaces'] if interface['name'].startswith('xe-') or interface['name'].startswith('et-') %}
{{ interfaceconfig(interface) }}
{% endfor %}
{% for interface in device['interfaces'] if interface['name'].startswith('ae') %}
{{ interfaceconfig(interface,device['rack']['name'][5:]) }}
{% endfor %}
{% for interface in device['interfaces'] if interface['name']=='em0' %}
{{ interfaceconfig(interface) }}
{% endfor %}
{% for interface in device['interfaces'] if interface['name'].startswith('irb') %}
{% if loop.first %}
irb {
{% endif %}
unit {{ interface['name'][4:] }} {
description "{{ interface['description'] }}";
family inet {
address {{ interface['ip_addresses'][0]['address'] }};
}
}
{% if loop.last %}
}
{% endif %}
{% endfor %}
{% for interface in device['interfaces'] if interface['name'].startswith('lo') %}
{{ interfaceconfig(interface) }}
{% endfor %}
}
{%- endmacro %}
{% macro routingoptionssection(primary_ip4, config_context) %}
routing-options {
router-id {{ primary_ip4['address'][:-3] }};
autonomous-system {{ config_context['overlay_as'] }};
forwarding-table {
export PFE-ECMP;
chained-composite-next-hop {
ingress {
evpn;
}
}
}
}
{%- endmacro %}
{% macro bgprrmeshgroup(device,spines) %}
group OVERLAY_RR_MESH {
type internal;
family evpn {
signaling;
}
bfd-liveness-detection {
minimum-interval 350;
multiplier 3;
session-mode automatic;
}
{% for dst_switch in spines if dst_switch['primary_ip4']['address'] != device['primary_ip4']['address'] %}
neighbor {{ dst_switch['primary_ip4']['address'][:-3] }};
{% endfor %}
}
{%- endmacro %}
{% macro bgpoverlaygroup(device) %}
group OVERLAY {
type internal;
local-address {{ device['primary_ip4']['address'][:-3] }};
family evpn {
signaling;
}
{% if device['device_role']['name'] == 'Spine' %}
cluster {{ device['primary_ip4']['address'][:-3] }};
multipath;
{% endif %}
bfd-liveness-detection {
minimum-interval 350;
multiplier 3;
session-mode automatic;
}
{% for dst_switch in device['peering_interfaces'] %}
neighbor {{ dst_switch['cable_peer_interface']['device']['primary_ip4']['address'][:-3] }};
{% endfor %}
}
{%- endmacro %}
{% macro bgpunderlaygroup(device) %}
group UNDERLAY {
type external;
hold-time 10;
family inet {
unicast;
}
export BGP_LOOPBACK0;
local-as {{ device['config_context']['underlay_as'] }};
multipath {
multiple-as;
}
{% for dst_switch in device['peering_interfaces'] %}
neighbor {{ dst_switch['cable_peer_interface']['ip_addresses'][0]['address'][:-3] }} {
peer-as {{ dst_switch['cable_peer_interface']['device']['local_context_data']['underlay_as'] }};
}
{% endfor %}
}
{%- endmacro %}
{% macro bgpsection(device,spines) %}
{% if device['device_role']['name'] in ['Spine','Lab-Spine'] %}
{% set role='Spine' %}
{% set other_role='Leaf' %}
{% else %}
{% set role='Leaf' %}
{% set other_role='Spine' %}
{% endif %}
{% if device['device_role']['name'] == 'Lab-Spine' %}
{% set name=device['name'][4:] %}
{% else %}
{% set name=device['name'] %}
{% endif %}
bgp {
{{ bgpoverlaygroup(device) }}
{% if role == 'Spine' %}
{{ bgprrmeshgroup(device,spines) }}
{% endif %}
{{ bgpunderlaygroup(device) }}
}
{%- endmacro %}
{% macro vlanssection(vlans,device) %}
vlans {
{% for vlan in vlans %}
vl{{ vlan['vid'] }} {
vlan-id {{ vlan['vid'] }};
{% if vlan['name'] != '' %}
description "{{ vlan['name'] }}";
{% endif %}
{% if device['interfaces']|selectattr('name', 'equalto', 'irb.'+vlan['vid']|string)|list|count %}
l3-interface irb.{{vlan['vid']}};
{% endif %}
vxlan {
vni {{ vlan['vid'] }};
}
}
{% endfor %}
}
{%- endmacro %}