Windowsでプロビジョニングサーバーを実現する方法

1010-01:Windowsでプロビジョニングサーバーを実現する方法

はじめに

前回の記事「Chefを使ったリモートサーバーのプロビジョニング方法」では、仮想環境上のUNIXマシン間のプロビジョニングについて解説しました。今回の記事では、物理マシンと仮想マシン間のプロビジョニング方法として、Windows上にプロビジョニングサーバーを構築する方法について解説します。これにより、物理マシンと仮想マシン間および、物理マシン間のプロビジョニングを行えるようになります。

物理マシンの環境

構築に使用する物理、仮想マシンの構成は、下記のとおりです。

マシン物理マシン(プロビジョニングサーバー)仮想マシン(クライアント)
OSWindows 7 UltimateDebian 7.2.0
ホスト名PAPAvagrant-packet-debian
IPアドレス192.168.0.253DHCPサーバーにより取得
UNIX環境Cygwin 1.7.25(Setup Version 2.831)
msysgit version 1.8.4-preview20130916
n/a
仮想化ソフトウエアVirtualBox 4.2.18 r88780

インストールするソフトウエア

プロビジョニングサーバーにインストールするソフトウエアは、下記のとおりです。

ソフトウエアバージョン
*rubyruby-1.9.3p194
*gemgems-1.8.24
*bundlerBundler version 1.3.5
*Vagrantversion 1.2.7
*VirtualBoxVirtualBox 4.2.18 r88780
Packerv0.3.11
Veewee0.3.12
Chef Solochef-11.8.0
Knife Soloknife-solo-0.4.0
Berkshelfberkshelf-2.0.10

*(アスタリスク)の付いたソフトウエアは、これまでの記事の中でインストール済みのソフトウエアです。

仮想化ソフトウエアのインストール

Vagrantおよび、VirtualBoxは、「開発者必見!仮想環境の構築を自動化する方法とは」でインストールしたバージョンをそのまま使用します。
VirtualBoxおよび、Vagrantに関しては、物理マシンにインストールしているプログラムよりも新しいバージョンがリリースされていますが、バージョンの組み合わせによっては、Box作成がエラーになりますので、4.2.18/1.2.7の組み合わせで使用することを推奨します。ただし、全てのVagrantバージョンとの組み合わせを検証しているわけではありません。

VirtualBoxVagrantPacker+Vagrant Boxの作成可否
4.2.181.2.7問題無し
1.3.5vagrant box addの動作が不安定
4.3.21.2.7Box作成不能
1.3.5vagrant box addの動作が不安定

総じて、Vagrant 1.3系は動作が不安定になったり、box addに異常な時間が掛かる(できない訳では無い)ため、1.2.7にしています。その場合、必然的にVirualBoxは、4.2.18のみになりますので、最新の4.3.2にバージョンアップした場合は注意が必要です。

  1. 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
    
  2. 1010-02
  3. 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
    
  4. 1010-03
  5. バージョン確認

    ソフトウエアのバージョンを、以下のコマンドを実行して確認します。

    $ packer -v && vagrant -v && veewee version && vboxmanage -v
    
  6. 1010-04

Packer+Vagrant BOXの作成

Packer用いて、Vagrant用のBoxを作成します。ここでは、Cygwin Terminalを使用してBoxを作成します。

  1. veeweeによるBoxテンプレートの作成

    veeweeを利用すると簡単にインストールしたいOSのテンプレートを作成できますので、今回インストールするDebian 7.2.0のテンプレートを作成します。
    ここでは、~/mybox/veeweeを作業フォルダにしています。

    $ mkdir -p ~/mybox/veewee && cd ~/mybox/veewee
    $ veewee vbox templates
    
    1010-05 1010-06

    実行した2013年11月13日時点では、195個のテンプレートが登録されていました。 今回は、’Debian-7.2.0-i386-netboot’テンプレートを使用します。

    $ veewee vbox define 'vagrant-veewee-debian' 'Debian-7.2.0-i386-netboot'
    
    1010-07

    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を作成する必要があります。

  2. 構成ファイル作成

    PackerやVagrantを利用した開発環境の構築を参考にして、veeweeで作成したBoxテンプレートファイルを元に、以下のファイルを編集します。
    ただし、config.jsonは、veeweeでは生成されませんので、新規作成します。
    ここでは、~/mybox/packer/vagrant-debianを作業フォルダにしています。

    base.sh
    vagrant.sh
    config.json
    preseed.cfg
    
  3. 1010-08
  4. Vagrant Boxの作成

    $ packer validate config.json
    $ packer build -force config.json
    

    -forceオプションを指定すると、config.jsonで指定したBoxファイルを強制的に上書きします。
    正常終了すると、/export/vagrant/vagrant-packaer-debian.box が作成されます。

  5. 1010-09 1010-10

クライアントの準備

