ruby, the language of devops
TRANSCRIPT
RubyThe Language of Devops
What is Devops?● The Cloud?● Jenkins Automation?● Continuous integration & deployment?● A new title?
o with no extra pay . . .● Developers doing Operations??
o And fire all the sysadmins? (NO-OPS!)● Automating away your coworkers??!
TheProgramming
of Operations
The Programming of Operations● Operations is:
o Build serverso Packagingo Monitoringo Provisioningo Virtualizationo Environment/Stack Managemento Many many many more things
The Programming of Operations
The Programming of Operations● Lots of helpers
o Build thiso Package thato Move things from here to there
The Programming of Operations● Lots of helpers
o Build thiso Package thato Move things from here to there
● Templatingo Homegrown templates for Nagios
The Programming of Operations● Lots of helpers
o Build thiso Package thato Move things from here to there
● Templatingo Homegrown templates for Nagios
● Lots of manual activities
The Programming of Operations
Manual===
Broken
TARGET=${1:-"monitor-prod"}for rule in /nagios/rules/*.tmpl; do process_template.pl $rule $TARGET mv ${rule##tmpl#cfg} /nagios/finaldone
scp /nagios/final/*.cfg $TARGET.company.com:/var/nagios/ssh $TARGET.company.com -c "sudo service nagios3 restart”
The Programming of Operations
The Programming of Operations● As a single script, it's okay.
o Concise, clear - what else do you need?
The Programming of Operations● As a single script, it's okay.
o Concise, clear - what else do you need?● Problems:
o No tests (untestable!)o No reusability or extensibilityo Inscrutable code
The Programming of Operations● As a single script, it's okay.
o Concise, clear - what else do you need?● Problems:
o No tests (untestable!)o No reusability or extensibilityo Inscrutable code
● Bugs:o Assumes the contents of $PWD and $PATHo Assumes a human will know if it worked
The Programming of Operations● Operations staff are not developers
The Programming of Operations● Operations staff are not developers● Operational focus is about
maintenanceo Keep it ono Keep it upo Keep it responding
The Programming of Operations
The Programming of Operations● Operations staff are not developers● Operational focus is about
maintenanceo Keep it ono Keep it upo Keep it responding
● Operations has to manage changes by those pesky developerso Right now. While something is on fire.
(Really!)
The Programming of OperationsWhat is the perfect language?
● Multi-system● Quick to boot● Easy to learn● Easy to maintain● Large community / Lots of modules● Easy to find good staff
Languages we won't discuss● C/C++● .NET (C#, F#, etc)● JVM languages● Functional languages
o Especially Erlang● Node.JS
Bash/Shell scripts (Good and Bad)● Easy to write● Everyone has written Bash scripts● Horrible control structures● Horrible variable structures● Non-existent code structuring● “Libraries” don’t exist● Only really works on *nix
o Git-Bash doesn't count
Perl (the Good)● What most sysadmins use other than
Bash● Great variable structures● Great control structures● Excellent reusability
o CPAN is the largest single-language repository● Works everywhere (literally)● Good programmers can manage
500kLOC
Perl (the Bad)● Everyone thinks they know Perl
o Bad Perl is really really bad.
Perl (the Bad)● Everyone thinks they know Perl
o Bad Perl is really really bad.● Standard language facilities require
librarieso Exceptions, objects, case statements
Perl (the Bad)● Everyone thinks they know Perl
o Bad Perl is really really bad.● Standard language facilities require
librarieso Exceptions, objects, case statements
● CPAN is 80%+ useless
Perl (the Bad)● Everyone thinks they know Perl
o Bad Perl is really really bad.● Standard language facilities require
librarieso Exceptions, objects, case statements
● CPAN is 80%+ useless● Really old Perls are installed
everywhereo 5.005_003 (March, 1998)o 5.6.1(April, 2001)
Perl (the Ugly)● Solving a problem with regular
expressions means you have two problems.
Perl (the Ugly)● Solving a problem with regular
expressions means you have two problems.
● Sigils ($, @, %, etc) make code hard to reado Ironically, the idea was to make code easier to
read
Perl (the Ugly)● Solving a problem with regular
expressions means you have two problems.
● Sigils ($, @, %, etc) make code hard to reado Ironically, the idea was to make code easier to
read● Too many places where hidden globals
make you cry.o E.g., namespaces aren't namespaced.
Python (Strengths)● Great variable structures
Python (Strengths)● Great variable structures● Great control structures
Python (Strengths)● Great variable structures● Great control structures● All the advanced features
o Exceptionso Objectso Case statements
Python (Strengths)● Great variable structures● Great control structures● All the advanced features
o Exceptionso Objectso Case statements
● Runs everywhere that we care about
Python (Weaknesses)● Significant whitespace is difficult for
non-developers.
Python (Weaknesses)● Significant whitespace is difficult for
non-developers.● System programming libraries aren't
mature
Python (Weaknesses)● Significant whitespace is difficult for
non-developers.● System programming libraries aren't
mature● Writing libraries isn't self-evident
o Tutorials and scaffolding also immature
Ruby (Strengths)● Great variable structures
Ruby (Strengths)● Great variable structures● Great control structures
Ruby (Strengths)● Great variable structures● Great control structures● All the advanced features
o Exceptionso Objectso Case statements
Ruby (Strengths)● Great variable structures● Great control structures● All the advanced features
o Exceptionso Objectso Case statements
● Runs everywhere that we care about
Ruby (Strengths)● Great variable structures● Great control structures● All the advanced features
o Exceptionso Objectso Case statements
● Runs everywhere that we care about● Already used as a sysadmin language
Ruby (Weaknesses)● Minor versions changing syntax
o 1.8.7 vs. 1.9.3 vs 2.x
Ruby (Weaknesses)● Minor versions changing syntax
o 1.8.7 vs. 1.9.3 vs 2.x● Ruby is not Rails
o Really!
Ruby (Superpowers)1. Install multiple versions of same library2.Newbies are a way of life3.Blocks
Multiple library versions● Sysadmins are pessimistic
o Foo-bar 1.3.9 works, so don't change it!!
Multiple library versions● Sysadmins are pessimistic
o Foo-bar 1.3.9 works, so don't change it!!● Not everyone can use the same
versiono Something needs a feature in Foo-bar 2.1.5
Multiple library versions● Sysadmins are pessimistic
o Foo-bar 1.3.9 works, so don't change it!!● Not everyone can use the same
versiono Something needs a feature in Foo-bar 2.1.5
● So install both and specify at runtimegem 'Foo-bar', '=1.3.9'require 'foobar'
Newbie friendly● Rails is how many new web-developers
start
Newbie friendly● Rails is how many new web-developers
start● Rails is Ruby (plus, but still)
Newbie friendly● Rails is how many new web-developers
start● Rails is Ruby (plus, but still)● Thousands of great tutorials, skeletons,
and communities.o Google "ruby tutorial XYZ" for all values of
XYZ)
Newbie friendly● Rails is how many new web-developers
start● Rails is Ruby (plus, but still)● Thousands of great tutorials, skeletons,
and communities.o Google "ruby tutorial XYZ" for all values of
XYZ● Syntax is very easy to read and write
o Reading code is very hardo Anything that makes it easier is a "Good
Thing"(tm)
Blocks (Temporary File)require 'tempfile'Tempfile.open('some-prefix') do |tmp| tmp.write "Some text" # Do something with tmp hereend
Blocks (Reading from a file)
File.foreach('/some/file') do |line| puts “Line read: #{line}” do_something(line)end
Blocks (Writing to a file)
File.open('/some/file') do |file| file.puts 'first line' file.puts 'second line'end
Blocks (Writing to a file)
File.open '/some/file' { |file| file.puts 'first line' file.puts 'second line'}
Blocks (Changing Directory)
Dir.chdir('/some/place') do |dir| do_something_in_some_place(dir)end
do_something_in_original_dir()
Blocks (Nested blocks)Dir.chdir('/some/dir') do %w{sub1 sub2}.each do |subdir| Dir.chdir(subdir) do # In /some/dir/sub[12] end endend
Why blocks?● Same construct for iteration and
closureso A logical new lexical scope
Why blocks?● Same construct for iteration and
closureso A logical new lexical scope
● Automatic cleanupo (Not necessarily guaranteed in all cases)
Why blocks?● Same construct for iteration and
closureso A logical new lexical scope
● Automatic cleanupo (Not necessarily guaranteed in all cases)
● Clean delination of concernso Relevant code is in one place
Why blocks? (as a sysadmin)Because my job isn't where I can faff about until everything is perfectly just-so and my HammerFactoryFactoryFactory has 103% test coverage in Jenkins.
I need to be done yesterday and I need to be sure it works by looking at it.
Why blocks? (as a devops)Because it's the easiest way to convert a sysadmin into a developer.
Tooling● Vagrant● Chef / Puppet● Logstash● fpm● Cucumber● AWS / Rackspace clients● Rake / Capistrano
Tooling (why do I care it's in Ruby?)Three reasons:1.Plugins
Tooling (why do I care it's in Ruby?)Three reasons:1.Plugins2.Plugins
Tooling (why do I care it's in Ruby?)Three reasons:1.Plugins2.Plugins3.Plugins
Tooling (why do I care it's in Ruby?)Three reasons:1.Plugins2.Plugins3.Plugins
4.Some of them require Ruby (Vagrant)
Questions?