51

I'm running a couple of standard Fedora instances on EC2. I feel the public hostnames of the instances assigned by Amazon are too weird and hard to remember. I'd like to change them to something short (like red/blue/green/etc).

Is there any draw back in doing this? And how do I set it up such that it persists after reboots?

Thanks.

rbrayb
  • 46,440
  • 34
  • 114
  • 174
Nikhil Gupte
  • 3,266
  • 4
  • 25
  • 15
  • to set it up you probably need to specify which system you're running. Also related: [What are the ramifications of setting the hostname?](http://unix.stackexchange.com/questions/50485/what-are-the-ramifications-of-setting-the-hostname). – cwd Oct 15 '12 at 15:57

10 Answers10

89

Before you get started, try running hostname and hostname --fqdn and take note of what the responses are.

You can edit /etc/hostname and set a hostname, which will stick around after rebooting. You can force the hostname to be "reloaded" by using hostname -F /etc/hostname to read that value into the hostname. The bash prompt will change after you logout and login.

warning / note:
Yes, it is nice to have the hostname in the bash prompt set to something more useful than ip-123-123-123-123 but I've decided to leave mine (at least for now) because it seems like a lot of things really count on having the hostname on ec2 instances set in a standard way. After editing /etc/hostname and changing the hostname to webserver a lot of the services seems to fail because the hostname would not resolve, and apache wouldn't start. Next I edited /etc/hosts and added in

127.0.0.1 webserver

as the second line. Apache would then start but complained that it couldn't find the FQDN. I confirmed that running hostname --fqdn no longer worked.

Next I consulted man hostname and learned that while you can set the hostname it appears that the FQDN is what is returned via a DNS lookup.

THE FQDN

You can't change the FQDN (as returned by hostname --fqdn) or the DNS domain name (as returned by dnsdomainname) with this command. The FQDN of the system is the name that the resolver(3) returns for the host name.

Technically: The FQDN is the name getaddrinfo(3) returns for the host name returned by gethostname(2). The DNS domain name is the part after the first dot.

Therefore it depends on the configuration (usually in /etc/host.conf) how you can change it. Usually (if the hosts file is parsed before DNS or NIS) you can change it in /etc/hosts.

I think it might be possible to set the system / fool the system into return the FQDN, something like ip-123-123-123-123.ec2.internal even though the hostname is webserver but at this point it started to seem like more trouble than it was worth, and that for me to have a nicer bash prompt might cause a lot software and configuration problems down the road and so I decided to give up.

I also learned that a lot of amazon ec2 instances use something called cloud-init:

cloud-init is the Ubuntu package that handles early initialization of a cloud instance. It is installed in the Ubuntu Cloud Images and also in the official Ubuntu images available on EC2.

Some of the things it configures are:

  • setting a default locale
  • setting hostname
  • generate ssh private keys
  • adding ssh keys to user's .ssh/authorized_keys so they can log in
  • setting up ephemeral mount points

cloud-init's behavior can be configured via user-data. User-data can be given by the user at instance launch time. This is done via the --user-data or --user-data-file argument to ec2-run-instances

I also found this which talks about how the hostname is configured with cloud-init:

On EBS instances, a shutdown and later start would end up with a different IP address.

In the case where the user has not modified /etc/hostname from its original value (seeded by metadata's 'local-hostname'), then cloud-init will again set the hostname and update /etc/hostname.

In the case where the user has modified /etc/hostname, it will remain user managed.

Additionally, if /etc/cloud/cloud.cfg contains 'preserve_hostname' value set to a True value, then /etc/hostname will not ever be touched.

The interesting takeaway is that if you don't change the hostname the cloud-init package will keep it up to date for you.

If someone else has a workaround or can address some of the issues mentioned and help reassure that nothing will break on ec2 instances because of changing the hostname I would be happy to hear it.

Community
  • 1
  • 1
cwd
  • 53,018
  • 53
  • 161
  • 198
  • 3
    You have to trick the machine in order to fix "hostname --fqdn". It works if you add to /etc/hosts something like "127.0.0.1 webserver.example.com webserver". The expected syntax for the hosts file is "ip hostname alias". – SaltwaterC Oct 22 '13 at 12:14
  • 4
    Link to the docs: http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/set-hostname.html (Note: It's written assuming Amazon Linux; I'm using Ubuntu, so I would edit /etc/hostname instead of /etc/sysconfig/networking.) – odigity Jul 16 '14 at 18:21
  • Check out the top-voted answer to [your previous question](https://unix.stackexchange.com/questions/50485/what-are-the-ramifications-of-setting-the-hostname) and it tells you how to get the `hostname --fqdn` to work: You just need a domain name that resolves, whether that's because you have a domain registered and pointed to the box or because you've "tricked" it like @saltwaterc suggests. Either works. – bryant Sep 13 '14 at 17:34
  • Isn't `/etc/hostname` only used by Debian-derived distros? I thought the `HOSTNAME` entry in `/etc/sysconfig/network` was the standard place for this on RedHat-derived distros. – Alastair Irvine Dec 18 '14 at 10:47
  • Also watch out when editing `/etc/hosts`. 127.0.0.1 should be left as the localhost line. Add a new line with a fake address (on DHCP systems) e.g. `127.0.1.1 webserver.example.com webserver`. (Ping [SaltwaterC](http://stackoverflow.com/users/1184431/saltwaterc) and [cmd](http://stackoverflow.com/users/288032/cwd).) – Alastair Irvine Dec 18 '14 at 10:51
  • 1
    You warning is fair, but on my Amazon Linux machine, `hostname --fqdn` failed even with the default name like `ip-172-31-3-124.ec2.internal`. Changing to a real name via `/etc/sysconfig/network` was therefore no worse. – David Feb 26 '16 at 19:42
13

Another way is to simply edit ~/.bashrc and prepend PS1 with the nickname of the machine.

Edit: perhaps more correctly, machine-wide, e.g. on the AWS Linux AMI (an example) (paste this into console or add to your arbitrary install .sh):

cat << EOF | sudo tee /etc/profile.d/ps1.sh
if [ "$PS1" ]; then
  PS1="[\u@myinst1:\l \t \! \W]\\$ "
fi
EOF
youurayy
  • 1,635
  • 1
  • 18
  • 11
12

Edit /etc/sysconfig/network as root.

Replace

HOSTNAME=localhost.localdomain

with

HOSTNAME=hostname.DOMAIN_NAME

Then, either reboot or run /etc/init.d/network restart The server then should report its name as a FQDN.

eeerahul
  • 1,629
  • 4
  • 27
  • 38
andrew rimmer
  • 121
  • 1
  • 3
  • 1
    I normally make sure the new name is in /etc/hosts too. – Rup Aug 30 '12 at 13:43
  • 1
    For a major change like changing the hostname, isn't it wise to do a full reboot rather than just restart one service? What if other services fail to start with the name name? Amazon recommends rebooting: http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/set-hostname.html – David Feb 26 '16 at 19:48
7

From this site:

Change the hostname on a running system

On any Linux system you can change its hostname with the command hostname (surprised?)… Here are some quick usages of the command line hostname:

$> hostname

without any parameter it will output the current hostname of the system.

$> hostname --fqd

it will output the fully qualified domain name (or FQDN) of the system.

$> hostname NEW_NAME

will set the hostname of the system to NEW_NAME.

You can also edit /etc/hostname (at least on Ubuntu).

To make sure it stays after a reboot in AWS, either add the command in /etc/rc.local so it runs when the machine starts.

There's also a way to set the hostname dynamically via USER_DATA:

USER_DATA=`/usr/bin/curl -s http://169.254.169.254/latest/user-data`
HOSTNAME=`echo $USER_DATA`
IPV4=`/usr/bin/curl -s http://169.254.169.254/latest/meta-data/public-ipv4`
hostname $HOSTNAME
echo $HOSTNAME > /etc/hostname
Michael
  • 8,362
  • 6
  • 61
  • 88
Rafa
  • 1,397
  • 15
  • 21
1

To change the system hostname to a public DNS name

Follow this procedure if you already have a public DNS name registered

  1. Open the /etc/sysconfig/network configuration file in your favorite text editor and change the HOSTNAME entry to reflect the fully qualified domain name (such as webserver.mydomain.com).

    HOSTNAME=webserver.mydomain.com
    
  2. Reboot the instance to pick up the new hostname.

    [ec2-user ~]$ sudo reboot
    
  3. Log into your instance and verify that the hostname has been updated. Your prompt should show the new hostname (up to the first ".") and the hostname command should show the fully qualified domain name.

    [ec2-user@webserver ~]$ hostname
    webserver.mydomain.com
    

To change the system hostname without a public DNS name

  1. Open the /etc/sysconfig/network configuration file in your favorite text editor and change the HOSTNAME entry to reflect the desired system hostname (such as webserver).

    HOSTNAME=webserver.localdomain
    
  2. Open the /etc/hosts file in your favorite text editor and add an entry beginning with 127.0.1.1 (on DHCP systems) or eth0's address (on static IP systems) to match the example below, substituting your own hostname. (127.0.0.1 should be left as the localhost line.)

    127.0.0.1   localhost localhost.localdomain
    127.0.1.1   webserver.example.com webserver
    
  3. Reboot the instance to pick up the new hostname.

    [ec2-user ~]$ sudo reboot
    
  4. Log into your instance and verify that the hostname has been updated. Your prompt should show the new hostname (up to the first ".") and the hostname command should show the fully qualified domain name.

    [ec2-user@webserver ~]$ hostname
    webserver.localdomain
    

Note: You can also change the shell prompt without affecting the hostname. Refer to this AWS documentation.

Michael
  • 8,362
  • 6
  • 61
  • 88
Manish Singh
  • 5,848
  • 4
  • 43
  • 31
  • 3
    Good answer, but you should clarify that you just copied it from the AWS docs. http://stackoverflow.com/help/referencing – David Feb 26 '16 at 19:45
0

In my Linux AMI (a snapshot of other instance).. none of the above formula worked. Then, I simply changed HOSTNAME field in file: /etc/init.d/modifyhostname and did a normal reboot.

0

The /etc/rc.local solution worked for me for a basic hostname but does not give me a FQDN.

chrowe
  • 762
  • 6
  • 6
0

You will need to do multiple things to set the hostname:

  1. hostname newname - sets the hostname, but is volatile
  2. edit /etc/hostname - sets the hostname for the next reboot
  3. edit /etc/hosts - to keep sudo from complaining

I put these together into a script and uploaded it as a gist: https://gist.github.com/mnebuerquo/5443532036af8b48995547e2817dba85

Mnebuerquo
  • 5,759
  • 5
  • 45
  • 52
0

Sure, you can do that if you have your own domain (setup a CNAME to point to the Amazon hostname). Otherwise, you're pretty much stuck with the one they give you (or an Elastic IP, if you set one of those up).

obeattie
  • 3,264
  • 2
  • 31
  • 36
  • 4
    I can setup CNAMEs. My question is related more to the bash prompt I get which includes the hostname. I'd like this to be more user friendly and would like to know how to set it up such that it stays after reboots and if it causes any problems within AWS's iternal n/w config. – Nikhil Gupte Mar 02 '09 at 18:45
  • 7
    I just run the hostname command to set the hostname, log out, and log back in. – Barry Brown Mar 02 '09 at 19:08
  • Does the hostname set using the hostname command remain after a reboot? – Nikhil Gupte Mar 03 '09 at 02:59
  • 4
    Nikhil, you can put in /etc/rc.local: hostname myhostname – Jeff Bauer Dec 13 '09 at 11:35
-1
sudo hostname *yourdesiredhostnamehere*

sudo /etc/init.d/networking restart

then the hostname is changed. On my server all other services like apache and postfix works. Server is Ubuntu 12.04 LTS