作成したVagrant Boxを起動します。
ここでは、~/mybox/vagrant/packer-vagrant-debianを作業フォルダにしています。

  1. Boxの初期設定

    Packerで作成したBoxをVagrantで利用するために、VM名 BOX名を指定して初期化します。

    $ mkdir -p ~/mybox/vagrant/packer-vagrant-debian && cd ~/mybox/vagrant/packer-vagrant-debian
    $ vagrant init packet-vagrant-debian
    
  2. 1010-11
  3. Vagrantfileの編集

    Boxに対してブリッジネットワークを追加するため、Vagrantfileに以下の行を追加します。

    Vagrant::Config.run do |config|
      config.vm.network :bridged
    end
    
    1010-12

    Packerのconfig.json中で、modifyvmを使ってNICを2枚作ることもできるようですが、VBoxManage起動時にエラーとなりましたので、Vagrantの起動時にブリッジインターフェースのNICを追加しています。 ブリッジネットワークを追加すると、物理マシンのネットワークと同一セグメントのマシンになりますので、この作業を忘れると、物理マシンからBoxに接続できなくなります。ただし、vagrant sshでは接続可能です。

  4. Box起動

    以下のコマンドを実行して、Boxを起動しsshで接続します。

    $ vagrant box add packer-vagrant-debian /export/vagrant/packer-vagrant-debian.box
    $ vagrant up
    $ vagrant ssh
    
    1010-13

    vagrant up実行時に、「Configuring and enabling network interfaces…」が表示されて、ブリッジネットワークが利用可能になります。

  5. ネットワーク確認

    Boxに接続できましたので、以下のコマンドを実行してネットワークの確認を行います。

    $ sudo ifconfig -a
    
    1010-14

    eth1に割り当てられたIPアドレスを確認します。筆者の環境では、LAN上にDHCPサーバーがあるため、ブリッジネットワークに追加したNICに対してDHCPでIPアドレスが割り当てられています。
    もし、DHCPサーバーが利用できない環境の場合、vagrant sshで接続した後、staticなIPアドレスを設定して下さい。

サーバーの準備

Git Bash上で、Boxのプロビジョニングを行うため、サーバー(Windows)側の設定を行います。
作業は、Git Bashまたは、Cygwin Terminal上で行います。

  1. 管理者公開鍵の作成

    $ ssh-keygen -t rsa -N "" -f ~/.ssh/manager_rsa_key
    
    1010-15

    パスフレーズを設定していない、RSA公開鍵が作成されます。

    Box接続時に、作成された公開鍵を利用するようにSSH構成ファイルを編集します。

    $ vi ~/.ssh/config
        Host 192.168.0.123
        IdentityFile ~/.ssh/manager_rsa_key
        User vagrant
    
  2. 1010-16
  3. 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
    
  4. 1010-17
  5. バージョン確認

    $ ruby -v && gem -v && bundle -v
    $ chef-solo -v && knife -v && berks -v
    
  6. 1010-18
  7. knifeの初期設定

    前回の記事と同様に、knifeの初期設定を行います。

    $ knife configure
    
  8. 1010-19
  9. Cookbookリポジトリの作成

    前回の記事と同様に、Cookbookリポジトリを作成します。
    リポジトリ作成以降の作業は、全て指定したリポジトリフォルダに移動して行います。今回の場合、~/chef-repoとなります。

    $ knife solo init chef-repo
    
  10. 1010-20
  11. Berkshelfの初期化

    前回の記事と同様に、Berkshelfを初期化します。

    $ cd chef-repo
    $ berks init
    
    1010-21

    初期化が終了したら、~/.chef/knife.rbに以下の行を追加します。

    $ vi ~/.chef/knife.rb
       cookbook_path [
        '/home/punio/chef-repo/site-cookbooks',
        '/home/punio/chef-repo/cookbooks'
      ]
    
    1010-22

    ~/.chef/knife.rbの編集時には、OPS Community登録時に取得した秘密鍵(PEMファイル)も合わせてclient_keyとして設定します。

クライアントSSH設定

  1. 管理者公開鍵の登録

    サーバー側で作成した管理者公開鍵を、vagrantユーザーに登録します。

    $ scp ~/.ssh/manager_rsa_key.pub vagrant@192.168.0.123:/tmp
    $ vi ~/.ssh/authorized_keys
    
  2. 1010-23 1010-24
  3. sshd設定

    クライアントのSSHサーバーの設定を、以下のとおり修正します。

    $ sudo vi /etc/ssh/sshd_config
      UsePAM no
      PermitRootLogin no
      PPasswordAuthentication no
    
    1010-25

    編集が終了したら、SSHサーバーを再起動します。

    $ sudo /etc/init.d/ssh restart
    

  4. 管理者ログインの確認

    サーバーから、Boxへ管理者公開鍵でログインできるか確認します。

    $ ssh 192.168.0.123
    

    ~/.ssh/configでユーザーアカウントと認証鍵(秘密鍵)を設定しているため、パスフレーズ無しでクライアントに接続できます。

  5. 1010-26

プロビジョニングの実行

これまでの作業で、プロビジョニングに必要な設定は全て終了しました。
ここでは、プロビジョニングの動作確認を行います。

$ 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":[]}

1010-27 1010-28

ここまでの段階で、プロビジョニングに必要な作業は完了ですので、記事を参考にして自作、公開Cookbookを実行してみて下さい。

まとめ

ここまで、Windows上のGit Bashおよび、Cygwinを使用してWindowsマシンから、Vagrant Boxのプロビジョニングについて解説しました。VagrantやPackerによるBoxのプロビジョニングではできない、クライアントサーバー間のプロビジョニングは、プロビジョニング情報を一元管理できるメリットだけで無く、物理サーバーを含めたプロビジョニングも実現できます。今回解説した記事を参考にして、Windows環境でプロビジョニングサーバーの構築にチャレンジしては如何でしょうか。

Comments are closed.