Vagrantを使ったカスタムBoxの作成と配布

vagrant.001

はじめに

これまで本ブログでは、Chefを用いたBoxのプロビジョニング方法について数多く取り上げて来ましたが、Vagrantのプロビジョニング機能については、取り上げていません。そこで今回は、Vagrantのプロビジョニング機能を用いてカスタムBoxを作成し、作成したカスタムBoxのパッケージ化の方法とBoxの配布方法について解説します。
カスタムBoxを作成するためには、ベースとなるBoxが必要になります。ここでは、本プログで作成したCentOS-6.4-x86_64-minimal.boxをBase Boxとして利用して、カスタマイズを行います。

作成に使用するマシン環境は、下記のとおりです。

ソフトウエアバージョン
OSWindows 7 Ultimate 32bit
CygwinSetup Version 2.831
Vagrant1.2.7

Base Boxの起動

カスタムBoxのベースとなるBoxを起動します。
これまではBoxの起動方法として、add,init,upの順にコマンドを実行していましたが、今回は、これまでとは異なる方法でBoxを起動します。

  1. 初期化

    Box名を指定して、初期化します。

    $ mkdir -p ~/mybox/vagrant/CentOS-6.4-x86_64-custom && cd ~/mybox/vagrant/CentOS-6.4-x86_64-custom
    $ vagrant init CentOS-6.4-x86_64-custom
    
    punio@PAPA ~
    $ mkdir -p ~/mybox/vagrant/CentOS-6.4-x86_64-custom && cd ~/mybox/vagrant/CentOS-6.4-x86_64-custom
    
    punio@PAPA ~/mybox/vagrant/CentOS-6.4-x86_64-custom
    $ vagrant init CentOS-6.4-x86_64-custom
    A `Vagrantfile` has been placed in this directory. You are now
    ready to `vagrant up` your first virtual environment! Please read
    the comments in the Vagrantfile as well as documentation on
    `vagrantup.com` for more information on using Vagrant.
    
    punio@PAPA ~/mybox/vagrant/CentOS-6.4-x86_64-custom
    
  2. Vagrantfileの修正

    作成されたVagrantfileを、下記のとおり修正します。
    box_urlを指定することで、どこから取得したBoxなのかが分かりますので、今後はこの方法でBoxを起動します。

    config.vm.box_url = "file:///export/vagrant/CentOS-6.4-x86_64-minimal.box"
    
    1017-02
  3. Boxの起動

    Vagrantfileを修正したら、Boxを起動します。

    $ vagrant up
    

    box_urlに指定したBoxが自動的に取得されて、Boxが起動します。

    punio@PAPA ~/mybox/vagrant/CentOS-6.4-x86_64-custom
    $ vagrant up
    Bringing machine 'default' up with 'virtualbox' provider...
    [default] Box 'CentOS-6.4-x86_64-custom' was not found. Fetching box from specified URL for
    the provider 'virtualbox'. Note that if the URL does not have
    a box for this provider, you should interrupt Vagrant now and add
    the box yourself. Otherwise Vagrant will attempt to download the
    full box prior to discovering this error.
    Downloading or copying the box...
    Extracting box...ate: 115M/s, Estimated time remaining: --:--:--)
    Successfully added box 'CentOS-6.4-x86_64-custom' with provider 'virtualbox'!
    [default] Importing base box 'CentOS-6.4-x86_64-custom'...
    [default] Matching MAC address for NAT networking...
    [default] Setting the name of the VM...
    [default] Clearing any previously set forwarded ports...
    [default] Creating shared folders metadata...
    [default] Clearing any previously set network interfaces...
    [default] Preparing network interfaces based on configuration...
    [default] Forwarding ports...
    [default] -- 22 => 2222 (adapter 1)
    [default] Booting VM...
    [default] Waiting for VM to boot. This can take a few minutes.
    [default] VM booted and ready for use!
    [default] Mounting shared folders...
    [default] -- /vagrant
    
  4. Boxの停止

    起動に成功したら、Boxをシャットダウンします。

    $ vagrant halt
    

    これまでは、sshで接続してshutdownコマンドを実行していましたが、haltコマンドを実行することでも安全にシャットダウンできます。

    punio@PAPA ~/mybox/vagrant/CentOS-6.4-x86_64-custom
    $ vagrant halt
    [default] Attempting graceful shutdown of VM...
    
    punio@PAPA ~/mybox/vagrant/CentOS-6.4-x86_64-custom
    

Base Boxのプロビジョニング

