So, I had a good friend of mine who is a cloud Mentor at Rackspace, reach out to me concerning an easier way of deploying cloud-images, without each time a cloud server is spun up, having to unroll the image into a CBS. His customer wanted to simply have a ‘primary master’ CBS volume, a template of their site if you will, the equivalent of a ‘golden image’, the only difference was it was a CBS Volume. So I set about making this work. It would still take a few hours, at least to provision 50 to 200 servers, but it was much faster than the alternatives. Here is how I did it. I actually have some ideas for how to improve this but I’ve not yet implemented it. That goody is to come in later scripts.
#!/bin/bash USERNAME='mycloudusername' APIKEY='mycloudapikey' ACCOUNT_NUMBER=100101011 API_ENDPOINT="https://lon.blockstorage.api.rackspacecloud.com/v1/$ACCOUNT_NUMBER/volumes" MASTER_CBS_VOL_ID="d8a67ad1-8037-46bc-8790-efca2cb6e5bd" TOKEN=`curl https://identity.api.rackspacecloud.com/v2.0/tokens -X POST -d '{ "auth":{"RAX-KSKEY:apiKeyCredentials": { "username":"'$USERNAME'", "apiKey": "'$APIKEY'" }} }' -H "Content-type: application/json" | python -mjson.tool | grep -A5 token | grep id | cut -d '"' -f4` # Populate CBS for i in `seq 1 2`; do echo "Generating CBS Clone #$i" #curl -s -vvvv \ -X POST "$API_ENDPOINT" \ -H "X-Auth-Token: $TOKEN" \ -H "X-Project-Id: $ACCOUNT_NUMBER" \ -H "Accept: application/json" \ -H "Content-Type: application/json" -d '{"volume": {"source_volid": "d8a67ad1-8037-46bc-8790-efca2cb6e5bd", "size": 50, "display_name": "win-'$i'", "volume_type": "SSD"}}' | jq .volume.id | tr -d '"' >> cbs.created done echo "Giving CBS 2 hour grace time for 50 CBS clone" #sleep 7200 echo "Listing all CBS Volume ID's created" cat cbs.created echo "" # Populate Nova count=1; echo "Populating Nova servers with CBS disk" while read n; do Echo "Build Task $n Started:" nova --insecure --os-username mycloudusername --os-auth-system=rackspace --os-tenant-name 100110111 --os-auth-url https://lon.identity.api.rackspacecloud.com/v2.0/ --os-password myapikeygoeshere boot --flavor general1-1 --block-device-mapping vda="$n":::1 Auto-win-"$count" ((count=count+1)) done < cbs.created # Move the cbs.created.old away mv cbs.created cbs.created.old -f
Requirements are nova and jq.
https://stedolan.github.io/jq/
https://developer.rackspace.com/blog/getting-started-using-python-novaclient-to-manage-cloud-servers/