How to update static IP when restoring droplet

May 22, 2018 165 views
Networking Ubuntu 16.04

So I have a PiHole Droplet that I snapshot and restore as and when I need it. Annoyingly the PiHole requires a static IP set in /etc/dhcpcd.conf, however, each time I restore the droplet it gets a new IP, this completely breaks the networking. I have to reset the root password and then access it through the access console, edit /etc/dhcpcd.conf` to get it all working. A real bore! Is there a more elegant solution to this?

1 Answer

Yes! Droplets have access to a service that provides metadata about the droplet. You can create a short user-data script to supply when creating a droplet from this snapshot that would grab the new IP address from the meta data service, update /etc/dhcpd.conf and restart any services that require it.

You can learn more about using droplet meta-data here.

Your user data script can be provided in YAML or in an interpreted language that the droplet will support at boot time. This allows you to paste a bash script into the user-data field (or provide it via the API) and have it executed immediately on boot.

When testing your script you can view it's output in /var/log/cloud-init-output.log

Update CloudInit link and conclusion Metadata is a service provided to DigitalOcean droplets that allows a droplet to access data about itself, i.e. its metadata. Examples of available droplet metadata include user-provided user data, droplet ID, data center region,...
  • #!/bin/bash
    echo "Hello world time to set up static networking"
    apt-get -y update
    apt-get -y install ipcalc
    CIDR=$(ipcalc -nb "$NETMASK" | sed -n '/Netmask/s/^.*=[ ]//p')
    sed -i -e "/static ip_address=/ s/=.*/=$IP\/$CIDR/" /etc/dhcpcd.conf
    sed -i -e "/static routers=/ s/=.*/=$GATEWAY/" /etc/dhcpcd.conf
    service dhcpcd restart

    So I wrote this lovely user-data script, unfortunately, since the dhcpcd configuration is incorrect before the script runs (the script is meant to correct it) the curl and apt instal all fail. So none of it works. Back to square 1.

Have another answer? Share your knowledge.