Base Boxの起動確認ができましたので、Vagrantのshell provisionを使用してBoxをカスタマイズします。
shell provisionerは、2種類ありますので順を追って解説します。

  1. inline shell provision

    Vagrantfile中に実行する処理を記述するプロビジョニング方法です。

    今回は、yum updateコマンドでシステム更新を実行します。

    Vagrant::Config.run do |config|
      config.vm.provision :shell, :inline => "yum -y update"
    end
    
    1017-05

    このように、inlineでは単一コマンドしか実行できませんので、より複雑な処理を行いたい場合は、shell provisionを利用します。

    Vagrantfileを修正したら、Boxを起動します。

    $ vagrant up
    $ vagrant halt
    

    Boxを起動すると、”Running: inline script”が表示されコマンドが実行されたことが確認できます。

    punio@PAPA ~/mybox/vagrant/CentOS-6.4-x86_64-custom
    $ vagrant up
    Bringing machine 'default' up with 'virtualbox' provider...
    [default] Setting the name of the VM...
    [default] Clearing any previously set forwarded ports...
    [default] Creating shared folders metadata...
    [default] Clearing any previously set network interfaces...
    [default] Preparing network interfaces based on configuration...
    [default] Forwarding ports...
    [default] -- 22 => 2222 (adapter 1)
    [default] Booting VM...
    [default] Waiting for VM to boot. This can take a few minutes.
    [default] VM booted and ready for use!
    [default] Mounting shared folders...
    [default] -- /vagrant
    [default] Running provisioner: shell...
    [default] Running: inline script
    Loaded plugins: fastestmirror
    Loading mirror speeds from cached hostfile
     * base: mirror.nus.edu.sg
     * extras: mirrors.btte.net
     * updates: mirrors.neusoft.edu.cn
    Setting up Update Process
    No Packages marked for Update
    
    punio@PAPA ~/mybox/vagrant/CentOS-6.4-x86_64-custom
    
  2. shell provision

    Vagrantfile中に実行するshell script名を記述するプロビジョニング方法です。

    今回は、ユーザーアカウントを作成し、SSH公開鍵を登録するscriptを作成しています。

    1017-07
    Vagrant::Config.run do |config|
      config.vm.provision :shell, :inline => "yum -y update"
      config.vm.provision :shell, path: "script.sh"
    end
    
    1017-08

    Vagrantfileを修正したら、Boxを起動します。

    $ vagrant up
    $ vagrant halt
    

    Boxを起動すると、”Running: D:/TEMP/vagrant-shell..”が表示され、コマンドが実行されたことが確認できます。
    Vagrantでは、指定されたshell scriptを/tmpフォルダにユニークな名前でコピーして実行しますので、Vagrantfileで指定したscript名と異なる表示になります。
    また、symbolic linkの先のshell scriptは、vagrant up時に読み取りエラーになってしまいますので、実ファイルとして、カレントフォルダに保存します。

    punio@PAPA ~/mybox/vagrant/CentOS-6.4-x86_64-custom
    $ vagrant up
    Bringing machine 'default' up with 'virtualbox' provider...
    [default] Setting the name of the VM...
    [default] Clearing any previously set forwarded ports...
    [default] Creating shared folders metadata...
    [default] Clearing any previously set network interfaces...
    [default] Preparing network interfaces based on configuration...
    [default] Forwarding ports...
    [default] -- 22 => 2222 (adapter 1)
    [default] Booting VM...
    [default] Waiting for VM to boot. This can take a few minutes.
    [default] VM booted and ready for use!
    [default] Mounting shared folders...
    [default] -- /vagrant
    [default] Running provisioner: shell...
    [default] Running: inline script
    Loaded plugins: fastestmirror
    Loading mirror speeds from cached hostfile
     * base: mirror.nus.edu.sg
     * extras: mirrors.btte.net
     * updates: mirrors.neusoft.edu.cn
    Setting up Update Process
    No Packages marked for Update
    [default] Running provisioner: shell...
    [default] Running: D:/TEMP/vagrant-shell20131126-1452-2yygem
    Generating public/private rsa key pair.
    
  3. 共有フォルダを使用したプロビジョニング

    Vagrantでは、BoxにVirtualBox Guest Additionがインストールされている時に限り、Boxを起動したカレントフォルダを共有フォルダとして/vagrantにデフォルトでマウントしています。

    この機能を使って、実行したい処理をshell scriptで記述しておき、Boxを起動した後にBox上の/vagrant配下のshell scriptを手動で実行することもできます。

    Vagrantのshell provision以外で、手っ取り早くshellで処理を実行したい場合などに使えると思います。

