3

How can I have an Ubuntu server VM set /etc/hostname/ to the value fo the VM's assigned IP address automatically on startup?

I'm creating an Ubuntu server VM image to run Hadoop. When a client interacts with Hadoop it returns addresses of nodes in the cluster (even if in this instance they're all processes on the same machine) for the client to interact with. These addresses are determined by Java's hostname resolution, which I gather is not at all reliable. I've been advised the best way around this is to set /etc/hostname/ to the assigned IP address of the only network interface. Alternatively there may be an approach of setting an environment variable and then passing this to the JVM running each Hadoop process.

1
  • How is the IP set? DHCP? Would using a fixed IP be an option?
    – terdon
    Mar 22, 2013 at 15:55

2 Answers 2

6

I added

hostname `hostname -I`

to '/etc/rc.local` and that set the hostname correctly to the currently-assigned IP address.

2
  • Now I feel silly. +1
    – terdon
    Mar 25, 2013 at 20:28
  • This works for JMeter as well
    – Niko
    Jul 18, 2014 at 16:55
3

Using a fixed IP would be the simplest solution. If you can do that, just change /etc/hostname on the guest so that it looks like this (using the right IP of course):

192.168.1.10

If you can't/don't want to use that, you can set up a cronjob that reads the system's IP and updates /etc/hostname accordingly. This command will give you your IP:

ifconfig | grep Bcast | awk '{print $2}' | sed 's/addr://'

Now add a new crontab for root:

sudo crontab -e

This will bring up whicever editor you have defined. Add this line to the crontab file:

@reboot ifconfig | grep Bcast | awk '{print $2}' | sed 's/addr://' > /etc/hostname

This will run the command once each time the machine boots and save its output (the IP) to /etc/hostname. A possible problem is that the cron daemon is started before an IP is assigned. In that case, you could set it to be run every five minutes or so:

*/5 * * * * ifconfig | grep Bcast | awk '{print $2}' | sed 's/addr://' > /etc/hostname

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .