読者です 読者をやめる 読者になる 読者になる

Folioscope

プログラミング/Unix系/デザイン/CG などのメモがもりもり

複雑な設定ファイルを動的に生成

はじめに

「巨大化した設定ファイルを階層的に書きたい...」だとか「実行する環境によって読み込む設定を動的に変えたい...」とか思ったことはありませんか? RubyDSLのように自由度が高かったらすぐに実現できますが、設定ファイルはそうにはいきません。 しかし名前付きパイプを経由することで、言語問わず、自分が書いたプログラムの出力を、設定ファイルとして使うことができます。

SSHの例

ここでは例として、SSHの設定を対象にします。 まず、次のようなRubyプログラムを~/bin/gen_ssh_configに置きます。

このプログラムの出力は次のようになります。

Host git
hostname git.example.com
user git

Host web
hostname web.example.com
port 11111
user admin

この出力を通常のSSHの設定同様、ファイルとして扱うために、~/.ssh/configに名前付きパイプを作ります。

mkfifo ~/.ssh/config

そして例のプログラムで ~/.ssh/config にそぉいとリダイレクトすれば完成です。

while true; do ~/bin/gen_ssh_config >~/.ssh/config; done &

これであたかもSSHの設定ファイルのように、~/.ssh/config にアクセスできるようになりました。 SSHからも正常にロードされるかと思います。 これらの処理を.bash_profileなどに記述すれば、自動でプロセスが起動して便利です。

おわりに

この例を応用すれば、例えば社内からはサーバーに直接ログイン、社外からは踏み台を経由してログインするなどと行った高度な設定も可能となりました。 また各設定ファイルを生成するラッパライブラリを作ると、一つの言語で複数の複雑な設定ファイルも生成できます。 夢が広がりますね!