WindowsのVagrant環境でchefを実行する方法

Tag:

Windows上でVagrantを利用し作成した仮想マシン上にknife-soloでクックブックを転送し、chef-soloを実行させてみます。

大まかな手順は以下の通りです。
1. Windows上でVagrantを利用し仮想マシンを作成
2. Windows上でsshとrsyncを使うための準備
3. ローカル環境でchefを利用するための準備
4. 仮想マシン上にchefをインストール
5. ローカル環境でクックブックを作成
6. クックブックのレシピには「apacheをインストールして起動させる」ための設定を記述
7. 仮想マシン上にクックブックを転送して、chef-soloを実行
8. ブラウザで仮想マシンのIPにアクセスし、Webサーバーが起動しているか確認

基礎知識

Chef関連

Chef
Rubyで実装されたプロビジョニングツール。サーバの状態をソースで管理。サーバ構築の自動化に利用。
Chef Solo
Chefのスタンドアロン版(1台のサーバ内ですべて完結させる)。

※注意
この記事ではChef-soloを利用してますが、最新版にChef-soloは存在しません。Chef-clientのlocalモード(Chef-Zero)を利用します。
knife
Chefの付属ツール。
knife-solo
knifeの拡張プラグイン。ローカルで作ったクックブックをリモートに転送してchef-soloコマンドを実行させることができる。
berkshelf
クックブックの依存関係を管理するツール。
リポジトリ、クックブック、レシピの関係
リポジトリ
 - クックブック
  - レシピ
  - レシピ
 - クックブック
  - レシピ

その他

Vagrant
VirtualBoxなどの仮想化ソフトウェア上で仮想マシンを簡単に立ち上げるためのRuby製ツール。
Git Bash
msysgitをインストールすると、「Git Bash」を利用できるようになります。ここでは、sshのconfigファイルを作成する際に利用。
MinGW
Windowsでsshやrsyncコマンドを利用するために利用。

仮想マシンの作成

今回は、「C:\chef_test」フォルダを新規に作成し、このフォルダ上で仮想環境を作成していきます。boxイメージは、「bento/centos-6.7」を利用します。

1. コマンドプロンプトを開き「C:\chef_test」に移動

cd c:\chef_test

2. Vagrantfileを作成

vagrant init bento/centos-6.7

3. ネットワーク設定

Vagrantfileを開き、ネットワーク設定箇所のコメントアウトを外します。

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

4. 仮想マシン起動

vagrant up

5. ssh関連の設定

「ssh “hostname”」でログインできるように設定します。

今回はhostnameを「cheftest」とします。下記コマンドを実行すると簡単にconfigファイルを作成できます。

vagrant ssh-config --host cheftest >> ~/.ssh/config

ただし、Windowsのコマンドプロンプトからだと上記コマンドは使えません。そこで、Git Bash上で上記コマンドを実行しました。

実行すると「~/.ssh」フォルダ配下にconfigファイルが作成されます。configファイルには次のような記述がされていました。

Host cheftest
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile c:/chef_test/.vagrant/machines/default/virtualbox/private_key
  IdentitiesOnly yes
  LogLevel FATAL

Git Bash上で「ssh cheftest」と実行すると仮想マシン上にログインできるようになりました。

windowsでsshとrsyncを使うための対応

MinGWのインストール

http://sourceforge.net/projects/mingw/files/にアクセスしmingw-get-setup.exeをダウンロードして実行します。
msys1
「Install」をクリックしてインストールを完了させます。

「mysys-openssh」「msys-rsync」のインストール

MinGWのインストールが完了するとデスクトップ上に下記アイコンが表示されます。
msys2
ダブルクリックして実行します。

「mysys-openssh」「msys-rsync」にチェックを入れます。
msys3

[Installation]-[Apply Changes]をクリックするとインストールされます。
msys4

環境変数設定

環境変数のPATHに次の記述を追加します。

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

パスの不具合対応

「C:\MinGW\msys\1.0\etc\fstab」に次の記述を追記します。fstabファイルがなければ作成してください。

