エージェントレスでプラットフォームのインベントリ情報を取得するツールkomaを作った

Ansibleにはsetup module、Chefにはohai、Puppetにはfacterというプラットフォームのインベントリ情報を取得するライブラリや機構があります。

ただ、リモートホストのインベントリ情報を取得したいときに、ohaiやfacterはリモートホスト側にインストールが必要だったり、setup moduleは単体で使いにくかったりするので、

「気軽にエージェントレスでプラットフォームのインベントリ情報を取得できるようにしたいなー」

ということでkomaというgemを作りました。

github.com

Installation

$ gem install koma

Usage

まず、公開鍵認証でSSH接続できるリモートホストを用意します。

例えば、

$ ssh k1low@example.com

でログインできるようなホストですね。

で、そのssh コマンドを koma ssh に変えて実行します。

$ koma ssh k1low@example.com

そうすると、インベントリ情報をJSON形式でSTDOUTに出力します。

さらに複数のホストのインベントリ情報を一気に取得したい場合はカンマ区切りで指定できます。

$ koma ssh example.com,k1low@example.jp
{
  "example.com": {
    ...
  },
  "example.jp": {
    ...
  }
}

取得できるインベントリ情報

取得できるインベントリ情報はkoma keysで確認できます(リモートホストディストリビューションによって取得できる情報にはばらつきがあります)。

$ koma keys
memory
ec2 (disabled)
hostname
domain
fqdn
platform
platform_version
filesystem
cpu
virtualization
kernel
block_device
package
user
group
service

インベントリ情報を指定したいときは --key オプションで指定可能です。

$ koma ssh k1low@example.com --key cpu,kernel

(disabled) になっている ec2 などは --enable-ec2 オプションで有効になります。

Pro Tip: ssh_config形式でリモートホストを指定する

komaはssh_config形式のSTDINを入力とすることができます。

$ cat <<EOF > ssh_config_tmp
Host example_com
  User k1low
  Hostname example.com
  PreferredAuthentications publickey
  IdentityFile /path/to/example_rsa

Host example_jp
  User someone
  Hostname example.jp
  PreferredAuthentications publickey
  IdentityFile /path/to/more/example_jp_rsa
EOF

$ cat ssh_config_tmp | koma ssh --key platform,platform_version

ssh_config形式がいけるということは、

$ vagrant ssh-config | koma ssh --key cpu,kernel

みたいに、Vagrantのサーバのインベントリ情報を取得したり、

$ sconb dump example_* | sconb restore | koma ssh --key platform,platform_version

みたいに、sconb~/.ssh/config をフィルタリングしてインベントリ情報を取得できたりします。

というわけで、エージェントレスが好きな皆様におかれましては是非ご利用ください。

以下余談

komaRuby製なのですが、awspecと同様にFukuoka.rbで作りました。

もともと「エージェントレスでohai」みたいなツールはずっと欲しかったのです。

ふとFukuoka.rbのSlackチャンネルでつぶやいたら、うずらさん が反応してくれてやる気になり、ひとりで作ろうとして途方に暮れていたら、やまださん が「Specinfraに Specinfra::HostInventory という求めている機能がある」というところを教えてもらって、一緒にSpecinfraを読んで、プロトタイプまで一気に作ることができました。

というわけでkomaは実はただの Specinfra::HostInventory の薄いラッパーです(一気に信頼度が上がった感。

とはいえ、 Specinfra::HostInventory を拡張しているところがあるので(user group package serviceのインベントリ情報。主にRedHat系しか作っていない)、最終的に拡張部分をSpecinfraに取り込んでもらうところまで頑張ろうと思っています(komaはそのためのユースケースでもある)。

Fukuoka.rb、最近仕事が忙しくて行けてないので、また消え去り認定されないようにまた参加したい。