A DNS has a set of pre-defined names such as:
... the-re018 10.0.3.18 the-re019 10.0.3.19 ...
If nova fixed-ip-reserve is denied by the OpenStack policy and neutron net-create is not available to create a network with the 10.0.3.0/24 subnet that is exclusive to the OpenStack tenant, the naming of the instance must be done after openstack server create completes.
A cloudinit user-data file is created with:
- url=http://169.254.169.254/2009-04-04/meta-data \ ( curl --silent $url/hostname | sed -e 's/\..*//' ; \ printf "%03d" $(curl --silent $url/local-ipv4 | \ sed -e 's/.*\.\(.*\)/\1/') \ ) | \ tee /etc/hostname - hostname $(cat /etc/hostname) preserve_hostname: true
Where $url/hostname retrieves the prefix of the hostname (multiple instances can have the same name, two simultaneous instance creation won’t race), $url/local-ipv4 gets the IPv4 address, keeps the last digits (sed -e ‘s/.*\.\(.*\)/\1/’)) and pad them with zeros if necessary (printf “%03d”). The hostname is stored in /etc/hostname and displayed in the /var/log/cloud-init.log logs (tee /etc/hostname) for debugging. This is done early in the cloudinit sequence (bootcmd) and the default cloudinit setting of the hostname is disabled (preserve_hostname: true) so that it does not override the custom name set with hostname $(cat /etc/hostname).
The instance is created with
$ openstack server create \ --image 'ubuntu-trusty-14.04' --key-name loic \ --flavor m1.small \ --user-data user-data.txt \ -f json \ --wait \ the-re ... {"Field": "addresses", "Value": "fsf-lan=10.0.3.19"} ... ... {"Field": "id", "Value": "cd1a8a0f-83f9-4266-bd61-f3e2f583d59d"} ...
Whe user-data.txt contains the above cloudinit lines. The IPv4 address returned by openstack server create (10.0.3.19) can then be used to rename the instance with
$ openstack server set --name the-re019 cd1a8a0f-83f9-4266-bd61-f3e2f583d59d
where cd1a8a0f-83f9-4266-bd61-f3e2f583d59d is the unique id of the instance which is preferred to the the-re prefix that could race with another identical openstack server create command.
To verify that the instance name matches the IPv4 address that is pre-set in the DNS:
$ ssh ubuntu@the-re019 hostname Warning: Permanently added '10.0.3.19' (ECDSA) to the list of known hosts. the-re019
Thanks to Josh Durgin for suggesting this solution.
One Reply to “OpenStack instance name based on its IP address”
Comments are closed.