ATL 宮下 です。最近始めた libspecinfra という OSS プロジェクトについて、概要と今後の展望について紹介します。


Specinfra とは

libspecinfra は Specinfra という OSS の発展として生まれたプロジェクトなので、最初に Specinfra について説明します。

Specinfra は Ruby 製のライブラリで、次の役割を担っています。

  • OS やディストリビューション毎のコマンドの違いの抽象化
  • ローカル、SSH 経由、WinRM 経由、Docker API 経由などのコマンド実行形式の抽象化

たとえば、Specinfra 上に実装された Serverspec では、次のようなテストを実行した場合、裏では Specinfra が OS やディストリビューション毎に適切なコマンドを自動的に選択し、予め指定された方式(SSH 経由や Docker API 経由など)で実行します。

Specinfra が持つ機能は元々 Serverspec に内包されていましたが、実行形式やコマンドの違いを抽象化する機能は、Serverspec 以外のツール、特に PuppetChef のようなサーバ構成管理ツールを開発する際にも役立つのではないか、という考えから、Serverspec から一部機能を分離する形で Specinfra が生まれました。これにより、Specinfra を利用した ItamaeServerkit といったサーバ構成管理ツールが開発されています。


Specinfra 登場の背景と課題

Specinfra 登場の背景には、次のような前提があります。

  1. サーバの操作や情報を取得するための方法は、対象が同じであっても、OSやディストリビューションによって異なる。
  2. サーバ操作や情報取得の実行形式は、対象のサーバ内で実行するのか、外から実行するのかによっても方法が異なる。

1 は例えば、パッケージ管理系の操作の場合、RedHat 系であれば yum や rpm コマンド、Debian 系であれば apt-get や dpkg コマンド、といった違いが OS やディストリビューション毎にあります。

2 はコマンドを実行する際に、サーバ上で直接コマンドを実行するのか、SSH 経由で実行するのか、Docker API 経由で実行するのか、などといった違いがあります。

この前提を踏まえた上で現状の課題を整理すると、次のようになります。

  1. システム管理系のツールはそれぞれ独自にOS/ディストリビューションや実行形式の抽象化を行っており再利用性が ない。
  2. 再利用性を考慮して開発した Specinfra はそれほど広く使われていない。

1 については、Chef, Puppet, Ansible, Itamae(Specinfra) といった似たような目的を持つサーバ構成管理ツールが、同じような抽象化をそれぞれ独自に実装しています。

2 は Specinfra が Ruby 製であるため、Ruby 以外のプロジェクトでは採用できない、という問題が大きいと思われます。実際、MItamae は Specinfra を mruby で再実装 しています。


課題を解決するための提案と実装

このような課題を解決するためには、OS/ディストリビューションの抽象化や実行形式の抽象化を行うためのライブラリを、Specinfra のような RubyGem ではなく、様々な言語からも利用できる共有ライブラリの形で提供することが考えられます。

その実装を担うのが libspecinfra プロジェクト です。libspecinfra プロジェクトは次のような OSS から構成されます。

  1. 共有ライブラリを提供する Specinfra 本体
  2. Specinfra 本体が提供する共有ライブラリを呼び出すための各言語用バインディング

1 は現在実装中です。まだまだ機能は足りませんが、一応動かすことはできます。Specinfra を Rust で再実装する形で実装していますが、名前は敢えて変えずに Specinfra としています。

2 はまだ実装はありませんが、手始めに Ruby と mruby 用バインディングを実装し、その後他の言語にも拡大していく予定です。

GitHub 上の libspecinfra Organization にある examples リポジトリにはサンプルコードを置いています。現在は Rust のサンプルコードのみですが、各言語バインディングが実装されたら、こちらにサンプルコードを追加していく予定です。


libspecinfra が目指すところ

libspecinfra は次のようなプロジェクトになることを目標としています。

  • システムの運用管理が複雑化していく中で、それを解決するより良いツールが生まれるのを支援する。
  • コンテナやユニカーネルといった新しいサーバ形式が出てきても、既存のツールが簡単に対応できるようにする。
  • 今後生まれるシステム管理系ツールすべての基盤となる。

なかなか壮大な目標で、果たしてきちんと仕上げられるのか、仕上げたとしてそもそも需要はあるのか、といった不安はないでもありませんが、まずは libspecinfra バージョンの Serverspec を開発する、という形で、ドッグフーディングしながら今後の開発を進めて行きたいと考えています。

TAGS: