It’s something different
For a long time now I’ve been put off by Ruby, my interactions have been limited and most of my understanding of Ruby comes from Puppet. I’ve found it a bit of a pain, but the truth is that has nothing to do with Ruby as a language, it was more the packaging of gems and so forth. I really like the idea of yum repos and packaging systems, but Ruby uses gems, I still have no idea what they really are other than libraries to be used by your Ruby program, either way sometimes because of the quirks of yum repos and the lack of maintenance you aren’t always able to get the right version of the rubygems that you need for the application you are running. This alone was enough for me to avoid looking at Ruby as a go to programming language of choice.
In the past I’ve traditionally done my scripting in Bash, if things got difficult in Bash or it wasn’t quite suitable I’d fall back to Perl or PHP (PHP is definitely my go-to language) but with that said I can count the number of scripts I’ve had to write in Perl on my hands, and where possible I always go with Bash. Why? Well Why not? It’s easier for most sysadmins without programming backgrounds to follow as in most cases you are using system commands combined within a framework of programming.
Which leads onto an interesting side note, Why are there sysadmins that can’t program! I guess it happens, and to be honest I was once described as having “no natural programming ability” by one of the college tutors, so i’m not saying I’m good. I do think that every sysadmin needs a fundamental understanding of conditionals, operators, looping and scoping… Again not saying I’m brilliant but I’ve had to learn and I also force myself to learn by writing scripts for things. A sysadmin who can’t write a script is as good as a lithium coated paper umbrella in a thunderstorm.
So what was my first venture into Ruby? A simple monitoring script for Solr indexing. I thought about doing it in Bash, then quickly changed my mind, in short I was dealing with JSON and needed a slightly better way of dealing with the output and an easy way to deal with getting the JSON.
This is something I’ve done in the past but within PHP, so I thought it’d be a good comparison. I can honestly say I was rather surprised at how easy it was to get it working, I managed to Google for some code that got the JSON data and understand its use really easily, it wasn’t all obfuscated like some Perl stuff can be.
From what I can see thus far it is quite a reasonable language, its got some useful features and some flexibility but rather than being like Perl with hundreds of ways to do the same thing it has a small selection of ways to do each thing, so you can choose an appropriate style or just one that suits your coding style.
I’m tempted to start writing something a little more complicated to see how it is with that, I have no doubts it’ll be okay, but until I try I will not know.
So what did my first adventure into Ruby look like:
#!/usr/bin/ruby require 'rubygems' require 'json' require 'net/http' def get_metric(query, base_url) url = base_url + "?" + query resp = Net::HTTP.get_response(URI.parse(url)) data = resp.body # we convert the returned JSON data to native Ruby # data structure - a hash result = JSON.parse(data) # if the hash has 'Error' as a key, we raise an error if result.has_key? 'Error' raise "web service error" end return result end # # Get Arguments or default # url=nil index=nil query="action=SUMMARY&wt=json" if ARGV.length == 0 print "You must specify one of the following options\n\n-u\thttp://example.com/path\tREQUIRED\n\n-q\taction=REPORT&wt=xml\n\n-i\tindexname\tREQUIRED\n" exit else for count in 0..ARGV.length case ARGV[count] when "-i" if ARGV[count+1] != nil index=ARGV[count+1] count += 1 else print "No argument for option -i\n" exit end when "-q" if ARGV[count+1] != nil query=ARGV[count+1] count += 1 end when "-u" if ARGV[count+1] != nil url=ARGV[count+1] count += 1 else print "No argument for option -u\n" exit end end end if (url == nil || index == nil) print "You must specify a URL with -u <url> and -i index\n" exit end end rs = get_metric(query, url) lag=nil begin lag = rs["Summary"][index]["Lag"] rescue print "Invalid Index\n" end regex = Regexp.new(/\d*/) lag_number = regex.match(lag) print lag_number, "\n" if lag_number !=nil
Something like that. I Know its not brill, but it’s a starting point, the next thing I write is probably going to make this look rather small by comparison.
Anywho, that’s all on Ruby, wonder if it’ll catch on.