In the previous article, I showed how to wipe clean the windows password from a broken Virtual Machine that you were locked out of by rescuing with a Linux image. In this article I explain steps of how you would automate this with a bash script, that looked at the STATE of the server, and accepts commandline arguments.
It’s quite a simple script;
#!/bin/bash # Adam Bull # April 28 2016 # This script automates the resetting of windows passwords # Arguments $1 == instanceuuid # Arguments $2 == username # Arguments $3 == apikey PASSWORD=mypassword # Provide an instance uuid to rescue and reset windows password USERNAME=$1 APIKEY=$2 DDI=$3 INSTANCE=$4 nova --os-username $USERNAME --os-auth-system=rackspace --os-tenant-name $DDI --os-auth-url https://lon.identity.api.rackspacecloud.com/v2.0/ --os-password $APIKEY --insecure rescue --password mypassword --image 7fade26a-0cca-415f-a988-49c021768fca $INSTANCE
The above script takes the arguments I give the executable script on the commandline, in this case the first argument passed is $1, the Rackspace mycloud username. The second argument the apikey. etc. This basically puts the server into rescue. But.. what if we wanted to run some automation AFTER it rescued? We don’t want to try and let the automation ssh to the box and run the automation early, so we could use a supernova show to find whether the VM state has changed to ‘rescue’. Whilst its initiating the state will be rescuing. So we have the option of using when !rescueing logic, or, when == equal to rescue. Lets use when equal to rescue in our validation loop.
This loop will continue until the task state changes to the desired value. Here is how we achieve it
#!/bin/bash # Initialize Variable STATE=0 # Validate $STATE variable, looping UNTIL $STATE == rescued until [[ $STATE == rescued ]]; do echo "start rescue check" # 'show' the servers data, and grep for rescued and extract only the correct value if it is found STATE=`nova --os-username $USERNAME --os-auth-system=rackspace --os-tenant-name $DDI --os-auth-url https://lon.identity.api.rackspacecloud.com/v2.0/ --os-password $APIKEY --insecure show $INSTANCE | grep rescued | awk '{print $4}'` # For debugging echo "STATE =" $STATE echo "sleeping.." # For API Limit control sleep 5 # Exit the loop once until condition satisfied done # Post Rescue echo "If you read this, it means that the program detected a rescued state"
It’s quite a simple script to use. We just provide the arguments $1, $2, $3 and $4.
./rescue.sh mycloudusername mycloudapikey 10010101 e744af0f-6643-44f4-a63f-d99db1588c94
Where 10010101 is the tenant id and e744af0f-6643-44f4-a63f-d99db1588c94 is the UUID of your server.
It’s really quite simple to do! But this is not enough we want to go a step further. Let’s move the rescue.sh to /bin
# WARNING /bin is not a playground this is for demonstration purposes of how to 'install' bin system applications cp rescue.sh /bin/rescue.sh
Now you can call the command ‘rescue’.
rescue mycloudusername mycloudapikey mycustomerid mycloudserveruuidgoeshere
nice, and quite simple too. Obviously ‘post rescue’ in the script I can upload a script via ssh to the server, and then execute it remotely to perform the password reset.