Ubuntu has just released their latest LTS, 10.4 “Lucid Lynx” today, and immediately Linode made it as an available distribution for deployment. Definitely kudos to team Linode there. I have actually been holding onto creating a new VPS (to run git + back trackers for some of my projects) because of pending release of Ubuntu 10.04 LTS. There is nothing stopping me now :)
Well. I am doing it a bit differently today, and decided to do it via API. I went with Ataraxia Consulting’s Python binding as it’s a language I am fluent in. These are the steps that I took.
Downloading Python Binding
The Python binding is hosted with git so I basically just clone it. It comes with a nice shell.py that initialises and turns it into a Python shell with tab completion. You will also need your API Key ready, which can be found on your Linode profile page (generate one if it does not yet exist).
$ git clone http://git.atxconsulting.com/linode Initialized empty Git repository in linode/.git/ got 7424e15c260d1150025e9909a23bfce698e6c592 ... ... $ cd linode/ $ ./shell.py Enter API Key: (enter in your Linode API key here) Python 2.6.4 (r264:75706, Apr 27 2010, 11:22:46) [GCC 4.3.4] on linux2 Type "help", "copyright", "credits" or "license" for more information. (LinodeConsole) >>>
Okay. Let’s get rocking!
Creating New Linode
What I am trying to do is to create a new Linode 360 in their Dallas location (always check Linode’s availability though, although available Linodes have been abundant lately). Since I am keeping it long term, I want to prepay for 12 months. So the API I really want to call is linode.create. Under the shell I will get the data centre ID and plan ID via API.
>>> [dc['DATACENTERID'] for dc in linode.avail_datacenters()
... if 'Dallas' in dc['LOCATION']]
[2]
>>> [p['PLANID'] for p in linode.avail_linodeplans() if '360' in p['LABEL']]
[1]
>>> linode.linode_create(DatacenterID=2, PlanID=1, PaymentTerm=12)
{u'LinodeID': 12345}
Then to rename it to something else (instead of linode12345).
>>> linode.linode_update(LinodeID=12345, Label='MyNewVPS')
{u'LinodeID': 12345}
Creating Disks
I can’t seem to be able to find an API equivalent to the Deploy a Linux Distribution functionality on the control panel, so I guess I have to go through the long way by creating disks, creating configs, etc before I can boot the Linode. I want to create a Linode with 256MB of swap, and then everything else goes into one partition. I also need to find out the Distribution ID for the 32bit Ubuntu 10.04.
>>> [d['DISTRIBUTIONID'] for d in linode.avail_distributions()
... if ('Ubuntu 10.04' in d['LABEL']) and (not d['IS64BIT'])]
[64]
>>> linode.linode_disk_createfromdistribution(
... LinodeID=12345, DistributionID=64, Label='Root Partition',
... Size=(16384-256), rootPass='passw0rd',
... rootSSHKey=open('../.ssh/id_dsa.pub').read())
{u'DiskID': 12345, u'JobID': 12345}
>>> linode.linode_disk_create(LinodeID=47347, Label='Swap Partition',
... Type='swap', Size=256)
{u'DiskID': 54321, u'JobID': 54321}
You have to note down the actual DiskID because we will need them later when we create the config. Also note that I am using a random password + my SSH public key when I set up the root partition.
Create Config
The next task is to create a boot configuration, which needs to include (1) the kernel to boot with (2) the disk arrangement. We need to use the latest 32bit paravirt kernel.
>>> [_['KERNELID'] for _ in linode.avail_kernels()
... if ('Latest 2.6 Paravirt' in _['LABEL']) and ('x86_64' not in _['LABEL'])]
[110]
>>> linode.linode_config_create(LinodeID=12345, KernelID=110,
... Label='Ubuntu 10.04 Default', DiskList='12345,54321')
{u'ConfigID': 12345}
Now the configuration is done — ready to boot!
Booting the Node
Booting a linode using a existing config is pretty trivial. You would also want to get the IP address of your new Linode so you can SSH in.
>>> linode.linode_boot(LinodeID=12345, ConfigID=12345)
{u'JobID': 54321}
>>> linode.linode_ip_list(LinodeID=12345)[0]['IPADDRESS']
u'69.164.xxx.yyy'
Done! Now log off the Python console, and SSH into your new Ubuntu 10.04 “Lucid Lynx” Linode :)
>>> exit() $ ssh root@69.164.xxx.yyy Linux li109-129 2.6.32.12-linode25 #1 SMP Wed Apr 28 19:25:11 UTC 2010 i686 GNU/Linux Ubuntu 10.04 LTS Welcome to Ubuntu! * Documentation: https://help.ubuntu.com/ The programs included with the Ubuntu system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. root@linode12345:~#
/me pat on my back. Ought to put all that into a single script…
