Serverkitの進捗

前回 Serverkitつくった - ✘╹◡╹✘ の記事で触れた Serverkit という構成管理ツールの開発を、暇なときにぼちぼち進めてる。大きな変更点としては、独自のリソース定義を追加できるプラグイン機構と、冪等性向上のためのNotifyの機能が入った。

プラグイン

Serverkitの各種コマンドを実行するときに、まず手元のGemfileに書かれたGemを読み込んでから実行するというようにした。好きなGemをつくってGemfileに書いておけば、それが読み込まれる。これはBot用フレームワークの Ruboty と全く同じ仕組みになってる。プラグイン機構をサポートする他のライブラリを見ると、特殊なDSLで書かれた便利なファイルを特殊なコンテキストの中で読み込むという方式を採用しているライブラリもあるけど、外部のプラグインもただのRubyのコードであるという風にした方が、普通っぽくて分かりやすいのでいいだろうと思ってこうなった。試しに、r7kamura/serverkit-defaultsr7kamura/serverkit-rbenv というプラグインをつくって使ってみてる。

serverkit-defaults

Mac OS Xには標準で defaults(1) というコマンドが用意されていて、このコマンドを利用するとMac OS X上のアプリケーションの設定を読み書きすることができる。serverkit-defaultsはこれをserverkitのリソースとして利用するためのプラグインで、「このドメインのこのキーにこの値が設定されていますように」という状態を定義できるようになる。設定値はYAMLやJSONで記述されるわけだけど、それをdefaultsで使える形式に変換するために色々やっている。その辺りの話は defaults(1) の出力内容をRubyで扱う - Qiita という記事に書いたりした。例えばこのレシピでDockが自動的に隠れる設定が有効化されてDockが再起動される。

resources: - type: defaults domain: com.apple.dock key: autohide value: 1 - id: restart\_dock type: command script: killall Dock

serverkit-rbenv

名前の通り、rbenvをserverkitで扱うためのプラグイン。rbenvが手元にインストールされていることを前提として、rbenvで任意のバージョンのRubyをインストールしたり、それをグローバルに使うRubyとして設定したりする。とりあえずまあ簡単な記述で適当なバージョンのRubyが入れられればええやろぐらいの気持ちでやってるので、細かいオプションとかは無いけど、必要になれば追加する構え。例えばこのレシピで、Ruby 2.2.0が入る。

resources: - type: rbenv\_ruby version: 2.2.0 global: true

Notify

ChefやAnsibleと同じようにNotifyの機能を入れたので、「このリソースに変更があったときにだけこのリソースを理想の状態にしてくれ」というのが実現できるようになった。例えばDockの設定を変えるとDockの再起動が必要なのだけど、変更されたときしか再起動してほしくないと思う。リソースのnotifyプロパティに配列でidを指定しておくと、resourcesプロパティに書かれたリソースの適用がひと通り完了した後に、今度はhandlersに書かれたのそのidを持つリソースが適用される。handlersに書かれるのは主に再起動とかなので、複数のリソースから同じnotifyが指定されていたとしても1度しか実行しないし、変更されていないリソースについてはhandlerを呼び出さない。

resources: - type: defaults domain: com.apple.dock key: autohide value: 1 notify: - restart\_dock handlers: - id: restart\_dock type: command script: killall Dock

今後

現状は、自分のMacの環境構築を自動化するために使っていって、そこで足りない機能を追加していっている。dotfiles/recipe.yml at master · r7kamura/dotfiles に自分のMac用のレシピがあるけど、Homebrewで何か入れてRuby入れてdefaultsで設定変えるぐらいしかまだ出来てない。クリーンインストールした直後のMacに適用するとすぐさま開発環境として使えるようになる、という状態にするにはいろいろ機能を足していく必要があると思う。

並行して、仕事で使ってるアプリケーションサーバのAMIをつくるのにいまChefを使っているけど、試しにそれと同等のことをServerkitでも実現できるようにしていこうとしていってる。こっちは色々要件があってしかも規模も大きいので、これをやっていくとログの機構の整理とか、テスト環境の整備とか、VagrantやDockerで簡単に試せるようにとか色々やっていく必要がありそう。