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?

These answers are provided by our Community. If you find them useful, show some love by clicking the heart. If you run into issues leave a comment, or add your own answer to help others.

×
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

  • #!/bin/bash
    
    echo "Hello world time to set up static networking"
    apt-get -y update
    apt-get -y install ipcalc
    IP=$(curl http://169.254.169.254/metadata/v1/interfaces/public/0/ipv4/address)
    GATEWAY=$(curl http://169.254.169.254/metadata/v1/interfaces/public/0/ipv4/gateway)
    NETMASK=$(curl http://169.254.169.254/metadata/v1/interfaces/public/0/ipv4/netmask)
    CIDR=$(ipcalc -nb 1.1.1.1 "$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.

Submit an Answer