Ubuntu 18.04: netplan support

Robert Markula robert at markula.org
Fri Oct 19 17:56:00 CEST 2018



Am 17.10.18 um 18:51 schrieb Thomas Lange:
>>>>>> On Wed, 17 Oct 2018 15:05:18 +0200, Robert Markula <robert at markula.org> said:
>     > Two questions arose so far:
>
>     > 1. Is the 'UBUNTU' class intended to be complementing the 'DEBIAN' class
>     > or does it completely replace the DEBIAN class?
> yes, it is complementing the Debian class.
>
>     > 2. Ubuntu 18.04 now uses a different network configuration utility
>     > called 'netplan' [1]. However, I don't see support for that in the
> Have a look at
> https://lists.uni-koeln.de/pipermail/linux-fai/2018-May/012019.html
> Derek already wrote some code to generate netplan configs.
>

Excellent link! I slightly modified Derek's script, so the full
scripts/DEBIAN/30-interface now looks like this. Successfully tested on
Ubuntu 14.04 Server, Ubuntu 18.04 Server and Debian 9.5 Server using
DHCP. Did not test static IPs and XORG (using NetworkManager) yet.

<snip>
#! /bin/bash

error=0; trap 'error=$(($?>$error?$?:$error))' ERR # save maximum error code

netplan_yaml() {
    # network configuration using ubuntu's netplan.io
    local IFNAME="$1"
    local METHOD="$2"
    echo     "Generating netplan configuration for $IFNAME ($METHOD)" >&2
    echo     "# generated by FAI"
    echo     "network:"
    echo     "  version: 2"
    echo     "  renderer: $RENDERER"
    case "$RENDERER" in
      networkd)
        echo     "  ethernets:"
        echo     "    $IFNAME:"
        case "$METHOD" in
          dhcp)
            echo "      dhcp4: true"
            ;;
          static)
            echo "      addresses: [$CIDR]"
            echo "      gateway4: $GATEWAYS_1"
            echo "      nameservers:"
            echo "        search: [$DOMAIN]"
            echo "        addresses: [${DNSSRVS// /, }]"
            ;;
        esac
    esac
}

iface_stanza() {
    # classic network configuration using /etc/network/interfaces
    local IFNAME="$1"
    local METHOD="$2"
    echo "Generating interface configuration for $IFNAME ($METHOD)" >&2
    echo "# generated by FAI"
    echo "auto $IFNAME"
    echo "iface $IFNAME inet $METHOD"
    case "$METHOD" in
      static)
        echo "    address $IPADDR"
        echo "    netmask $NETMASK"
        echo "    broadcast $BROADCAST"
        echo "    gateway $GATEWAYS"
        ;;
    esac
}

newnicnames() {
    # determine predictable network names only for stretch and above

    [ $do_init_tasks -eq 0 ] && return
    [ -z "$NIC1" ] && return
    ver=$($ROOTCMD dpkg-query --showformat='${Version}' --show udev)
    if dpkg --compare-versions $ver lt 220-7; then
    return
    fi


    fields="ID_NET_NAME_FROM_DATABASE ID_NET_NAME_ONBOARD
ID_NET_NAME_SLOT ID_NET_NAME_PATH"
    for field in $fields; do
    name=$(udevadm info /sys/class/net/$NIC1 | sed -rn "s/^E:
$field=(.+)/\1/p")
    if [[ $name ]]; then
        NIC1=$name
        break
    fi
    done
    if [[ ! $name ]]; then
    echo "$0: error: could not find systemd predictable network name.
Using $NIC1."
    fi
}

if [ -z "$NIC1" ]; then
    echo "ERROR: \$NIC1 is not defined. Cannot configure
/etc/network/interfaces properly."
fi
CIDR=$(ip -o -f inet addr show $NIC1 | awk '{print $4}')
newnicnames

case "$FAI_ACTION" in
  install|dirinstall)
    ifclass DHCPC && METHOD=dhcp || METHOD=static
    ifclass XORG && RENDERER=NetworkManager || RENDERER=networkd

    if [ -d $target/etc/netplan ]; then
        # Ubuntu >= 17.10 with netplan.io
        if [ -n "$NIC1" ]; then
            netplan_yaml $NIC1 $METHOD > $target/etc/netplan/01-${NIC1}.yaml
        fi
    elif [ -d $target/etc/network/interfaces.d ]; then
        # ifupdown >= 0.7.41 (Debian >= 8, Ubuntu >= 14.04)
        iface_stanza lo loopback > $target/etc/network/interfaces.d/lo
        if [ -n "$NIC1" ]; then
            iface_stanza $NIC1 $METHOD > \
                $target/etc/network/interfaces.d/$NIC1
        fi
    else
        (
            iface_stanza lo loopback
            iface_stanza $NIC1 $METHOD
        ) > $target/etc/network/interfaces
    fi

    if ! ifclass DHCPC ; then
        [ -n "$NETWORK" ] && echo "localnet $NETWORK" > $target/etc/networks
        if [ ! -L $target/etc/resolv.conf -a -e /etc/resolv.conf ]; then
            cp -p /etc/resolv.conf $target/etc
        fi
    fi
    ;;
esac

# here fcopy is mostly used, when installing a client for running in a
# different subnet than during the installation
fcopy -iM /etc/resolv.conf
fcopy -iM /etc/network/interfaces /etc/networks

exit $error
</snip>


More information about the linux-fai mailing list