Boxのパッケージ化

カスタマイズしたBoxをパッケージ化します。このパッケージ化によりカスタマイズされたBoxが作成できますので、ウエブ上で公開して再利用することが可能になります。

packageコマンドでは、パッケージの元となるBoxの指定方法が2種類あります。また、出力するBox名を指定することで任意のフォルダにBoxを保存できます。

  1. UUID指定

    UUIDは、vagrant addを実行することで、.vagrant/machines/default/virtualboxフォルダにidファイルとして記録されてますので、このidファイルを利用します。

    $ cd ~/mybox/vagrant/CentOS-6.4-x86_64-custom
    $ rm -f /export/vagrant/CentOS-6.4-x86_64-custom.box
    $ vagrant package --base `cat .vagrant/machines/default/virtualbox/id` --output /export/vagrant/CentOS-6.4-x86_64-custom.box
    
    punio@PAPA ~/mybox/vagrant/CentOS-6.4-x86_64-custom
    $ rm -f /export/vagrant/CentOS-6.4-x86_64-custom.box
    
    punio@PAPA ~/mybox/vagrant/CentOS-6.4-x86_64-custom
    $ vagrant package --base `cat .vagrant/machines/default/virtualbox/id` --output /export/vagrant/CentOS-6.4-x86_64-custom.box
    [5731e3e0-8b53-4306-bd24-b813413c6bff] Clearing any previously set forwarded ports...
    [5731e3e0-8b53-4306-bd24-b813413c6bff] Creating temporary directory for export...
    [5731e3e0-8b53-4306-bd24-b813413c6bff] Exporting VM...
    [5731e3e0-8b53-4306-bd24-b813413c6bff] Compressing package to: D:/export/vagrant/CentOS-6.4-x86_64-custom.box
    
  2. 仮想マシン名指定

    UUIDでは無く、仮想マシン名を指定することもできます。

    $ VBoxManage list vms | grep `cat .vagrant/machines/default/virtualbox/id`
    $ rm -f /export/vagrant/CentOS-6.4-x86_64-custom.box
    $ vagrant package --base CentOS-64-x86_64-custom_default_1385464131 --output /export/vagrant/CentOS-6.4-x86_64-custom.box
    

    この方法では、VBoxManage list vmsコマンドを実行して、UUIDに対応する仮想マシン名を確認してパッケージ化を行っています。Vagrantが生成する仮想マシン名は、読みにくいものが多いため、UUIDを指定したパッケージ化をお勧めします。

    punio@PAPA ~/mybox/vagrant/CentOS-6.4-x86_64-custom
    $ VBoxManage list vms | grep `cat .vagrant/machines/default/virtualbox/id`
    "CentOS-64-x86_64-custom_default_1385464131" {5731e3e0-8b53-4306-bd24-b813413c6bff}
    
    punio@PAPA ~/mybox/vagrant/CentOS-6.4-x86_64-custom
    $ rm -f /export/vagrant/CentOS-6.4-x86_64-custom.box
    
    punio@PAPA ~/mybox/vagrant/CentOS-6.4-x86_64-custom
    $ vagrant package --base CentOS-64-x86_64-custom_default_1385464131 --output /export/vagrant/CentOS-6.4-x86_64-custom.box
    [CentOS-64-x86_64-custom_default_1385464131] Clearing any previously set forwarded ports...
    [CentOS-64-x86_64-custom_default_1385464131] Creating temporary directory for export...
    [CentOS-64-x86_64-custom_default_1385464131] Exporting VM...
    [CentOS-64-x86_64-custom_default_1385464131] Compressing package to: D:/export/vagrant/CentOS-6.4-x86_64-custom.box
    

Boxの配布

