31

I've installed Ubuntu Server 18.04, and instead of the old /etc/network/interfaces, it seems that my network configuration now lives in a series of YAML files in /etc/netplan, of which the only one I actually have is /etc/netplan/50-cloud-init.yaml:

# This file is generated from information provided by
# the datasource.  Changes to it will not persist across an instance.
# To disable cloud-init's network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
    ethernets:
        ens3:
            addresses: []
            dhcp4: true
            dhcp6: true
            nameservers: {}
            optional: true
        ens4:
            addresses: []
            dhcp4: true
            dhcp6: true
            nameservers: {}
            optional: true
    version: 2

That seems to have been generated by cloud-init, from /etc/cloud/cloud.cfg.d/50-curtin-networking.cfg:

network:
  ethernets:
    ens3:
      addresses: []
      dhcp4: true
      dhcp6: true
      nameservers: {}
      optional: true
    ens4:
      addresses: []
      dhcp4: true
      dhcp6: true
      nameservers: {}
      optional: true
  version: 2

What's the right way to edit this configuration and apply the changes to the running machine? The comment in the Netplan file suggested to me that it's ephemeral and generated on reboot by cloud-init, so I should edit cloud-init's config. But even after editing it and rebooting, I don't see any changes to the Netplan file, and I definitely don't know how to apply the cloud-init config changes manually. And upon reading the comment again, now it seems to me that it's talking about changes not persisting across destruction and recreation of the machine, which would seem to go without saying. So clearly I'm misunderstanding something.

So my question is:

  1. Where in the new cloud-init/netplan system am I supposed to be putting manual network configuration?

  2. How do I apply changes I make in /etc/netplan?

  3. How do I apply changes I make in /etc/cloud/cloud.cfg.d?

interfect
  • 662

3 Answers3

15

It seems the trick to getting the yaml to generate from the cfg is...

cloud-init clean -r

Next problem is how to get that cfg set from the seed.iso or nocloud-net meta-data

the r flag is the same as any reboot shutdown -r now

If you run cloud-init init (without rebooting) there is not visible change to /etc/netplan/50-cloud-init.yaml

So still not clear on how to trigger that without the reboot? I've tried cloud-init init and then systemctl restart cloud-init

I have also tried cloud-init -d modules --mode config and cloud-init -d modules --mode final

Okay wait I think I found it...

systemctl restart cloud-init-local.service

it seems to rebuild the netplan yaml from the cloud cfg after you cloud-init clean running cloud-init init does not do it. [Ubuntu 19.04 cloud-init 19]

[too many moving parts in this design]

Note: I have found an improvement which brings further clarity both these commands achieve the desired result.

cloud-init clean --logs
cloud-init init --local
1

First, you backup the current /etc/netplan/*.yaml file to something like /etc/netplan/*.yaml.BAK.

Then you make any changes you desire to /etc/netplan/*.yaml. Indentation and spacing and no tabs, are VERY important when creating/editing a .yaml file.

FYI: your existing .yaml files should start with:

network:
  version: 2
  renderer: networkd

Then:

sudo netplan --debug generate # generate config files

sudo netplan apply # apply to the current system

reboot # to confirm proper operation

For further examples and configuration guidelines see https://netplan.io/examples

heynnema
  • 73,649
1

Since version 23.4 of cloud-init a new option is added to the clean subcommand: --configs

At the moment of writing this version of cloud-init is in the 'proposed' phase for Ubuntu Jammy so you can not get it using apt-get update.

I checked the source what the command does and it removes certain files and directories. After some testing I found out this way we can manually make cloud-init re-generate the network configuration:

Minimal changes to make cloud-init regenerate the network configuration

sudo rm /var/lib/cloud/data/instance-id
sudo cloud-init init --local

This does not reboot the machine nor change the SSH host key.

To apply the new netplan config execute:

sudo netplan apply

Alternative method:

Install the 'proposed' package manually:

cd /tmp
wget http://launchpadlibrarian.net/713462297/cloud-init_23.4.3-0ubuntu0~22.04.1_all.deb
sudo apt-get install ./cloud-init_23.4.*.deb

Check the version of cloud-init:

cloud-init --version

It should be 23.4.0 or higher, for example /usr/bin/cloud-init 23.4.3-0ubuntu0~22.04.1

Now you can execute this command to clean and regenerate only your network config:

sudo cloud-init clean --configs network
sudo cloud-init init --local

This will change the SSH host key but won't reboot the machine.