Techioz Blog

Ruby での Linux ディストリビューション/プラットフォームの検出

概要

Ruby コードを実行しているプラットフォームのオペレーティング システムは、いくつかの方法で確認できます。

どの Linux ディストリビューションが実行されているかを知ることはできますか?たとえば、Debian ベースまたは Red Hat ベースのディストリビューションなどです。

解決策

上記のコメントセクションで指摘されているように、これを行う確実な「すべてのディストリビューションで機能する」方法はないようです。以下は、スクリプトが実行されている環境の種類を検出するために使用したものです。

def linux_variant
  r = { :distro => nil, :family => nil }

  if File.exists?('/etc/lsb-release')
    File.open('/etc/lsb-release', 'r').read.each_line do |line|
      r = { :distro => $1 } if line =~ /^DISTRIB_ID=(.*)/
    end
  end

  if File.exists?('/etc/debian_version')
    r[:distro] = 'Debian' if r[:distro].nil?
    r[:family] = 'Debian' if r[:variant].nil?
  elsif File.exists?('/etc/redhat-release') or File.exists?('/etc/centos-release')
    r[:family] = 'RedHat' if r[:family].nil?
    r[:distro] = 'CentOS' if File.exists?('/etc/centos-release')
  elsif File.exists?('/etc/SuSE-release')
    r[:distro] = 'SLES' if r[:distro].nil?
  end

  return r
end

これは、地球上のすべての GNU/Linux ディストリビューションを処理するための完全なソリューションではありません。実際のところ、それとは程遠いです。たとえば、OpenSUSE と SUSE Linux Enterprise Server はまったく異なる 2 つですが、区別はありません。それに、ディストリビューションの数が少ないだけでも、かなりのスパゲッティです。しかし、それは人が構築できる可能性のあるものかもしれません。

配布検出のより完全な例は、構成管理システム Puppet にファクトをフィードするために特に使用される Facter のソース コードから見つけることができます。