However, the gotcha here is that the value of that argument needs to be the contents of the user data file, and not the path to the file.
So...here's what worked for me:
1) Created a test user data file with following contents:
#!/bin/bash apt-get update apt-get install -y munin-node python2.6-dev hostname coolstuff
2) Used the following script to create the node (I also created a keypair which I passed to create_node as the ex_keypair argument):
#!/usr/bin/env python import os, sys from libcloud.types import Provider from libcloud.providers import get_driver from libcloud.base import NodeImage, NodeSize, NodeLocation EC2_ACCESS_ID = 'MyAccessID' EC2_SECRET_KEY = 'MySecretKey' EC2Driver = get_driver(Provider.EC2) conn = EC2Driver(EC2_ACCESS_ID, EC2_SECRET_KEY) keyname = sys.argv[1] resp = conn.ex_create_keypair(name=keyname) key_material = resp.get('keyMaterial') if not key_material: sys.exit(1) private_key = '/root/.ssh/%s.pem' % keyname f = open(private_key, 'w') f.write(key_material + '\n') f.close() os.chmod(private_key, 0600) ami = "ami-88f504e1" # Ubuntu 10.04 32-bit i = NodeImage(id=ami, name="", driver="") s = NodeSize(id="m1.small", name="", ram=None, disk=None, bandwidth=None, price=None, driver="") locations = conn.list_locations() for location in locations: if location.availability_zone.name == 'us-east-1b': break userdata_file = "/root/proj/test_libcloud/userdata.sh" userdata_contents = "\n".join(open(userdata_file).readlines()) node = conn.create_node(name='tst', image=i, size=s, location=location, ex_keyname=keyname, ex_userdata=userdata_contents) print node.__dict__
3) Waited for the newly created node to get to the Running state, then ssh-ed into the node using the key I created and verified that munin-node and python2.6-dev were installed, and also that the hostname was changed to 'coolstuf'.
# ssh -i ~/.ssh/lc1.pem ubuntu@domU-12-31-38-00-2C-3B.compute-1.internal ubuntu@coolstuff:~$ dpkg -l | grep munin ii munin-common 1.4.4-1ubuntu1 network-wide graphing framework (common) ii munin-node 1.4.4-1ubuntu1 network-wide graphing framework (node) ubuntu@coolstuff:~$ dpkg -l | grep python2.6-dev ii python2.6-dev 2.6.5-1ubuntu6 Header files and a static library for Python ubuntu@coolstuff:~$ hostname coolstuff
Anyway....hope this will be useful to somebody one day, even if that somebody is myself ;-)
2 comments:
I recommend
userdata_contents = open(userdata_file).read()
It is simpler and doesn't insert new blank lines between every two lines of text.
Also, I wonder if you need to add 'coolstuff' to /etc/hosts. Or is it a standin for a name that's actually DNS-resolvable?
Hi Marius -- thanks for the comment. You're right, open(filename).read() is a better solution. As far as 'coolstuff' it was just a test for my user data script, I wanted to see that 'stuff' happens at boot time when I launch the new instance. In real life I would add it either to /etc/hosts, or to DNS.
Post a Comment