#jinja2: trim_blocks: True, lstrip_blocks: True {########################################## Purpose: Configure BGP commands for os9 Devices os9_bgp: asn: 12 router_id: maxpath_ibgp: 2 maxpath_ebgp: 2 best_path: as_path: ignore as_path_state: present ignore_router_id: true med: - attribute: confed state: present ipv4_network: - address: 101.1.1.0/30 state: present ipv6_network: - address: "2001:4898:5808:ffa0::/126" state: present neighbor: - type: ipv4 remote_asn: 11 ip: 192.168.11.1 admin: up sender_loop_detect: false src_loopback: 0 src_loopback_state: present ebgp_multihop: 255 distribute_list: in: aa in_state: present out: aa out_state: present state: present - type: ipv6 remote_asn: 14 ip: 2001:4898:5808:ffa2::1 sender_loop_detect: false src_loopback: 0 src_loopback_state: present state: present - type: peer_group name: peer1 remote_asn: 6 subnet: 10.128.3.192/27 subnet_state: present admin: up default_originate: true sender_loop_detect: false src_loopback: 1 src_loopback_state: present ebgp_multihop: 255 state: present redistribute: - route_type: static state: present state: present ################################} {% if os9_bgp is defined and os9_bgp%} {% set bgp_vars = os9_bgp %} {% if bgp_vars.asn is defined and bgp_vars.asn %} {% if bgp_vars.state is defined and bgp_vars.state == "absent" %} no router bgp {{ bgp_vars.asn }} {% else %} {# Add Feature to the switch #} router bgp {{ bgp_vars.asn }} {% if bgp_vars.router_id is defined %} {% if bgp_vars.router_id %} bgp router-id {{ bgp_vars.router_id }} {% else %} no bgp router-id {% endif %} {% endif %} {% if bgp_vars.maxpath_ebgp is defined %} {% if bgp_vars.maxpath_ebgp %} maximum-paths ebgp {{ bgp_vars.maxpath_ebgp }} {% else %} no maximum-paths ebgp {% endif %} {% endif %} {% if bgp_vars.maxpath_ibgp is defined %} {% if bgp_vars.maxpath_ibgp %} maximum-paths ibgp {{ bgp_vars.maxpath_ibgp }} {% else %} no maximum-paths ibgp {% endif %} {% endif %} {% if bgp_vars.graceful_restart is defined and bgp_vars.graceful_restart %} {% if bgp_vars.graceful_restart.state is defined and bgp_vars.graceful_restart.state == "present" %} bgp graceful-restart {% else %} no bgp graceful-restart {% endif %} {% endif %} {% if bgp_vars.best_path is defined and bgp_vars.best_path %} {% if bgp_vars.best_path.as_path is defined and bgp_vars.best_path.as_path %} {% if bgp_vars.best_path.as_path_state is defined and bgp_vars.best_path.as_path_state == "absent" %} no bgp bestpath as-path {{ bgp_vars.best_path.as_path }} {% else %} bgp bestpath as-path {{ bgp_vars.best_path.as_path }} {% endif %} {% endif %} {% if bgp_vars.best_path.ignore_router_id is defined %} {% if bgp_vars.best_path.ignore_router_id %} bgp bestpath router-id ignore {% else %} no bgp bestpath router-id ignore {% endif %} {% endif %} {% if bgp_vars.best_path.med is defined and bgp_vars.best_path.med %} {% for med in bgp_vars.best_path.med %} {% if med.attribute is defined and med.attribute %} {% if med.state is defined and med.state == "absent" %} no bgp bestpath med {{ med.attribute }} {% else %} bgp bestpath med {{ med.attribute }} {% endif %} {% endif %} {% endfor %} {% endif %} {% endif %} {% if bgp_vars.ipv4_network is defined and bgp_vars.ipv4_network %} {% for net in bgp_vars.ipv4_network %} {# remove BGP network announcement #} {% if net.address is defined and net.address %} {% if net.state is defined and net.state == "absent" %} no network {{ net.address }} {# Add BGP network announcement #} {% else %} network {{ net.address }} {% endif %} {% endif %} {% endfor %} {% endif %} {% if bgp_vars.ipv6_network is defined and bgp_vars.ipv6_network %} address-family ipv6 unicast {% for net in bgp_vars.ipv6_network %} {% if net.address is defined and net.address %} {% if net.state is defined and net.state == "absent" %} no network {{ net.address }} {% else %} network {{ net.address }} {% endif %} {% endif %} {% endfor %} exit-address-family {% endif %} {% if bgp_vars.neighbor is defined and bgp_vars.neighbor %} {% for neighbor in bgp_vars.neighbor %} {% if neighbor.type is defined %} {% if neighbor.type == "ipv4" or neighbor.type =="ipv6" %} {% if neighbor.ip is defined and neighbor.ip %} {% set tag_or_ip = neighbor.ip %} {% if neighbor.remote_asn is defined and neighbor.remote_asn %} {% if neighbor.state is defined and neighbor.state == "absent" %} no neighbor {{ tag_or_ip }} remote-as {{ neighbor.remote_asn }} {% if neighbor.peergroup is defined and neighbor.peergroup %} {% if neighbor.peergroup_state is defined and neighbor.peergroup_state == "absent" %} no neighbor {{ tag_or_ip }} peer-group {{ neighbor.peergroup }} {% endif %} {% endif %} {% if neighbor.type == "ipv6" %} address-family ipv6 unicast no neighbor {{ tag_or_ip }} activate exit-address-family {% endif %} {% else %} neighbor {{ tag_or_ip }} remote-as {{ neighbor.remote_asn }} {% if neighbor.peergroup is defined and neighbor.peergroup %} {% if neighbor.peergroup_state is defined and neighbor.peergroup_state == "absent" %} no neighbor {{ tag_or_ip }} peer-group {{ neighbor.peergroup }} {% else %} neighbor {{ tag_or_ip }} peer-group {{ neighbor.peergroup }} {% endif %} {% endif %} {% if neighbor.type == "ipv6" %} address-family ipv6 unicast neighbor {{ tag_or_ip }} activate exit-address-family {% endif %} {% endif %} {% endif %} {% endif %} {% elif neighbor.type == "peergroup" %} {% if neighbor.name is defined and neighbor.name %} {% set tag_or_ip = neighbor.name %} {% if neighbor.state is defined and neighbor.state == "absent" %} no neighbor {{ tag_or_ip }} peer-group {% else %} {% if neighbor.passive is defined and neighbor.passive %} neighbor {{ tag_or_ip }} peer-group passive {% if neighbor.subnet is defined and neighbor.subnet %} {% if neighbor.subnet_state is defined and neighbor.subnet_state == "absent" %} no neighbor {{ tag_or_ip }} subnet {{ neighbor.subnet }} {% else %} neighbor {{ tag_or_ip }} subnet {{ neighbor.subnet }} {% endif %} {% endif %} {% else %} neighbor {{ tag_or_ip }} peer-group {% endif %} {% if neighbor.remote_asn is defined and neighbor.remote_asn %} {% if neighbor.remote_asn_state is defined and neighbor.remote_asn_state == "absent" %} no neighbor {{ tag_or_ip }} remote-as {{ neighbor.remote_asn }} {% else %} neighbor {{ tag_or_ip }} remote-as {{ neighbor.remote_asn }} {% endif %} {% endif %} {% endif %} {% endif %} {% endif %} {% if tag_or_ip is defined and tag_or_ip %} {% if (neighbor.state is not defined) or (neighbor.state is defined and not neighbor.state == "absent") %} {% if neighbor.timer is defined %} {% if neighbor.timer %} neighbor {{ tag_or_ip }} timers {{ neighbor.timer }} {% else %} no neighbor {{ tag_or_ip }} timers {% endif %} {% endif %} {% if neighbor.default_originate is defined %} {% if neighbor.default_originate %} neighbor {{ tag_or_ip }} default-originate {% else %} no neighbor {{ tag_or_ip }} default-originate {% endif %} {% endif %} {% if neighbor.sender_loop_detect is defined %} {% if neighbor.sender_loop_detect %} neighbor {{ tag_or_ip }} sender-side-loop-detection {% else %} no neighbor {{ tag_or_ip }} sender-side-loop-detection {% endif %} {% endif %} {% if neighbor.src_loopback is defined and neighbor.src_loopback|int(-1) != -1 %} {% if neighbor.src_loopback_state is defined and neighbor.src_loopback_state == "absent" %} no neighbor {{ tag_or_ip }} update-source Loopback {{neighbor.src_loopback }} {% else %} neighbor {{ tag_or_ip }} update-source Loopback {{ neighbor.src_loopback }} {% endif %} {% endif %} {% if neighbor.ebgp_multihop is defined %} {% if neighbor.ebgp_multihop %} neighbor {{ tag_or_ip }} ebgp-multihop {{ neighbor.ebgp_multihop }} {% else %} no neighbor {{ tag_or_ip }} ebgp-multihop {% endif %} {% endif %} {% if neighbor.distribute_list is defined and neighbor.distribute_list %} {% if neighbor.distribute_list.in is defined and neighbor.distribute_list.in %} {% if neighbor.distribute_list.in_state is defined and neighbor.distribute_list.in_state == "absent" %} no neighbor {{ tag_or_ip }} distribute-list {{ neighbor.distribute_list.in }} in {% else %} neighbor {{ tag_or_ip }} distribute-list {{ neighbor.distribute_list.in }} in {% endif %} {% endif %} {% if neighbor.distribute_list.out is defined and neighbor.distribute_list.out %} {% if neighbor.distribute_list.out_state is defined and neighbor.distribute_list.out_state == "absent" %} no neighbor {{ tag_or_ip }} distribute-list {{ neighbor.distribute_list.out }} out {% else %} neighbor {{ tag_or_ip }} distribute-list {{ neighbor.distribute_list.out }} out {% endif %} {% endif %} {% endif %} {% if neighbor.admin is defined and (neighbor.admin == "up" or neighbor.admin == "present") %} neighbor {{ tag_or_ip }} no shutdown {% else %} neighbor {{ tag_or_ip }} shutdown {% endif %} {% if neighbor.adv_interval is defined %} {% if neighbor.adv_interval %} neighbor {{ tag_or_ip }} advertisement-interval {{ neighbor.adv_interval }} {% else %} no neighbor {{ tag_or_ip }} advertisement-interval {% endif %} {% endif %} {% if neighbor.fall_over is defined and neighbor.fall_over == "present" %} neighbor {{ tag_or_ip }} fall-over {% elif neighbor.fall_over is defined and neighbor.fall_over == "absent" %} no neighbor {{ tag_or_ip }} fall-over {% endif %} {% endif %} {% endif %} {% endif %} {% endfor %} {% endif %} {% if bgp_vars.redistribute is defined and bgp_vars.redistribute %} {% for route in bgp_vars.redistribute %} {% if route.route_type is defined and route.route_type %} {% if route.address_type is defined and route.address_type %} {% if route.address_type == "ipv6" %} address-family {{ route.address_type }} unicast {% if route.state is defined and route.state == "absent" %} no redistribute {{ route.route_type }} {% else %} {% if route.route_map is defined %} {% if route.route_map == "present" %} {% if route.route_map_name is defined and route.route_map_name %} redistribute {{ route.route_type }} route-map {{ route.route_map_name }} {% else %} redistribute {{ route.route_type }} {% endif %} {% else %} {% if route.route_map_name is defined and route.route_map_name %} no redistribute {{ route.route_type }} route-map {{ route.route_map_name }} {% endif %} {% endif %} {% else %} redistribute {{ route.route_type }} {% endif %} {% endif %} exit-address-family {% else %} {% if route.state is defined and route.state == "absent" %} no redistribute {{ route.route_type }} {% else %} {% if route.route_map is defined %} {% if route.route_map == "present" %} {% if route.route_map_name is defined and route.route_map_name %} redistribute {{ route.route_type }} route-map {{ route.route_map_name }} {% else %} redistribute {{ route.route_type }} {% endif %} {% else %} {% if route.route_map_name is defined and route.route_map_name %} no redistribute {{ route.route_type }} route-map {{ route.route_map_name }} {% endif %} {% endif %} redistribute {{ route.route_type }} {% endif %} {% endif %} {% endif %} {% endif %} {% endif %} {% endfor %} {% endif %} {% endif %} {% endif %} {% endif %}