I have been playing around with 3 google cloud compute instances using webmin/virtualmin (web hosting and email), Vestacp (hosting only), and ISPconfig (hosting only) control panels.
The ISPConfig instance has a static external ip address, however the other 2 at this stage are dhcp.
All 3 instances are using a dynamically assigned internal ip addresses, although i have not yet seen any of those ip addresses change in 6 months of testing and restarting and deleting and re-deploying. Whenever i delete an instance, the same internal ip sequence is used (ie whatever is the next lowest unassigned available number is re-added as internal ip address).
I am having some problems with forcing google cloud to bloodywell stop changing my hostname -f configuration in my /etc/hosts file.
It should read
127.0.0.1 localhost.localdomain localhost
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
10.x.x.x server1.foo.com.au server1
(where x is my internal ip address, "foo" is my domain name)
However, on any 3 of my instances, as soon as i reboot the instance, google cloud adds its own code back in again on next restart. ie by default google cloud keeps changing the file to read the same 2 "# added by Google" lines as shown below
127.0.0.1 localhost.localdomain localhost
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
10.x.x.x server1.foo.com.au server1
10.x.x.x server1.c.bar.internal server1 # Added by Google
169.254.169.254 metadata.google.internal # Added by Google
(where x is my internal ip address, "foo" is my actual domain name, and "bar" is my google cloud project ID)
This is really causing me problems and i have no idea on which is the best way around it.
-Do i do it from within google cloud DNS API? -setup a static internal ip address in google cloud network settings? -setup a script that continues to check for a change to this file and immediately replace any changes google cloud attempts to make? -or do i need to change the metadata information on the last line of my hosts file so it does not have "...metadata.google.internal # Added by Google" line?
At present option 1 above is not working. As soon as i enable the DNS API then try to enter it i get a "failed to load" error from within my google cloud console. This is a flaming pain in the ass!!! (i have sent a support request to google...who knows how long it will take for an answer)
Ghetto option that may not work:
sudo chattr +i /etc/hosts
Do
man chattr
for details, but this makes the file "(i)mmutable", which means even root can't change it (unless root doeschattr -i /etc/hosts
first, of course).As above, you can undo this with
sudo chattr -i /etc/hosts
Why it happens: I'm guessing you have a process (perhaps dhcpcd or something) that obtains host information from some source, and then updates various files including /etc/hosts (and probably /etc/resolv.conf, which was why I ended up using chattr). The right way to fix things is figure out what process is doing this and configure it do the right thing. You could also do "cp /etc/hosts.correct /etc/hosts" after the process is done mangling your file, but you have to do this late enough in the bootup process that it happens after the process is done mangling.
On GCP/Ubuntu (Xenial at least),
/etc/hosts
is manipulated and hostname is being via a DHCP (client) exit hook:/etc/dhcp/dhclient-exit-hooks.d/google_set_hostname
which is installed by the package
gce-compute-image-packages
which is default on GCE images.You can hack it (
exit 0
) or remove it; make sure to take care when the package is upgraded, it can overwrite the hook again depending on apt/dpkg settings.