はじめに
前回の記事「Chefを使ったリモートサーバーのプロビジョニング方法」では、仮想環境上のUNIXマシン間のプロビジョニングについて解説しました。今回の記事では、物理マシンと仮想マシン間のプロビジョニング方法として、Windows上にプロビジョニングサーバーを構築する方法について解説します。これにより、物理マシンと仮想マシン間および、物理マシン間のプロビジョニングを行えるようになります。
物理マシンの環境
構築に使用する物理、仮想マシンの構成は、下記のとおりです。
マシン | 物理マシン(プロビジョニングサーバー) | 仮想マシン(クライアント) |
---|---|---|
OS | Windows 7 Ultimate | Debian 7.2.0 |
ホスト名 | PAPA | vagrant-packet-debian |
IPアドレス | 192.168.0.253 | DHCPサーバーにより取得 |
UNIX環境 | Cygwin 1.7.25(Setup Version 2.831) msysgit version 1.8.4-preview20130916 | n/a |
仮想化ソフトウエア | VirtualBox 4.2.18 r88780 |
インストールするソフトウエア
プロビジョニングサーバーにインストールするソフトウエアは、下記のとおりです。
ソフトウエア | バージョン |
---|---|
*ruby | ruby-1.9.3p194 |
*gem | gems-1.8.24 |
*bundler | Bundler version 1.3.5 |
*Vagrant | version 1.2.7 |
*VirtualBox | VirtualBox 4.2.18 r88780 |
Packer | v0.3.11 |
Veewee | 0.3.12 |
Chef Solo | chef-11.8.0 |
Knife Solo | knife-solo-0.4.0 |
Berkshelf | berkshelf-2.0.10 |
*(アスタリスク)の付いたソフトウエアは、これまでの記事の中でインストール済みのソフトウエアです。
仮想化ソフトウエアのインストール
Vagrantおよび、VirtualBoxは、「開発者必見!仮想環境の構築を自動化する方法とは」でインストールしたバージョンをそのまま使用します。
VirtualBoxおよび、Vagrantに関しては、物理マシンにインストールしているプログラムよりも新しいバージョンがリリースされていますが、バージョンの組み合わせによっては、Box作成がエラーになりますので、4.2.18/1.2.7の組み合わせで使用することを推奨します。ただし、全てのVagrantバージョンとの組み合わせを検証しているわけではありません。
VirtualBox | Vagrant | Packer+Vagrant Boxの作成可否 |
---|---|---|
4.2.18 | 1.2.7 | 問題無し |
1.3.5 | vagrant box addの動作が不安定 | |
4.3.2 | 1.2.7 | Box作成不能 |
1.3.5 | vagrant box addの動作が不安定 |
総じて、Vagrant 1.3系は動作が不安定になったり、box addに異常な時間が掛かる(できない訳では無い)ため、1.2.7にしています。その場合、必然的にVirualBoxは、4.2.18のみになりますので、最新の4.3.2にバージョンアップした場合は注意が必要です。
-
Packerのインストール
公式サイトから、0.3.11_windows_386.zipをダウンロードします。ここでは、~/sbinにダウンロードし解凍しています。
$ mkdir -p ~/sbin && cd ~/sbin $ curl -Lo 0.3.11_windows_386.zip https://dl.bintray.com/mitchellh/packer/0.3.11_windows_386.zip $ unzip -q 0.3.11_windows_386.zip $ rm -f 0.3.11_windows_386.zip
-
Veeweeのインストール
Veeweeを使ってVagrant用仮想マシンイメージを作成するでは、githubからクローンした後、bundleを使用してインストールしていましたが、今回は、gemコマンドでビルドを行いインストールします。ここでは、~/workにクローンした後、ビルド&インストールしています。
$ mkdir -p ~/work && cd ~/work $ git clone git://github.com/jedi4ever/veewee.git $ cd veewee $ gem build veewee.gemspec $ gem i --local veewee-0.3.12.gem --no-ri --no-rdoc
-
バージョン確認
ソフトウエアのバージョンを、以下のコマンドを実行して確認します。
$ packer -v && vagrant -v && veewee version && vboxmanage -v
Packer+Vagrant BOXの作成
Packer用いて、Vagrant用のBoxを作成します。ここでは、Cygwin Terminalを使用してBoxを作成します。
-
veeweeによるBoxテンプレートの作成
veeweeを利用すると簡単にインストールしたいOSのテンプレートを作成できますので、今回インストールするDebian 7.2.0のテンプレートを作成します。
ここでは、~/mybox/veeweeを作業フォルダにしています。$ mkdir -p ~/mybox/veewee && cd ~/mybox/veewee $ veewee vbox templates
実行した2013年11月13日時点では、195個のテンプレートが登録されていました。 今回は、’Debian-7.2.0-i386-netboot’テンプレートを使用します。
$ veewee vbox define 'vagrant-veewee-debian' 'Debian-7.2.0-i386-netboot'
veewee-vagrant-debianというBox名でテンプレートを作成すると、~/mybox/veewee/definitionsフォルダ配下に指定したBox名のフォルダが作成され、必要なファイルが生成されます。
veeweeの場合同一のBox名を指定して実行するとエラーになり、packerのような強制上書きオプションもありませんので、同一Box名で新しい定義を作成したい場合、リネームまたは、削除して実行する必要があります。 また、veeweeのオプションに、–workdir=DIRがありますが、このオプションを付けてBoxを作成する場合、カレントフォルダがDIRになっていないと、Boxの定義ファイルを探すことができません。
このため、Boxを定義したフォルダに移動した後、Boxの作成を行う必要がありますので、注意が必要です。今回の場合、~/mybox/veeweeでBoxの定義を作成していますので、~/mybox/veeweeでBoxを作成する必要があります。 -
構成ファイル作成
PackerやVagrantを利用した開発環境の構築を参考にして、veeweeで作成したBoxテンプレートファイルを元に、以下のファイルを編集します。
ただし、config.jsonは、veeweeでは生成されませんので、新規作成します。
ここでは、~/mybox/packer/vagrant-debianを作業フォルダにしています。base.sh vagrant.sh config.json preseed.cfg
-
Vagrant Boxの作成
$ packer validate config.json $ packer build -force config.json
-forceオプションを指定すると、config.jsonで指定したBoxファイルを強制的に上書きします。
正常終了すると、/export/vagrant/vagrant-packaer-debian.box が作成されます。
クライアントの準備
作成したVagrant Boxを起動します。
ここでは、~/mybox/vagrant/packer-vagrant-debianを作業フォルダにしています。
-
Boxの初期設定
Packerで作成したBoxをVagrantで利用するために、VM名 BOX名を指定して初期化します。
$ mkdir -p ~/mybox/vagrant/packer-vagrant-debian && cd ~/mybox/vagrant/packer-vagrant-debian $ vagrant init packet-vagrant-debian
-
Vagrantfileの編集
Boxに対してブリッジネットワークを追加するため、Vagrantfileに以下の行を追加します。
Vagrant::Config.run do |config| config.vm.network :bridged end
Packerのconfig.json中で、modifyvmを使ってNICを2枚作ることもできるようですが、VBoxManage起動時にエラーとなりましたので、Vagrantの起動時にブリッジインターフェースのNICを追加しています。 ブリッジネットワークを追加すると、物理マシンのネットワークと同一セグメントのマシンになりますので、この作業を忘れると、物理マシンからBoxに接続できなくなります。ただし、vagrant sshでは接続可能です。
-
Box起動
以下のコマンドを実行して、Boxを起動しsshで接続します。
$ vagrant box add packer-vagrant-debian /export/vagrant/packer-vagrant-debian.box $ vagrant up $ vagrant ssh
vagrant up実行時に、「Configuring and enabling network interfaces…」が表示されて、ブリッジネットワークが利用可能になります。
-
ネットワーク確認
Boxに接続できましたので、以下のコマンドを実行してネットワークの確認を行います。
$ sudo ifconfig -a
eth1に割り当てられたIPアドレスを確認します。筆者の環境では、LAN上にDHCPサーバーがあるため、ブリッジネットワークに追加したNICに対してDHCPでIPアドレスが割り当てられています。
もし、DHCPサーバーが利用できない環境の場合、vagrant sshで接続した後、staticなIPアドレスを設定して下さい。
サーバーの準備
Git Bash上で、Boxのプロビジョニングを行うため、サーバー(Windows)側の設定を行います。
作業は、Git Bashまたは、Cygwin Terminal上で行います。
-
管理者公開鍵の作成
$ ssh-keygen -t rsa -N "" -f ~/.ssh/manager_rsa_key
パスフレーズを設定していない、RSA公開鍵が作成されます。
Box接続時に、作成された公開鍵を利用するようにSSH構成ファイルを編集します。
$ vi ~/.ssh/config Host 192.168.0.123 IdentityFile ~/.ssh/manager_rsa_key User vagrant
-
Chef、knife-solo、Berkshelfのインストール
前回の記事と同様に、インストールします。
$ gem i chef --no-ri --no-rdoc $ gem i knife-solo --no-ri --no-rdoc $ gem i berkshelf --no-ri --no-rdoc
-
バージョン確認
$ ruby -v && gem -v && bundle -v $ chef-solo -v && knife -v && berks -v
-
knifeの初期設定
前回の記事と同様に、knifeの初期設定を行います。
$ knife configure
-
Cookbookリポジトリの作成
前回の記事と同様に、Cookbookリポジトリを作成します。
リポジトリ作成以降の作業は、全て指定したリポジトリフォルダに移動して行います。今回の場合、~/chef-repoとなります。$ knife solo init chef-repo
-
Berkshelfの初期化
前回の記事と同様に、Berkshelfを初期化します。
$ cd chef-repo $ berks init
初期化が終了したら、~/.chef/knife.rbに以下の行を追加します。
$ vi ~/.chef/knife.rb cookbook_path [ '/home/punio/chef-repo/site-cookbooks', '/home/punio/chef-repo/cookbooks' ]
~/.chef/knife.rbの編集時には、OPS Community登録時に取得した秘密鍵(PEMファイル)も合わせてclient_keyとして設定します。
クライアントSSH設定
-
管理者公開鍵の登録
サーバー側で作成した管理者公開鍵を、vagrantユーザーに登録します。
$ scp ~/.ssh/manager_rsa_key.pub vagrant@192.168.0.123:/tmp $ vi ~/.ssh/authorized_keys
-
sshd設定
クライアントのSSHサーバーの設定を、以下のとおり修正します。
$ sudo vi /etc/ssh/sshd_config UsePAM no PermitRootLogin no PPasswordAuthentication no
編集が終了したら、SSHサーバーを再起動します。
$ sudo /etc/init.d/ssh restart
-
管理者ログインの確認
サーバーから、Boxへ管理者公開鍵でログインできるか確認します。
$ ssh 192.168.0.123
~/.ssh/configでユーザーアカウントと認証鍵(秘密鍵)を設定しているため、パスフレーズ無しでクライアントに接続できます。
プロビジョニングの実行
これまでの作業で、プロビジョニングに必要な設定は全て終了しました。
ここでは、プロビジョニングの動作確認を行います。
$ knife solo prepare 192.168.0.123 $ knife solo cook 192.168.0.123
prepareによってノードファイルが作成されますが、ノードファイル中のrun_listが空のためクライアントでは、Cookbookは実行されません。
cat ~/chef-repo/nodes/192.168.0.123.json {"run_list":[]}
ここまでの段階で、プロビジョニングに必要な作業は完了ですので、記事を参考にして自作、公開Cookbookを実行してみて下さい。
まとめ
ここまで、Windows上のGit Bashおよび、Cygwinを使用してWindowsマシンから、Vagrant Boxのプロビジョニングについて解説しました。VagrantやPackerによるBoxのプロビジョニングではできない、クライアントサーバー間のプロビジョニングは、プロビジョニング情報を一元管理できるメリットだけで無く、物理サーバーを含めたプロビジョニングも実現できます。今回解説した記事を参考にして、Windows環境でプロビジョニングサーバーの構築にチャレンジしては如何でしょうか。