Windows7 64bitでChefとKnife-soloを実行

MacであればVagrantとChefの環境は比較的簡単に構築できます。
ですが会社だと政治的な理由?からどうしてもMacを利用できない。けどVagrantとChefを使いたいということがあるのではないかと思います。
私もChef実践入門を購入して現在4章の途中ですが、あっという間にVagrantとChefに落ちちゃいまして会社でも使いたい、と言ってみたい。
ですが現在Windowsでの開発がメインとなっておりいきなりMacに移行するのはさすがに難しいのでとりあえずWindowsでやってみて社内の人に便利さを感じてもらって数の暴力で、みたいなことを考えました。 WindowsでVagrantとChefをインストールしてknifeコマンドでサクッとプロビジョニングできるぜーとと思ったら、挫折の繰り返しでした。
いろいろなサイトを参考にさせていただいてようやく動作するようになりましたので、備忘録として残したいと思います。

参考にさせていただいたサイト

今回、自分の知識だけではここまで環境構築することができませんでした。
以下のサイトを参考にさせていただきました。
Windows に Vagrant + knife-solo環境を作る手順 2014年4月版
Windows の MinGW 環境で vagrant ssh するには

インストールに使用したバージョン及びファイル名

  • chef-client-11.12.4-1.windows
  • mingw-get-setup
  • vagrant_1.6.3
  • VirtualBox-4.3.12-93733-Win

※VirtualBoxのインストールは記事では触れていませんが、全てデフォルトで最速インストールしています。

1 Vagrantのインストール

公式サイトからVagrantをダウンロードしてインストールします。
インストールパスはデフォルトを使用しました。
インストールしたパスは以下になります。

C:\HashiCorp

2.Chefのインストール

公式サイトからChefをダウンロードしてインストールします。
インストールパスはデフォルトを使用しました。

C:\opscode

3.MinGWのインストール

公式サイトからmingw-get-setup.exeをダウンロードしてインストール。
インストールパスはデフォルトを使用しました。

C:\MinGW

4.mysys-opensshとmsys-rsyncのインストール

次に、mysys-opensshとmsys-rsyncをインストールします。
参考サイトにも記載がありますが、該当パッケージをインストールすると依存するパッケージも自動的にインストールされます。
C:\MinGW\mingw-get.exeすると以下の様な画面になりますので、mysys-opensshとmsys-rsyncをインストールします。
f:id:beeete2:20160709100829p:plain

環境変数のPATHに以下を追加します。

C:\MinGW\bin;C:\MinGW\msys\1.0\bin

テキストエディタでC:\MinGW\msys\1.0\etc\fstabを開いて以下を追加します。

c: /cygdrive/c

自分が試した感じだとfstabというファイルが存在しなかったので同じ階層にfstab.sampleというファイルがあると思いますので、これをfstabにリネームして使いました。
参考サイトの「MinGW/MSYS から ssh と rsync をインストール」の項目も参考にしてください。

5.knife-soloのインストール

参考にさせていただいたサイトとはインストール方法が異なりますがこの記事を書いている2014年6月5日現在は以下の方法でインストールを行えました。

gem install knife-solo
gem install berkshelf

結構時間がかかります。

6.今までの動作確認

ここまでである程度は動作するようになっています。

仮想イメージを取得

今回はCentOS6.5を使いました。
Bentoプロジェクトからopscode-centos-6.5を追加します。

vagrant box add opscode-centos-6.5 http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_centos-6.5_chef-provisionerless.box

Vagrantを使って仮想サーバーを起動

適当にフォルダを作成します。
フォルダ内で

vagrant init opscode-centos-6.5

IPアドレスを設定します。
フォルダ内にVagrantfileというファイルがあるのでテキストエディタなどで開きます。
ファイル内に以下の行がコメントアウトされていると思いますので、コメントアウトを外します。

config.vm.network "private_network", ip: "192.168.33.10"

これで、ホストからは192.168.33.10で接続することができます。

先ほど追加したCentOS6.5を使った環境が出来上がりますので、起動します。

vagrant up

多分、起動すると思います。puttyなどで 192.168.33.10 で接続しvagrantユーザーでログインできます。パスワードもvagrantです。

7.SSHの設定

後ほどknife-soloを実行しやすくするためにSSHの設定を行います。
まずsshの設定フォルダを作成します。
Windowsのユーザーホームフォルダに.sshというフォルダを作成します。
以下のコマンドで作成できます。

mkdir .ssh

フォルダ内で以下のコマンドを実行します。

vagrant ssh-config --host centos >> tmpconfig.txt

同じフォルダ内にtmpconfig.txtが書き出されると思いますのでメモ帳で開くとSSHのホスト設定が書かれています。 このファイルを

HostName = 192.168.33.10
port = 22

に修正して、先ほど作成した.sshフォルダにコピーします。
※すでに~/.ssh/configが存在する場合は末尾に追記します。

8.仮想サーバーにChef Soloのインストール

仮想サーバー(ゲストOS)にChef Soloのインストールを行います。

knife solo bootstrap centos

9.knife-soloを実行

いよいよ問題のknife-soloを動作させます。
とりあえずChefリポジトリを作成します。
先ほど作成したフォルダ内(Vagrantfileが存在するフォルダ)で以下のコマンドを実行します。

knife solo init .

自動的にフォルダやファイルが作成されます。

動作確認用にApacheのクックブックを作成します。

knife cookbook create apache -o site-cookbooks

Apacheをインストールするレシピを書きます。
./site-cookbook/apache/recipes/default.rb

package "httpd" do
    action :install
end

nodeのrun_listに追加

Vagrantfileと同じ階層にnodes/centos.jsonというファイルがあると思いますので、以下のように変更します。

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

knife-soloの実行

いよいよ実行する準備が整いましたので、knife-soloを実行します。 (事前にvagrant upで仮想サーバーを起動させておいてください。)

knife solo cook centos

putty等で仮想サーバーにログインして、Apacheがインストールされたか確認します。

rpm -q httpd

正常にインストールが完了しているとインストールされたApacheのパッケージ名が表示されます。

結びに

MacでChefとVagrantをインストールしてknife-soloを実行するのはそれほど時間がかからなかったのですが、Windowsだと若干敷居の高いものになってしまいました。
もしかしたらVagrantのプラグイン関係で動かないものもあるかもしれませんが、それでもknife-soloが実行できるようになったのは非常に大きいと思います。
参考させていただいたサイトに本当に感謝です。
また、余談ですがコマンドプロンプトでも操作可能ですが非常に操作しにくいので、Console2などを使って作業をすると少しイライラはしなくなります。
自分は記事を書くためにあえてコマンドプロンプトで作業しましたが、なかなかにしんどかったです。

うまくいかない場合

knife-solo実行時にrsyncでエラーが出てうまく実行できない

MinGWでmysys-opensshとmysys-rsyncが選択されているか確認。opensslのように少し間違ってしまうパッケージがあるので要確認。
また、作業ドライブをCドライブ以外のディレクトリ、たとえばDドライブなどにした場合はfstabに以下のように記載が必要。

# C:\MinGW\msys\1.0\etc\fstab内の記載例
c: /cygdrive/c
# ↓Dドライブ用の設定
d: /cygdrive/d