{# Loopback interface must be present so create it here if none is defined in inventory. #} {% if not interfaces | selectattr("name", "==", "lo") %} auto lo iface lo {% endif -%} {# Define VRFs. #} {% for vrf in interfaces | selectattr("vrf") | map(attribute="vrf.name") %} auto {{ vrf }} iface {{ vrf }} pre-up ip link add $IFACE type vrf table {{ 100 + loop.index }} up ip link set dev $IFACE up post-down ip link del $IFACE {% endfor -%} {# Skip disabled and OOB management interfaces. #} {# For VMs we have to set the attribute manually (to false) so rejectattr works. #} {% for iface in interfaces | defaultattr('mgmt_only') | rejectattr('mgmt_only') | selectattr('enabled') %} auto {{ iface.name }} iface {{ iface.name }} {% if iface.vrf %} requires {{ iface.vrf.name }} pre-up ip link set $IFACE master {{ iface.vrf.name }} {% endif %} {% if iface.mtu %} mtu {{ iface.mtu }} {% endif %} {% for address in iface.ip_addresses %} address {{ address.address }} {% if address.family.value == 4 %} {% set subnet = address.address | ipaddr('subnet') %} {% set prefix = prefixes | selectattr('prefix', '==', subnet) | first %} {% set gateway = prefix.custom_fields.gateway.address %} {% if gateway is defined and gateway != address.address %} {% if iface.vrf %} up ip route add default via {{ gateway | ipaddr('address') }} {% if iface.vrf.name %}vrf {{ iface.vrf.name }}{% endif +%} {% else %} gateway {{ gateway | ipaddr('address') }} {% endif %} {% endif %} {% endif %} {% endfor -%} {# disable SLAAC if we have a manually set IPv6 address #} {% if iface.ip_addresses | selectattr("family.value", "==", 6) and iface.name != "lo" %} pre-up echo 0 > /proc/sys/net/ipv6/conf/$IFACE/autoconf {% endif %} {% endfor -%} source-directory /etc/network/interfaces.d