Chef-soloでプロキシ設定の切り替え

今までサーバー設定なんかは Fabric でいろいろやってきたわけなんですが、 Trac をホストしてた Windows サーバーのリプレースをする必要がでてきたので、最近注目してた Chef でいろいろやってみました。

が、 Ruby 初心者にはいろいろ難しく、なんといってもあまり Windows 向けではないので、結構よく詰まります。なので備忘録を兼ねてちょっとずつメモしていく予定。


Chef-solo の場合、 solo.rb という設定ファイルにツール設定をしていくんだけども、大抵はファイルキャッシュとクックブックの場所を設定するだけでいい。

# solo.rb
# -*- encoding: utf-8 -*-
file_cache_path File.join(Dir.pwd, 'cache')
cookbook_path   File.join(Dir.pwd, 'cookbooks')

普段はこれで問題ないんだけども、職場などプロキシ環境下にいるときは設定を追加しないといけない。

# solo.rb
# -*- encoding: utf-8 -*-
file_cache_path   File.join(Dir.pwd, 'cache')
cookbook_path     File.join(Dir.pwd, 'cookbooks')
http_proxy        "http://path/to/proxy:8080"
https_proxy proxy "http://path/to/proxy:8080"

別のマシンをセットアップするならともかく、1台のマシンをセットアップするのに別の設定ファイルを用意するのはなんか違う、ということで自動的にプロキシの設定ありなしを判断するようにしてみたのがこれ。

# -*- encoding: utf-8 -*-
file_cache_path File.join(Dir.pwd, 'cache')
cookbook_path   File.join(Dir.pwd, 'cookbooks')


require('win32/registry')
key = 'Software\Microsoft\Windows\CurrentVersion\Internet Settings'
reg = Win32::Registry::HKEY_CURRENT_USER.open(key)
if reg["ProxyEnable"] == 1
    proxy = "http://" + reg["ProxyServer"]
    http_proxy  proxy
    https_proxy proxy

    ENV['http_proxy'] = proxy
end

単純にIEなどで使われるインターネット接続設定をレジストリから取得してるだけ。環境変数ENVに[http_proxy]をセットしてるのは、ほかのツールなどで使われることを想定するため。これでどこでも開発が進められますね。