カスタムBoxをパッケージ化できましたので、Box配布用のウエブサーバーを作成します。

  1. 初期化

    $ mkdir -p ~/mybox/vagrant/vagrant-box-download-web && cd ~/mybox/vagrant/vagrant-box-download-web
    $ vagrant init vagrant-box-download-web
    
    punio@PAPA ~/mybox/vagrant/CentOS-6.4-x86_64-custom
    $ mkdir -p ~/mybox/vagrant/vagrant-box-download-web && cd ~/mybox/vagrant/vagrant-box-download-web
    
    punio@PAPA ~/mybox/vagrant/vagrant-box-download-web
    $ vagrant init vagrant-box-download-web
    A `Vagrantfile` has been placed in this directory. You are now
    ready to `vagrant up` your first virtual environment! Please read
    the comments in the Vagrantfile as well as documentation on
    `vagrantup.com` for more information on using Vagrant.
    
    punio@PAPA ~/mybox/vagrant/vagrant-box-download-web
    $ vi Vagrantfile
    
  2. Vagrantfileの修正

    Base Boxとして先に作成したBoxを指定し、ブリッジネットワークをVagrantfileに追加します。

    config.vm.box_url = "file:///export/vagrant/CentOS-6.4-x86_64-custom.box"
    Vagrant::Config.run do |config|
      config.vm.network :bridged
    end
    
    1017-16 1017-17
  3. Boxの起動

    Boxを起動し、接続します。

    $ vagrant up
    $ vagrant ssh
    
    punio@PAPA ~/mybox/vagrant/vagrant-box-download-web
    $ vagrant up
    Bringing machine 'default' up with 'virtualbox' provider...
    [default] Box 'vagrant-box-download-web' was not found. Fetching box from specified URL for
    the provider 'virtualbox'. Note that if the URL does not have
    a box for this provider, you should interrupt Vagrant now and add
    the box yourself. Otherwise Vagrant will attempt to download the
    full box prior to discovering this error.
    Downloading or copying the box...
    Extracting box...ate: 148M/s, Estimated time remaining: --:--:--)
    Successfully added box 'vagrant-box-download-web' with provider 'virtualbox'!
    [default] Importing base box 'vagrant-box-download-web'...
    [default] Matching MAC address for NAT networking...
    [default] Setting the name of the VM...
    [default] Clearing any previously set forwarded ports...
    [default] Creating shared folders metadata...
    [default] Clearing any previously set network interfaces...
    [default] Preparing network interfaces based on configuration...
    [default] Forwarding ports...
    [default] -- 22 => 2222 (adapter 1)
    [default] Booting VM...
    [default] Waiting for VM to boot. This can take a few minutes.
    [default] VM booted and ready for use!
    [default] Configuring and enabling network interfaces...
    [default] Mounting shared folders...
    [default] -- /vagrant
    
    punio@PAPA ~/mybox/vagrant/vagrant-box-download-web
    
  4. Apacheのインストール

    $ sudo yum -y install httpd
    $ sudo shutdown -h now
    
    punio@PAPA ~/mybox/vagrant/vagrant-box-download-web
    $ vagrant ssh
    Last login: Tue Nov 26 19:31:30 2013 from 10.0.2.2
    [vagrant@centos64-x86_64 ~]$ sudo yum -y install httpd
    Loaded plugins: fastestmirror
    Loading mirror speeds from cached hostfile
     * base: mirror.nus.edu.sg
     * extras: mirrors.btte.net
     * updates: mirrors.neusoft.edu.cn
    Setting up Install Process
    Resolving Dependencies
    --> Running transaction check
    ---> Package httpd.x86_64 0:2.2.15-29.el6.centos will be installed
    --> Processing Dependency: httpd-tools = 2.2.15-29.el6.centos for package: httpd-2.2.15-29.el6.centos.x86_64
    --> Processing Dependency: apr-util-ldap for package: httpd-2.2.15-29.el6.centos.x86_64
    --> Processing Dependency: /etc/mime.types for package: httpd-2.2.15-29.el6.centos.x86_64
    --> Processing Dependency: libaprutil-1.so.0()(64bit) for package: httpd-2.2.15-29.el6.centos.x86_64
    --> Processing Dependency: libapr-1.so.0()(64bit) for package: httpd-2.2.15-29.el6.centos.x86_64
    --> Running transaction check
    ---> Package apr.x86_64 0:1.3.9-5.el6_2 will be installed
    ---> Package apr-util.x86_64 0:1.3.9-3.el6_0.1 will be installed
    ---> Package apr-util-ldap.x86_64 0:1.3.9-3.el6_0.1 will be installed
    ---> Package httpd-tools.x86_64 0:2.2.15-29.el6.centos will be installed
    ---> Package mailcap.noarch 0:2.1.31-2.el6 will be installed
    --> Finished Dependency Resolution
    

  5. 共有フォルダの追加

    Vagrantfileに共有フォルダの設定を追加します。
    共有元のフォルダには、Vagrant Box保存フォルダの”/export/vagrant”を指定しています。
    また、マウント先には、ApacheのDocumentRoot配下の”/var/www/html/box”を指定しています。

    Vagrant::Config.run do |config|
      config.vm.network :bridged
      config.vm.share_folder "box", "/var/www/html/box", "/export/vagrant"
    end
    
    1017-20
  6. Boxの起動

    Boxを起動し、接続します。

    $ vagrant up
    $ vagrant ssh
    
  7. Apacheの設定変更

    /etc/httpd/conf/httpd.confを下記のとおり修正します。

    AddType text/x-component .box
    EnableMMAP off
    
  8. Attpd.confの構文チェック

    httpd.confの構文エラーをチェックします。

    httpd -t
    
  9. Apacheの自動起動設定

    Apacheの自動起動設定を行います。

    $ sudo chkconfig --add httpd
    $ sudo chkconfig httpd on
    $ sudo service httpd start
    

