Tuesday, June 25, 2013

Running commands on all of your cloud servers

I consider my cloud servers to be one big array of servers.

I decided to use "fog" - the Ruby API for the Rackspace Cloud - to build something to let me, in one step, run commands on all of the servers.  It turned out to be pretty straightforward.

#!/usr/bin/ruby
#############################################
# Ruby / Fog Cloud Server Command Runner
#
# Author: Paul Reiber reiber@gmail.com
#
# Usage: run commandline-to-run-on-all-servers
#
# Assumptions:
# * You are using the Rackspace Cloud
# * Your cloud servers are in the dfw datacenter (if not, fix the rackspace_region)
# * All servers on the cloud account have key-based root ssh access.
# ...if they don't have ssh key-based access here are the steps:
# http://www.rackspace.com/knowledge_center/article/secure-shell-ssh
#
# The 'oj' gem requirement is only there to eliminate the irritating warning about the default JSON parser
#
require 'rubygems'
require 'fog'
require 'pp'
require 'oj'
# populate the following with your correct username, api_key, and region details
service = Fog::Compute.new({ :provider => 'Rackspace', :version => :v2,
:rackspace_region => :dfw, :rackspace_username => 'YOUR-CLOUD-USERNAME', :rackspace_api_key => 'YOUR-CLOUD-API-KEY' })
# running a command on all servers and reporting the results is as simple as the following:
service.servers.each {|n| puts n.name; pp n.ssh [ARGV] }
# thats all it takes!
view raw run hosted with ❤ by GitHub

You might have a different model - an array of web servers, another array of db servers, and another array of compute servers, for example.  If so, you can easily extend the code to work with your different groups of servers by querying for whatever differentiates them.

1 comment: