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
をフィルタリングしてインベントリ情報を取得できたりします。
というわけで、エージェントレスが好きな皆様におかれましては是非ご利用ください。
以下余談
komaはRuby製なのですが、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、最近仕事が忙しくて行けてないので、また消え去り認定されないようにまた参加したい。