Chef SoloでTracLightningぽい環境を構築してみた
Chefが面白そうなのでいろいろやってみた結果、TracLightning+hglightぽい環境を構築できるようになったのでまとめを書いてみることにした。TracLightningと違うのはSubversion/MavenがないとかTracプラグインが最小限しかないくらいかな。
動作確認は次の環境で行った。
- Chef 11.4.0
- Windows 7 SP1 Professional(x86)
- Windows Server 2008 R2 Standard
- Windwos Server 2012 Standard
Chefリポジトリはここで、cookbook名はtracwithhgとした。
tracwithhgがやっていること
- Visual C++ 2008 ランタイムのダウンロードとインストール
- Python の動作に必要なため
- Python 2.7.4のダウンロードと"C:/Trac/python"への展開
- easy_install のインストールも
- Mercurial 2.5.4のダウンロードとインストール
- attribute(node['hg']['need_build'])にtrueを指定すると、MinGWをインストールして、ソースからビルド後インストールする。
- Trac 1.0.1のダウンロードとインストール
- Wikiに関しては TracJa 1.0を使っている。
- プロジェクト作成時に wiki load してるだけ。
- TracAccountManagerPlugin 0.4.3のダウンロードとインストール
- 認証方式にDigestを指定した場合のみ
- 認証方式にSSPIを指定した場合はインストールされない
- TracMercurialPlugin 1.0.0.3のダウンロードとインストール
- Apache 2.2.24のダウンロードと"C:/Trac/apache"への展開
- ファイアーウォールの例外にapache追加
- JRE 7u21のダウンロードと"C:/Trac/jre"への展開
- .NET Framework 3.5 SP1 の有効化
- JenkinsのWindowsサービス化に必要
- Windows 8/Windows Server 2012 ではデフォルトで無効化されているため必要
- Jenkins 1.514のダウンロードと"C:/Trac/jenkins"への展開&Trac(Jenkins)のWindowsサービス化
- Trac(Apache)のWindowsサービス化
準備
- Installing Chef Client on Windows - Chef - Opscode Open Source WikiからChefのインストーラをダウンロードしてインストール
- toruuetani / Chef-repository-TracWithHg ― Bitbucket を任意の場所(「C:/Chef」とか)にclone
- Chefに同梱されている「win32/registry.rb」を修正(参照:Chef Solo で invalid byte sequence in Windows-31J / invalid byte sequence in UTF8 に遭遇したときの対処をいくつか - 記憶は削除の方向で)
実行方法
cloneしてきたChefリポジトリに同梱されている「install.bat」を管理者権限で実行するだけ。
※Windows Server 2012 の場合、インストールメディアがDドライブにセットされている必要あり。Dドライブ以外にインストールメディアをセットする場合、attribute(node['netfx3']['source'])を環境に合わせて修正すること。
プロジェクト作成方法
create-hg-project.batを実行するだけ。
最低限Tracプロジェクト名を指定する必要あり。Mercurialリポジトリをcloneする場合はcloneするURLを指定すること。
既存プロジェクトに管理するMercurialリポジトリを追加する場合、create-hg-append.batを実行してTracプロジェクト名とMercurialリポジトリ名を指定する。Mercurialリポジトリをcloneする場合はcloneするURLを指定すること。
Digest認証の場合、初期ユーザーとして次の2アカウントを用意する。
- アカウント: admin, パスワード: admin
- アカウント: guest, パスワード: guest
TODO
- Jenkinsでプロジェクト作成
- Jenkinsでバックアップ
- Jenkins関連ができたらhglightにも反映すること
Chef Solo で invalid byte sequence in Windows-31J / invalid byte sequence in UTF8 に遭遇したときの対処をいくつか
- OS は Windows 7 SP1, Windows Server 2008 R2
- Chef は Fast Start Guide for Windows - Chef - Opscode Open Source Wiki からダウンロード => chef-client-11.4.0-1.windows.msi
- Chef リポジトリは ここ
Chef-solo に同梱されている Ruby は 1.9.3p286 なので、エンコーディングが 1.8.x に比べて改善されているらしい。が、やはり日本語 Windows を使ってるといろいろハマるのでメモ。
前提
環境変数 LANG がセットされていない場合、
ECHO %LANG% => (空)
外部エンコーディングは Windows-31J
ruby -e "p Encoding.default_external" => #<Encoding:Windows-31J>
最近の風潮としてエンコーディングの基本はUTF8なので、環境変数 LANG をセットしておく。
SET LANG=ja_JP.utf8
そうすると外部エンコーディングも UTF8 になる。
ruby -e "p Encoding.default_external" => #<Encoding:UTF-8>
で、ソースコードはマジックコメントでUTF8を指定しておく。
# -*- encoding: utf-8 -*-
基本はこれで問題ないんだけども、 日本語 Windows では Windows-31J と付き合わないわけにはいかないのでまれに問題がおきる。
windows_batch リソース
何らかのコマンドに対して日本語で引数を指定する場合次のように書くわけだが、受け側ではShiftJISを期待してる。
ところがマジックコメントでUTF8を指定しているため、受け側には文字化けした文字列がわたってしまう。
windows_batch "sample" do code = <<-EOH hoge 日本語 EOH end
なのでコマンドに日本語を渡したい場合は Windows-31J でエンコードしましょう。
windows_batch "sample" do tmp = <<-EOH hoge 日本語 EOH code tmp.encode('Windows-31J', 'utf-8') end
windows_package リソース
「アプリケーションの追加と削除」に登録されるようなアプリケーションをインストールしてくれる便利なコマンドなんだけど、やっぱり日本語が入るとエラーが発生します。
難点なのが、目当てのアプリケーションに日本語が入ってなくても、アプリケーションがインストールされているかのチェックでレジストリを参照すること。このときに日本語を含むアプリケーションがあるとエラーが発生してしまう。
windows_package "Fuga Application" do source "path/to/fuga" installer_type :customoptions "/q" action :install end
これはレシピをいじっても仕方なくて、同梱されている Ruby ライブラリの問題。具体的には win32/registry.rb 。これを以下のように修正してあげればいいい。
+++ C:/opscode/chef/embedded/lib/ruby/1.9.1/win32/registry.rb Thu May 09 11:12:35 2013 @@ -165,11 +165,14 @@ dlload "kernel32.dll" end FormatMessageA = Kernel32.extern "int FormatMessageA(int, void *, int, int, void *, int, void *)", :stdcall + FormatMessageW = Kernel32.extern "int FormatMessageW(int, void *, int, int, void *, int, void *)", :stdcall def initialize(code) @code = code msg = "\0".force_encoding(Encoding::ASCII_8BIT) * 1024 - len = FormatMessageA.call(0x1200, 0, code, 0, msg, 1024, 0) - msg = msg[0, len].force_encoding(Encoding.find(Encoding.locale_charmap)) + #len = FormatMessageA.call(0x1200, 0, code, 0, msg, 1024, 0) + len = FormatMessageW.call(0x1200, 0, code, 0, msg, 1024, 0) * 2 + #msg = msg[0, len].force_encoding(Encoding.find(Encoding.locale_charmap)) + msg = msg[0, len].force_encoding("UTF-16LE").encode(Encoding.find(Encoding.locale_charmap)) super msg.tr("\r", '').chomp end attr_reader :code
Chef-soloでプロキシ設定の切り替え
- OS は Windows 7 SP1, Windows Server 2008 R2
- Chef は Fast Start Guide for Windows - Chef - Opscode Open Source Wiki からダウンロード => chef-client-11.4.0-1.windows.msi
- Chef リポジトリは ここ
今までサーバー設定なんかは 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]をセットしてるのは、ほかのツールなどで使われることを想定するため。これでどこでも開発が進められますね。