<

p> 以上で、Box公開用ウエブサイトの構築は終了です。 1017-26

ウエブ上のBoxの起動

最後に、作成した公開ウエブからBoxをダウンロードして、起動できるかを確認します。手順としては、通常のBox起動と同じです。

  1. 初期化

    $ mkdir -p ~/mybox/vagrant/vagrant-box-from-web && cd ~/mybox/vagrant/vagrant-box-from-web
    $ vagrant init vagrant-box-from-web
    
    punio@PAPA ~/mybox/vagrant/vagrant-box-download-web
    $ mkdir -p ~/mybox/vagrant/vagrant-box-from-web && cd ~/mybox/vagrant/vagrant-box-from-web
    
    punio@PAPA ~/mybox/vagrant/vagrant-box-from-web
    $ vagrant init vagrant-box-from-web
    A `Vagrantfile` has been placed in this directory. You are now
    ready to `vagrant up` your first virtual environment! Please read
    the comments in the Vagrantfile as well as documentation on
    `vagrantup.com` for more information on using Vagrant.
    
    punio@PAPA ~/mybox/vagrant/vagrant-box-from-web
    $ vi Vagrantfile
    
  2. Vagrantfileの修正

    作成されたVagrantfileを、下記のとおり修正します。
    IPアドレスは、Box公開ウエブのIPアドレスを確認して指定して下さい。

    config.vm.box_url = "http://192.168.0.157/box/CentOS-6.4-i386-minimal.box"
    
    1017-30
  3. Boxの起動

    Vagrantfileを修正したら、Boxを起動します。

    $ vagrant up
    

    box_urlに指定したBoxが自動的に取得されて、Boxが起動します。

    punio@PAPA ~/mybox/vagrant/vagrant-box-from-web
    $ vagrant up
    Bringing machine 'default' up with 'virtualbox' provider...
    [default] Box 'vagrant-box-from-web' was not found. Fetching box from specified URL for
    the provider 'virtualbox'. Note that if the URL does not have
    a box for this provider, you should interrupt Vagrant now and add
    the box yourself. Otherwise Vagrant will attempt to download the
    full box prior to discovering this error.
    Downloading or copying the box...
    Extracting box...ate: 9.9M/s, Estimated time remaining: --:--:--)
    Successfully added box 'vagrant-box-from-web' with provider 'virtualbox'!
    [default] Importing base box 'vagrant-box-from-web'...
    [default] Matching MAC address for NAT networking...
    [default] Setting the name of the VM...
    [default] Clearing any previously set forwarded ports...
    [default] Fixed port collision for 22 => 2222. Now on port 2200.
    [default] Creating shared folders metadata...
    [default] Clearing any previously set network interfaces...
    [default] Preparing network interfaces based on configuration...
    [default] Forwarding ports...
    [default] -- 22 => 2200 (adapter 1)
    [default] Booting VM...
    [default] Waiting for VM to boot. This can take a few minutes.
    [default] VM booted and ready for use!
    [default] Mounting shared folders...
    [default] -- /vagrant
    punio@PAPA ~/mybox/vagrant/vagrant-box-from-web
    
  4. Boxの停止

    起動に成功したら、Boxをシャットダウンします。

    $ vagrant halt
    
    1017-33

まとめ

ここまで、Vagrantを使ったシェルプロビジョニングと、パッケージ作成方法について解説しました。共有フォルダを使用することで、ローカルマシン上のBoxを公開する方法も解説しましたので、既存のBoxを公開することもできます。Vagrantによるプロビジョニングは、Chefのように高機能なプロビジョニングは行えませんが、直ぐにカスタムBoxが欲しい場合などでは、使いなれたshellを使って自由にカスタマイズできるメリットがあります。この記事を参考にして、カスタムBoxを作ってみましょう。

Comments are closed.