Last time I created 20 virtual machines at once. Now I want to stop those machines, or start them back up, or delete them. Basically, I want to do bulk operations on all of the machines that I am using in this scenario.
If you look at the create 20 VMs post, I gave each one of them a similar name, based on the pattern “load-xxx” where load is the operation I am using them for and xxx is a three digit sequential id with 0s prefixed. (This makes them order correctly in our UI.)
Because I know their names, I can count them up and not have to explicitly tell these operations how many machines I want to operate on. To do that, I create a make variable that contains the count of all VMs prefixed by “load.”
COUNT = $$(( $(shell gcloud compute instances list | grep 'load-' | wc -l | xargs) ))
Once I have that, I can perform batch operations very simply.
To stop 20 running VMs:
stop: @echo "Initiate Stop loop" @i=1 ; while [[ $$i -le $(COUNT) ]] ; do server=`printf "load-%03d" $$i` ; ($(call stop-node,$$server) &) ; ((i = i + 1)) ; Done define stop-node echo "Stop Compute Engine Instance - " $(1) ; (gcloud compute instances stop $(1) ) endef
Just to explain, like the previous post, we loop from i to COUNT, creating a variable that contains the name of our server, and running a function call to execute the gcloud stop instances command. Why is this a separate function? Because I usually do more than just stop the VM.
I also wrap the call in parentheses and append the & to allow multiple calls to execute in parallel.
To start them back up:
start: @echo "Initiate Start loop" @i=1 ; while [[ $$i -le $(COUNT) ]] ; do server=`printf "load-%03d" $$i` ; ($(call start-node,$$server) &) ; ((i = i + 1)) ; done define start-node echo "Start Compute Engine Instance - " $(1) ; (gcloud compute instances start $(1)) endef
To delete them all:
delete: @echo "Initiate Delete loop" @i=1 ; while [[ $$i -le $(COUNT) ]] ; do server=`printf "load-%03d" $$i` ; ($(call delete-node,$$server) &) ; ((i = i + 1)) ; done define delete-node echo "DELETE Compute Engine Instance - " $(1) ; (gcloud compute instances delete $(1) --delete-disks "all" --quiet ) endef
And in this case, I do a little bit more here in delete. I make sure all of the disks are deleted, and I set the request to quiet. Why? Because I don’t want to confirm this 20 times, silly.
In any case, doing batch operations on my set of VMs is as easy as:
make start make stop make delete
There you have it, fleets of VMs responding in concert to your requests. As it should be.