c: /cygdrive/c

この対応をしないとknife-soloを実行した際、パス指定のエラーが発生してしまいます。

Chef関連の環境構築 | ローカル環境

コマンドプロンプトを開き、ローカル環境にchef関連のツールをインストールしていきます。

knife-soloのインストール

gem install knife-solo
chefやknifeも一緒にインストールされます。
下記エラーが表示される場合、DevKitをインストールしてください。

ERROR:  Error installing knife-solo:
        The 'libyajl2' native gem requires installed build tools.

Please update your PATH to include build tools or download the DevKit
from 'http://rubyinstaller.org/downloads' and follow the instructions
at 'http://github.com/oneclick/rubyinstaller/wiki/Development-Kit'

berkshelfのインストール

gem install berkshelf

Chef関連の環境構築 | 仮想マシン

仮想マシン上にchefをインストールさせます。コマンドプロンプト上で「C:\chef_test」に移動し下記コマンドを実行します。

knife solo bootstrap cheftest
※下記エラーが場合、「gem install net-ssh -v 2.9.3.beta1」を実行してください。
cannot load such file -- dl/import (LoadError)

下記は実行時に表示されたメッセージの一部です。
chef_solo_bootstrap
chefのインストールは成功してますが、rsyncのERRORがでてますね。ここでは、chefのインストールが成功すればいいので、とりあえずほっときます。(後で「knife solo cook」を実行する際にこのERRORについて記述します。)

ローカル環境には、「nodes」フォルダが作成されていました。
chef_solo_bootstrap2

Chefによるサーバ環境の設定

コマンドプロンプト上で「C:\chef_test」に移動し下記操作を実行します。

リポジトリ作成

knife solo init .

chef_solo

下記のようにChefに必要なファイルが作成されます。
chef_solo2

クックブック作成

「apache」というクックブックを「site-cookbooks」フォルダ内に作成します。

knife cookbook create apache -o site-cookbooks

chef_solo3

site-cookbooksフォルダにapacheクックブックが作成されます。
chef_solo4

apacheクックブック配下は以下の通りです。
chef_solo5

レシピを書く

「C:\chef_test\site-cookbooks\apache\recipes\default.rb」に下記内容を記述します。

package "httpd" do
  action :install
end

service "httpd" do
  action [ :enable, :start ]
end

apacheをインストールして起動させるためのレシピです。

Nodeオブジェクト設定ファイルを編集

「knife solo bootstrap」を実行した際、「C:\chef_test\nodes\cheftest.json」というファイルが作成されています。このファイルのrun_listにapacheのレシピを追記します。

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

  ],
  "automatic": {
    "ipaddress": "cheftest"
  }
}

仮想マシン上でchef-soloを実行

仮想マシン上にクックブックを転送して、chef-soloを実行します。下記コマンドを実行します。

knife solo cook cheftest

ここで下記エラーが出る場合があります。(「knife solo bootstrap」時にもでたエラーですね。)

Running Chef on cheftest...
Checking Chef version...
Uploading the kitchen...
command-line: line 0: Bad configuration option: ControlPersist
rsync: read error: Connection reset by peer (104)
rsync error: error in rsync protocol data stream (code 12) at /usr/src/rsync/
rsync-3.0.8/io.c(760) [sender=3.0.8]
ERROR: RuntimeError: Failed to launch command ["rsync", "-rL", "--chmod=ugo=r
                              (省略)

今回行った手順でもしこのエラーが発生した場合、次のように実行するとエラーを回避できるかもしれません。

knife solo cook cheftest --ssh-control-master no

以下は実行画面です。
chef_solo6

無事動作したようなのでブラウザ上からも動作確認してみます。

ブラウザ上で仮想マシンのIPにアクセスすると以下のようにapacheが起動されていることを確認できるかと思います。
chef_solo7

以上で完了です。Windowsでも動作させることができましたが、Macで使う場合に比べ大変ですね。ただWindowsを使わなければいけない場合もあるかと思うので参考にしてみて下さい。

スポンサーリンク