Skip to content
Snippets Groups Projects
Commit 2dfcafa2 authored by Simone Spinelli's avatar Simone Spinelli
Browse files

Merge branch 'modifications_to_iptrunk_domain_model' into 'main'

Modifications to iptrunk domain model

See merge request !7
parents aaec5dee 425ee65c
No related branches found
No related tags found
1 merge request!7Modifications to iptrunk domain model
Showing
with 687 additions and 74 deletions
skip_list:
- 'name[template]' # Jinja templates should only be at the end of ‘name’.
- 'yaml[line-length]' # Line too long (162 > 160 characters)
- 'no-free-form' # Avoid using free-form when calling module actions. (ansible.builtin.set_fact)
- 'role-name[path]' # Avoid using paths when importing roles.
__pycache__/
# here we should put everything related with installing Ansible:
- pip dependencies
- ansible dependencies
- config files
### TODO
[defaults]
nocolor=true
#nocolor=true
host_key_checking=false
display_skipped_hosts = false
#stdout_callback = actionable
- name: Manage base config playbook
hosts: all
gather_facts: yes
gather_facts: false
remote_user: admin
vars_files:
- /opt/ansible_inventory/group_vars/junos/device_access.yaml
roles:
- Juniper.junos
- roles/base_config
tasks:
- name: Import routers variables
ansible.builtin.include_vars:
dir: /opt/ansible_inventory/group_vars/routers
all:
hosts:
rt2.hlv01.nl.geant.net:
rt2.pi01.it.geant.net:
- name: Manage base config playbook
hosts: staging_routers
- name: Manage iptrunks playbook
hosts: all
remote_user: admin
gather_facts: false
roles:
- Juniper.junos
- roles/iptrunks
tasks:
# - name: Import routers variables
# ansible.builtin.include_vars:
# dir: /opt/ansible_inventory/group_vars/routers
- name: Manage iptrunks checks playbook
hosts: all
remote_user: admin
vars_files:
- /opt/ansible_inventory/group_vars/junos/router_access.yaml
roles:
- Juniper.junos
- roles/iptrunks_checks
galaxy_info:
author: your name
description: your role description
company: your company (optional)
author: Simone Spinelli for GOAT
description: Geant Orchestration and Automation Team
company: geant
# If the issue tracker for your role is not on github, uncomment the
# next line and provide a value
......@@ -14,9 +14,9 @@ galaxy_info:
# - GPL-3.0-only
# - Apache-2.0
# - CC-BY-4.0
license: license (GPL-2.0-or-later, MIT, etc)
license: license BSD-3-Clause
min_ansible_version: 2.1
min_ansible_version: '2.10'
# If this a Container Enabled role, provide the minimum Ansible Container version.
# min_ansible_container_version:
......@@ -39,7 +39,8 @@ galaxy_info:
# - 7
# - 99.99
galaxy_tags: []
galaxy_tags:
- network
# List tags for your role here, one per line. A tag is a keyword that describes
# and categorizes the role. Users find roles by searching for tags. Be sure to
# remove the '[]' above, if you add tags to this list.
......@@ -48,5 +49,7 @@ galaxy_info:
# Maximum 20 tags per role.
dependencies: []
# - role: "Juniper.junos"
# List your role dependencies here, one per line. Be sure to remove the '[]' above,
# if you add dependencies to this list.
- name: Merge the variables
ansible.builtin.include_tasks: merge_variables.yaml
- name: Fix ISO_system_id for Nokia (step1)
ansible.builtin.set_fact:
lo_iso_address_as_a_list: "{{ wfo_router.router.router_lo_iso_address.split('.') }}"
- name: Fix ISO_system_id for Nokia (step2)
ansible.builtin.set_fact:
iso_system_id: "{{ lo_iso_address_as_a_list[3:6] | join('.') }}"
- name: Set ansible host to localhost to compile config when router is offline
ansible.builtin.set_fact:
ansible_host: "localhost"
ansible_connection: local
when:
( wfo_router.router.router_access_via_ts | ansible.builtin.bool ) is true
- name: Create a folder for all the things
ansible.builtin.file:
path: "/var/tmp/ansible_run_{{opid}}"
path: "/var/tmp/ansible_run_{{ opid }}"
state: directory
mode: '0755'
delegate_to: localhost
- name: Merge the variables
include_tasks: merge_variables.yaml
- name: Print the template in "/var/tmp/ansible_run_{{opid}}/{{mytemplates.template_name}}.conf"
template:
src: "{{ mytemplates.template_path }}"
dest: "/var/tmp/ansible_run_{{opid}}/{{mytemplates.template_name}}.conf"
lstrip_blocks: yes
trim_blocks: yes
- name: Print the template in "/var/tmp/ansible_run_{{ opid }}/base_config.conf"
ansible.builtin.template:
src: "routers/{{ wfo_router.router.router_vendor }}/base_config.j2"
dest: "/var/tmp/ansible_run_{{ opid }}/base_config.conf"
lstrip_blocks: true
trim_blocks: true
mode: '0755'
delegate_to: localhost
- name: Send message to syslog
syslogger:
msg: "[[{{opid}}]] {{mytemplates.template_name}} compiled"
log_pid: true
- name: Set back ansible_host to target terminal server
ansible.builtin.set_fact:
ansible_host: "{{ wfo_router.router.router_site.site_ts_address }}"
ansible_connection: netconf
when:
( wfo_router.router.router_access_via_ts | ansible.builtin.bool ) is true
- name: Send end of operation in syslog
syslogger:
msg: "[[{{opid}}]] deploy base config on {{inventory_hostname}} dry run"
log_pid: true
- name: Deploy base_config on "{{inventory_hostname}}" [CHECK ONLY]
- name: Deploy base_config on "{{ inventory_hostname }}" [CHECK ONLY][Juniper]
juniper_junos_config:
load: 'replace'
src: "/var/tmp/ansible_run_{{opid}}/{{mytemplates.template_name}}.conf"
src: "/var/tmp/ansible_run_{{ opid }}/{{ mytemplates.template_name }}.conf"
format: text
config_mode: "private"
check: yes
commit: no
check: true
commit: false
register: response
when: verb == "deploy" and dryrun == "True"
#- name: Show diff for dry run
# debug:
# msg: "{{ response }}"
# when: verb == "deploy" and dryrun == "True"
when: >
verb == "deploy" and
( dry_run | ansible.builtin.bool ) is true and
wfo_router.router.router_vendor == "juniper"
- name: Send end of operation in syslog
syslogger:
msg: "[[{{opid}}]] deploy base config on {{inventory_hostname}} for real "
log_pid: true
- name: Show diff for dry run
ansible.builtin.debug:
msg: "{{ response }}"
when: >
verb == "deploy" and
( dry_run | ansible.builtin.bool ) is true and
wfo_router.router.router_vendor == "juniper"
- name: Deploy base_config on "{{inventory_hostname}}" [AND COMMIT]
- name: Deploy base_config on "{{ inventory_hostname }}" [AND COMMIT][Juniper]
juniper_junos_config:
load: 'replace'
src: "/var/tmp/ansible_run_{{opid}}/{{mytemplates.template_name}}.conf"
src: "/var/tmp/ansible_run_{{ opid }}/{{ mytemplates.template_name }}.conf"
format: text
config_mode: "private"
comment: "{{ commit_comment }}"
register: response
when: verb == "deploy" and dryrun == "False"
when: >
verb == "deploy" and
( dry_run | ansible.builtin.bool ) is false and
wfo_router.router.router_vendor == "juniper"
- name: Show diff
debug:
ansible.builtin.debug:
msg: "{{ response }}"
when: verb == "deploy" and dryrun == "False"
when: >
verb == "deploy" and
( dry_run | ansible.builtin.bool ) is false and
wfo_router.router.router_vendor == "juniper"
- name: Deploy base_config on "{{ inventory_hostname }}" [CHECK ONLY][NOKIA]
ansible.netcommon.netconf_config:
format: xml
default_operation: merge
content: "{{ lookup('ansible.builtin.template', 'routers/{{ wfo_router.router.router_vendor }}/base_config.j2') }}"
commit: true
diff: true
check_mode: true
when: >
verb == "deploy" and
( dry_run | ansible.builtin.bool ) is true and
wfo_router.router.router_vendor == "nokia"
- name: Send end of operation in syslog
syslogger:
msg: "[[{{opid}}]] Ending operations "
log_pid: true
- name: Deploy base_config on "{{ inventory_hostname }}" [AND COMMIT][NOKIA]
ansible.netcommon.netconf_config:
format: xml
default_operation: merge
content: "{{ lookup('ansible.builtin.template', 'routers/{{ wfo_router.router.router_vendor }}/base_config.j2') }}"
commit: true
diff: true
check_mode: false
when: >
verb == "deploy" and
( dry_run | ansible.builtin.bool ) is false and
wfo_router.router.router_vendor == "nokia"
---
# tasks file for base_config
- name: Print the usage
debug:
msg:
- "Allowed verbs: 'compile' and 'deploy'. Use: -e 'verb=$verb'."
ansible.builtin.debug:
msg:
- "Allowed verbs: 'compile' and 'deploy'. Use: -e 'verb=$verb'."
when: (verb is not defined) or (verb not in verbs)
- meta: end_play
- name: Set ansible_host to terminal server when router is offline
ansible.legacy.set_fact:
ansible_host: "{{ wfo_router.router.router_site.site_ts_address }}"
ansible_port: "{{ wfo_router.router.router_ts_port }}"
when:
( wfo_router.router.router_access_via_ts | ansible.builtin.bool ) is true
- name: Set variable to connect to nokia
ansible.legacy.set_fact:
ansible_network_os: nokia.sros.md
ansible_connection: netconf
when:
wfo_router.router.router_vendor == "nokia"
- name: Set variables for connecting to Junos
ansible.legacy.set_fact:
ansible_network_os: junos
ansible_connection: netconf
when:
wfo_router.router.router_vendor == "juniper"
- name: Fail if arguments are missing
ansible.legacy.meta: end_play
when: (verb is not defined) or (verb not in verbs)
- name: Gather_facts
- name: Get the facts from Juniper router
junipernetworks.junos.junos_facts:
gather_subset: all
when:
wfo_router.router.router_vendor == "juniper"
- name: Import routers variables
ansible.builtin.include_vars:
dir: /opt/ansible_inventory/group_vars/routers
dir: /opt/ansible_inventory/group_vars/routers
- set_fact:
- name: Generate an ID for this run
ansible.legacy.set_fact:
opid: "{{ lookup('community.general.random_string', length=18, special=false) }}"
config_is_different: "False"
- name: Print the ID
debug:
msg: "{{opid}}"
ansible.builtin.debug:
msg: "{{ opid }}"
- include: compile_base_config.yaml
- name: Include always compiling phase
ansible.builtin.include_tasks: compile_base_config.yaml
when: verb in verbs
- include: deploy_base_config.yaml
- name: Include deploy if selected
ansible.builtin.include_tasks: deploy_base_config.yaml
when: verb == "deploy"
## This playbook is used to merge variables that are splitted in group and host vars.
# Currently, this is valid for:
## This playbook is used to merge variables that are splitted in group and host vars.
# Currently, this is valid for:
# system_login_users
# system_login_classes
# snmp_communities
#
# This playbook should be included in any other playbook that makes use of these variables.
# This playbook should be included in any other playbook that makes use of these variables.
#
- name: Merge system login user vars
merge_vars:
suffix_to_merge: users__to_merge
merged_var_name: system_login_users
expected_type: 'list'
- name: Merge system login classes vars
merge_vars:
suffix_to_merge: classes__to_merge
......
{% include 'class_of_service.j2' %}
{% include 'chassis.j2' %}
{# #}
{% include 'forwarding_options.j2' %}
{# #}
{% include 'firewall.j2' %}
{# #}
{% include 'groups.j2' %}
{# #}
{% include 'interfaces.j2' %}
{# #}
{% include 'policy_options.j2' %}
{# #}
{% include 'policy_statements.j2' %}
{# #}
{% include 'routing_options.j2' %}
{# #}
{% include 'services.j2' %}
{# #}
{% include 'snmp.j2' %}
{# #}
{% include 'protocols/protocols_global.j2' %}
{% include 'system/system_global.j2' %}
{% include 'routing_instances.j2' %}
replace: chassis {
dump-on-panic;
{% if ansible_net_has_2RE == true %}
redundancy {
routing-engine 0 master;
routing-engine 1 backup;
failover {
on-loss-of-keepalives;
on-disk-failure;
}
{% if chassis_graceful_switchover_inactive is sameas true%}
inactive: graceful-switchover;
{% else %}
graceful-switchover;
{% endif %}
}
{% endif %}
routing-engine {
disk {
smart-check;
}
}
aggregated-devices {
ethernet {
device-count {{ chassis_aggredated_ethernet_count }};
}
}
{% if ansible_net_has_2RE == true %}
{% if chassis_fabric_rm is defined %}
fabric {
redundancy-mode {
{{ chassis_fabric_rm }};
}
}
{% endif %}
{% endif %}
{% if chassis_fpcs is defined %}
{% for fpc in chassis_fpcs %}
fpc {{ fpc.fpc_id }} {
{% if ( fpc.power is defined ) and ( fpc.power == "off" ) %}
power off;
{% else %}
{% for pic in fpc.pics %}
pic {{ pic.pic_id }} {
{% if pic.pic_mode is defined %}
pic-mode {{ pic.pic_mode }};
{% endif %}
{% if pic.tunnel_services is defined %}
tunnel-services {
bandwidth {{ pic.tunnel_services }};
}
{% endif %}
{% if pic.inline_services is defined %}
inline-services {
bandwidth {{ pic.inline_services }};
}
{% endif %}
{% if pic.ports is defined %}
{% for port in pic.ports %}
port {{ port.id }} {
speed {{ port.speed }};
}
{% endfor %}
{% endif %}
}
{% endfor %}
sampling-instance ipfx;
inline-services flex-flow-sizing ;
{% endif %}
}
{% endfor %}
{% else %}
{% for net_module in ansible_net_modules %}
{% if 'FPC' in net_module.name %}
{% set fpc_name_as_list = net_module.name.split(" ") %}
fpc {{ fpc_name_as_list[1] }} {
{% if fpc_name_as_list[1] is sameas "0" %}
pic 0 {
tunnel-services {
bandwidth 10g;
}
inline-services {
bandwidth 10g;
}
}
{% endif %}
sampling-instance ipfx;
inline-services flex-flow-sizing ;
}
{% endif %}
{% endfor %}
{% endif %}
{% if chassis_enhanced_ip is sameas true %}
network-services enhanced-ip;
{% endif %}
}
replace: class-of-service {
{% if cos_classifiers is defined %}
classifiers {
{% for classifier in cos_classifiers %}
{{ classifier.type }} {{ classifier.name }} {
import {{ classifier.import }};
{% for forwarding_class in classifier.forwarding_classes %}
forwarding-class {{ forwarding_class.name}} {
loss-priority {{ forwarding_class.loss_priority }} code-points [{% for code_point in forwarding_class.code_points %} {{ code_point }} {% endfor %} ];
}
{% endfor %}
}
{% endfor %}
}
{% else %}
{{ raise('ERROR: YOU HAVE NO CLASSIFIERS DEFINED')}}
{%endif %}
{% if cos_drop_profiles is defined %}
drop-profiles {
{% for drop_profile in cos_drop_profiles %}
{{ drop_profile.name }} {
interpolate {
fill-level [{% for fill_level in drop_profile.fill_levels %} {{ fill_level }} {% endfor %} ];
drop-probability [{% for drop_probability in drop_profile.drop_probabilities %} {{ drop_probability }} {% endfor %} ];
}
}
{% endfor %}
}
{% else %}
{{ raise('ERROR: YOU HAVE NO DROP-PROFILES DEFINED')}}
{%endif %}
{% if cos_forwarding_classes is defined %}
forwarding-classes {
{% for fc in cos_forwarding_classes %}
class {{ fc.name }} queue-num {{ fc.queue_num }} priority {{ fc.priority }};
{% endfor %}
}
{% endif %}
{% if cos_interfaces is defined %}
interfaces {
{% for interface in cos_interfaces %}
{{ interface.regex }} {
{% if interface.scheduler_map is defined %}
scheduler-map {{ interface.scheduler_map}};
{% endif %}
unit * {
classifiers {
{% for classifier in interface.classifiers %}
{{ classifier.type }} {{ classifier.name }} ;
{% endfor %}
}
{% if interface.rewrite_rules is defined %}
rewrite-rules {
{% for rr in interface.rewrite_rules %}
{{ rr.type }} {{ rr.name }} protocol {{ rr.protocol}};
{% endfor %}
}
{% endif %}
}
}
{% endfor %}
}
{% else %}
{{ raise('ERROR: YOU HAVE NO INTERFACES DEFINED')}}
{% endif %}
{% if cos_rewrite_rules is defined %}
{% for rewrite_rule in cos_rewrite_rules %}
rewrite-rules {
{{ rewrite_rule.type }} {{ rewrite_rule.name }} {
import {{ rewrite_rule.import }}
{% if rewrite_rule.forwarding_classes is defined %}
{% for fc in rewrite_rule.forwarding_classes %}
forwarding-class {{ fc.name }} {
{% if fc.loss_priorities is defined %}
{% for lp in fc.loss_priorities %}
loss-priority {{ lp.type }} code-point {{ lp.code_point }};
{% endfor %}
{% endif %}
}
{% endfor %}
{% endif %}
}
}
{% endfor %}
{% endif %}
{% if cos_scheduler_maps is defined %}
scheduler-maps {
{% for scheduler_map in cos_scheduler_maps %}
{{ scheduler_map.name }} {
{% for mapping in scheduler_map.mappings %}
forwarding-class {{ mapping.class }} scheduler {{ mapping.scheduler }} ;
{% endfor %}
}
{% endfor %}
}
{% else %}
{{ raise('ERROR: YOU HAVE NO SCHEDULER-MAP DEFINED')}}
{% endif %}
{% if cos_schedulers is defined %}
schedulers {
{% for scheduler in cos_schedulers %}
{{ scheduler.name }} {
{% if scheduler.transmit_rate.unit == "remainder" %}
transmit-rate {
remainder;
}
{% elif scheduler.transmit_rate.unit == "percent" %}
transmit-rate percent {{ scheduler.transmit_rate.value }};
{% elif scheduler.transmit_rate.unit == "rate" %}
transmit-rate {{ scheduler.transmit_rate.value }};
{% else %}
{{ raise('ERROR: SCHEDULER TRANSMIT-RATE scheduler.transmit_rate.value NOT VALID')}}
{% endif %}
{% if ((scheduler.buffer_size.unit == "remainder") or (scheduler.buffer_size.unit == "shared")) %}
buffer-size {
{{ scheduler.buffer_size.unit }};
}
{% elif ((scheduler.buffer_size.unit == "percent") or (scheduler.buffer_size.unit == "temporal")) %}
buffer-size {{ scheduler.buffer_size.unit }} {{ scheduler.buffer_size.value }};
{% else %}
{{ raise('ERROR: SCHEDULER TRANSMIT-RATE scheduler.buffer_size.value NOT VALID')}}
{% endif %}
priority {{ scheduler.priority }};
{% if scheduler.drop_profile_map is defined %}
drop-profile-map loss-priority {{ scheduler.drop_profile_map.loss_priority }} protocol {{ scheduler.drop_profile_map.protocol }} drop-profile {{ scheduler.drop_profile_map.drop_profile }};
{% endif %}
}
{% endfor %}
}
{% else %}
{{ raise('ERROR: YOU HAVE NO SCHEDULER DEFINED')}}
{% endif %}
}
{##}
{#We should validate, but raise does not work :-( #}
{% set supported_from = [ 'destination-address','destination-port','icmp-type','port','prefix-list','protocol','source-address','source-prefix-list','tcp-established' ] %}
{% set supported_then = [ 'accept','policer','discard','reject' ] %}
{##}
firewall {
{% for family, filters in firewall.items() %}
{% if family != "policer" %}
family {{ family }} {
{% for filter, filter_data in filters.items() %}
replace: filter {{ filter }} {
{% if filter_data.options is defined %}
{{ filter_data.options }};
{% endif %}
{% for term in filter_data.terms %}
term {{ term.name }} {
{% if term.from is defined %}
from {
{% for from, from_data in term.from.items() %}
{# Stuff that goes in line: like ports, protocols and similar#}
{% if "tcp-established" in from %}
tcp-established;
{% elif ("port" in from) or ("protocol" in from) or ("icmp-type" in from) or ("next-header" in from) or ("hop-limit" in from)%}
{% if (from_data is iterable) and (from_data is not string) %}
{{ from }} [ {% for from_data_element in from_data %}{{ from_data_element }} {% endfor %} ];
{% else %}
{{ from }} {{ from_data }};
{% endif %}
{# Stuff that goes in a list: like addresses, prefix lists etc... #}
{% else %}
{{ from }} {
{% for from_data_element in from_data %}
{{ from_data_element }};
{% endfor %}
}
{% endif %}
{% endfor %}
}
{% endif %}
then {
{% if (term.then is iterable) and (term.then is not string) %}
{% for then_action in term.then %}
{% if then_action is not string %}
{% for action, destination in then_action.items() %}
{{ action }} {{ destination}};
{% endfor %}
{% else %}
{{ then_action }};
{% endif %}
{% endfor %}
{% else %}
{{ term.then }};
{% endif %}
}
}
{% endfor %}
}
{% endfor %}
}
{% else %}
{% for filter, filter_data in filters.items() %}
replace: policer {{ filter }} {
{% if filter_data.options is defined %}
{{ filter_data.options }};
{% endif %}
if-exceeding {
bandwidth-limit {{ filter_data.bandwidth_limit }};
burst-size-limit {{ filter_data.burst_size_limit }};
}
then discard;
}
{% endfor %}
{% endif %}
{% endfor %}
}
replace: forwarding-options {
sampling {
instance {
ipfx {
input {
rate 300;
}
{% for family in forwarding_options_families %}
family {{family.name}} {
output {
{% for server in forwarding_options_flow_servers %}
flow-server {{ server.address }} {
port {{ server.port}};
version-ipfix {
template {
{{family.template}};
}
}
}
{% endfor %}
inline-jflow {
source-address {{ forwarding_options_inline_jflow.source_address }}
flow-export-rate {{ forwarding_options_inline_jflow.flow_export_rate }}
}
}
}
{% endfor %}
}
}
}
enhanced-hash-key {
family mpls {
ether-pseudowire zero-control-word;
}
}
no-hyper-mode;
}
{% set hostname_as_a_list= inventory_hostname.split('.')%}
{% set short_hostname= hostname_as_a_list[:3] | join('.')%}
replace: groups {
NO_TRAPS {
interfaces {
<*> {
unit <*> {
no-traps;
}
}
}
}
{% if ansible_net_has_2RE == true %}
re0 {
system {
host-name {{ short_hostname }}.re0;
}
interfaces {
fxp0 {
description "PHY INFRASTRUCTURE MANAGEMENT | re0";
speed 1g;
link-mode full-duplex;
unit 0 {
family inet {
address {{re0_fxp_ipv4address| default('172.16.254.3')}}/24;
}
}
}
}
}
re1 {
system {
host-name {{ short_hostname }}.re1;
}
interfaces {
fxp0 {
description "PHY INFRASTRUCTURE MANAGEMENT | re1";
speed 1g;
link-mode full-duplex;
unit 0 {
family inet {
address {{re1_fxp_ipv4address| default('172.16.254.4')}}/24;
}
}
}
}
}
{%endif%}
load-balance-adaptive {
interfaces {
<ae*> {
aggregated-ether-options {
load-balance {
adaptive;
}
}
}
}
}
}
{% if ansible_net_has_2RE == true %}
system {
replace: apply-groups [ re0 re1 ];
}
interfaces {
replace: apply-groups [ re0 re1 load-balance-adaptive ];
}
replace: apply-groups [ re0 re1 ];
{%else%}
interfaces {
replace: apply-groups [ load-balance-adaptive ];
}
{%endif%}
interfaces {
replace: lo0 {
unit 0 {
family inet {
filter {
input ROUTER_access;
}
address {{lo_ipv4_address}}/32;
}
family iso {
address {{ lo_iso_address }};
}
family inet6 {
filter {
input ROUTER_access_V6;
}
address {{lo_ipv6_address}}/128;
}
}
}
replace: dsc {
unit 0 {
description "PHY INFRASTRUCTURE DISCARD | required for Multicast monitoring";
family inet {
address 192.0.2.112/32;
}
}
}
lt-0/0/0 {
replace: unit 16 {
description "SRV_GLOBAL INFRASTRUCTURE ACCESS IAS SRF0000001 | BGP Peering - RE Side";
encapsulation ethernet;
peer-unit 61;
family inet {
filter {
input bone-in;
output bone-out;
}
address {{ lt_ipv4_network | ipaddr('net') | ipaddr('address')}}/31;
}
family inet6 {
filter {
input bone6-in;
output bone6-out;
}
address {{ lt_ipv6_network | ipaddr('net') | ipaddr('1') | ipaddr('address')}}/126;
}
}
replace: unit 61 {
description "SRV_IAS INFRASTRUCTURE ACCESS GLOBAL SRF0000001 | BGP Peering - IAS Side";
encapsulation ethernet;
peer-unit 16;
family inet {
address {{ lt_ipv4_network | ipaddr('net') | ipaddr('1') | ipaddr('address')}}/31;
}
family inet6 {
address {{ lt_ipv6_network | ipaddr('net') | ipaddr('2') | ipaddr('address')}}/126;
}
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment