SpecinfraでリモートホストのOS情報を知る

使ってみようと思ったきっかけ

とある事情で社内で使用している数多のサーバーのOS情報をまとめたりしたくなったのでSpecinfraについて調べました。

github.com

使い方を調べる

検索しても参考になりそうな記事は少なく、この記事を参考にして書き始めました。

qiita.com

が、追記に内容が古いと書かれているとおり、このままでは動作しませんでした。

なんとか動かすことができた

Specinfraのコードを読みつつ、サンプルコードを読みつつ修正をしていたら、参考にしていた記事とは全く別物になりましたが、なんとか動かすことができました。

モジュール名がSpecInfraからSpecinfraに変わっていることに気づかなかったのが最大のハマりポイントだった気がします。

参考にしたコードの一部

specinfra/multiple_backends.rb at master · mizzy/specinfra · GitHub

specinfra/specinfra.rb at master · mizzy/specinfra · GitHub

specinfra/base.rb at master · mizzy/specinfra · GitHub

specinfra/ssh.rb at master · mizzy/specinfra · GitHub

サンプルコード

Vagrantっぽい接続情報になっていますが、ホストなどは適宜書き換えていただければリモートホストでも動作すると思います。

SSHの接続情報まわりはNet::SSHで使えるものが、そのまま使えるようです。

net-ssh 4.0.0.alpha2

require 'specinfra'

ssh_options = {
  host_name: 'localhost',
  user: 'vagrant',
  port: 2222,
  keys: ['~/.ssh/id_rsa'],
}

backend = Specinfra::Backend::Ssh.new(
  host: ssh_options[:host_name],
  ssh_options: ssh_options,
  disable_sudo: true,
)

p backend.os_info

実行してみる

Bundlerを使ったので bundle exec で実行します。

$ bundle exec ruby os_info.rb
{:family=>"ubuntu", :release=>"14.04", :arch=>"x86_64"}

感想

諸事情によりサーバーの環境がバラバラだったりするので、こういった方法で自動的にサーバーの情報を集めることができれば、辛い台帳管理などしなくてもよくなりそうだなと思って試してみました。

思ったほどハマらずに動作確認できたので、さっそく実践投入するつもりです。