chef-soloを用いてWindowsにソフトウェアをインストールしてみよう

前回に引き続き、chef-soloを用いてWindowsマシーンにソフトウェアのインストールをしてみます。
一度きちんとしたレシピを作っておくと、新しいマシーンを手に入れたときに「chefのインストール→その他が全部入る」というフローができてとっても楽ちんですよ!

Windows向けの便利コマンドをインストールする

まだインストールしていない方は前回の記事を参考にしてWindows向けの便利コマンドをインストールしておいてください。
以下のようなコマンドが使えるようになります。

  • windows_auto_run
    • スタートアップの設定ができます
  • windows_batch
    • コンソールコマンドを使った操作ができます
  • windows_feature
    • コンピューターの「役割の管理」を設定できます
  • windows_package
    • msi形式のインストーラーをオプション等を指定しながらインストールできます
  • windows_reboot
    • コンピューターの再起動を制御します
  • windows_registry
  • windows_path
    • System Pathの設定をします
  • windows_zipfile
    • Zip形式のファイルを解凍します

msi形式のソフトウェアをインストールする

まずはmsi形式のインストーラーを用いたインストールを行ってみたいと思います。
opscodeが公開しているcookbookで7-zipがちょうどよいサンプルとなっていますので、こちらを使うことにしましょう。

1. opscodeのcookbooksから7-zipのcookbookをダウンロードして展開する
今回はC:\opscode\chef-repo\cookbooks\7-zipに展開しました。

2. 該当のcookbookを使うように設定ファイルを作ります。

> echo . >> c:\opscode\chef-repo\.chef\7zip.json
> notepad.exe c:\opscode\chef-repo\.chef\7zip.json

7zip.json

{
     "run_list": ["recipe[windows]"]
}

3. proxy越しにインターネットアクセスをする必要がある場合は設定ファイルに記述します

> notepad.exe .chef/solo.rb

solo.rb

http_proxy "http://proxy.example.com:80"
https_proxy "http://proxy.example.com:80"

4. chef-soloを実行します

> chef-solo -c .chef/solo.rb -j .chef/7zip.json

エラーが出ていなければインストール成功です。
このサンプルではパスを通すように設定されていますので、7zipのコマンドが使えるようになっているはずです。
試しにコンソールを新しく立ち上げて以下のコマンドを実行してください。

> 7z --help

ここでUsageが表示されたら成功です。

zip形式のソフトウェアをインストールする

つぎにzip形式のソフトウェアをインストールしてみましょう。これにはよいサンプルが無いので、自分でrecipeを書いてみます。
インストールするソフトウェアはVim-Winを使います。

1. cookbookを作る
knifeでcookbookの雛形を作ります。

> knife cookbook create vim
** Creating cookbook vim
** Creating README for cookbook: vim
** Creating metadata for cookbook: vim

2. recipeを作る
recipes\default.rbを編集してレシピを作りましょう。今回は以下のようなフローで動かす必要があります。

  • zipファイルをダウンロードして展開する
  • 展開したバイナリにパスを通す
  • .vimrcの雛形を生成する

それぞれ、以下のクラスを使います。

  • windows_zipfile
  • windows_path
  • template

今回はこんな感じで書きました。

recipes\default.rb

#download and install
windows_zipfile node['vim']['home'] do
  source node['vim']['url']
  path node['vim']['home']
  action :unzip
  not_if {::File.exists?("#{node['vim']['version']}\\vim.exe")}
end

# update path
windows_path node['vim']['version'] do
  action :add
end

# create .vimrc
template "#{ENV['USERPROFILE']}\\.vimrc" do
     source "vimrc.erb"
     variables({
          :syntax => "syntax on",
          :fileencodings => "utf-8,cp932",
          :encoding => "cp932",
          :backspace => "2",
          :tabstop => "2",
          :shiftwidth => "2",
          :softtabstop => "0"
     })
     action :create
end

3. attributeを作る
recipeで参照するパラメーターをattributeに設定します。Vim-Winは32bit版と64bit版があるので、OSによってインストールするバイナリを変更する必要があります。

attributes\default.rb

default['vim']['home']     = "#{ENV['USERPROFILE']}\\bin\\vim"

if kernel['machine'] =~ /x86_64/
     default['vim']['url']                    = "http://vim-win3264.googlecode.com/files/vim73-x64.zip"
     default['vim']['version']               = "#{ENV['USERPROFILE']}\\bin\\vim\\vim73"
else
     default['vim']['url']                    = "http://vim-win3264.googlecode.com/files/vim72-376.zip"
     default['vim']['version']               = "#{ENV['USERPROFILE']}\\bin\\vim\\vim72"
end

4. templateを使う
.vimrcもついでに作成しましょう。.vimrcの設定部分をerbに切り出し、recipeからバインドできるようにしておくと管理が楽かもしれません。今回はこちらから.vimrcの設定をパクらせてもらいました。

templates\default\vimrc.erb

<%= @syntax %>

set number
set fileencodings=<%= @fileencodings %>
set encoding=<%= @encoding %>
set termencoding=<%= @encoding %>

set backspace=<%= @backspace %>

set expandtab
set tabstop=<%= @tabstop %>
set shiftwidth=<%= @shiftwidth %>
set softtabstop=<%= @softtabstop %>
set smartindent

set incsearch

5. chef-soloでインストール実行*1

> chef-solo -c .chef\solo.rb -j vim.json

うまくいきましたか?自分用のcookbooksを作成してgithubやbitbucketなどに上げておけば、新しい端末にあっという間に開発環境を整えることができます。是非やってみてください!

*1:%USERPROFILE%にフォルダを作るので、管理者としてコンソールを実行してください