Vagrant + SEIL/x86 で仮想環境のネットワーク設定を自動化

Vagrant と SEIL/x86 を使って、仮想環境のホストとネットワークをまとめて自動構築する方法を紹介します。

記事一覧

Vagrant と SEIL/x86

Vagrant は VirtualBox や VMware といった仮想化ソフトウェアのフロントエンドとして動作するツールで、サービスの開発/検証環境を手軽に構築できるため広く使われています。Chef や Ansible 等と組み合わせて仮想ホストの設定を自動化することもでき、また自動化された設定が正しく動作するかどうかの検証用途にも便利です。

たいへん便利な Vagrant ですが、ネットワークに関してはあまり複雑なことはできないという欠点があります。そして Vagrant は一般的な Linux / Windows シェルが動作しないような仮想ホストはうまく操作することができず、仮想ルータと組み合わせて使うのも一筋縄にはいきません。SEIL/x86 も例に違わず Vagrant そのままではうまく制御できません。

そこで、仮想ホストと同じような感覚で SEIL/x86 を Vagrant から制御できるようにするプラグイン "vagrant-seil"を公開しました。本記事では vagrant-seil プラグインの導入から活用事例までを紹介します。

vagrant-seil プラグインを導入する

それでは、さっそく vagrant-seil プラグインを使って SEIL/x86 を Vagrant から起動してみましょう。まず、vagrant-seil プラグインをインストールします。通常の Vagrant プラグインと同様に、"vagrant plugin install" コマンドでかんたんにインストールできます。

% vagrant plugin install vagrant-seil

次に、以下の三つのファイルを用意してください。

  1. SEIL/x86 の Vagrant box ファイル
  2. 起動キーが書かれたテキストファイル
  3. 機能キーが書かれたテキストファイル

SEIL/x86 の Vagrant box ファイルと起動キーは、SEIL/x86 Fuji 仮想マシンのダウンロードページ から取得できます。EXPERIMENTAL_seilx86-500-vagrant.zip をダウンロードし、unzip コマンド等を用いて seilx86-500.box を取り出して、"vagrant box add" コマンドを使って Vagrant に登録してください。box の名前(下記の例では "seil")は好きなもので構いません。

% unzip EXPERIMENTAL_seilx86-500-vagrant.zip
Archive:  EXPERIMENTAL_seilx86-500-vagrant.zip
  inflating: seilx86-500.box
% vagrant box add --name seil ./seilx86-500.box
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'seil' (v0) for provider:
    box: Unpacking necessary files from: file:///Users/tsahara/t/seilx86-500.box
==> box: Successfully added box 'seil' (v0) for 'virtualbox'!
%

機能キーをお持ちではない場合は、LaIT サプライサービス でご購入いただくか、あるいは学生の方は アカデミックライセンス (無料)を取得してください。起動キーと機能キーは Vagrantfile に記述します。始めは SEIL/x86 を起動するだけの最小の Vagrantfile を書いてみます。

Vagrant.configure("2") do |config|
  config.vm.box = "seil"
  config.vm.provision :seil do |seil|
    seil.starter_key = File.read("starterkey.txt")
    seil.function_key = File.read("functionkey.txt")
  end
end

上記の内容のテキストファイルを Vagrantfile という名前で作成してください。そして起動キーと機能キーはそれぞれ "starterkey.txt" と "functionkey.txt" という名前で Vagrantfile と同じディレクトリに置いてください。vagrant up を実行すれば SEIL/x86 が起動します。

% vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'seil'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: t_default_1445585068757_19828
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 => 2222 (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: admin
    default: SSH auth method: private key
    default: Warning: Connection timeout. Retrying...
    default: Warning: Connection timeout. Retrying...
    default: Warning: Remote connection disconnect. Retrying...
    default: 
    default: Vagrant insecure key detected. Vagrant will automatically replace
    default: this with a newly generated keypair for better security.
    default: 
    default: Inserting generated public key within guest...
    default: Removing insecure key from the guest if it's present...
    default: Key inserted! Disconnecting and reconnecting using new SSH key...
==> default: Machine booted and ready!
==> default: Mounting shared folders...
    default: /vagrant => /Users/tsahara/t
    default: nothing happens - vagrant-seil does not support synced folders
==> default: Running provisioner: seil...

vagrant ssh で SEIL にログインできるようになりました。

% vagrant ssh
Last login: Fri Oct 23 16:25:09 2015 from 10.0.2.2 on tty??
Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
    The NetBSD Foundation, Inc. All rights reserved.
Copyright (c) 1982, 1986, 1989, 1991, 1993
    The Regents of the University of California. All rights reserved.
 
  Warning! Do not forget to set admin password.
 
#
# sh sy
SEIL/x86 Fuji Ver. 5.00 (Release)
...

プロビジョニング

さて、ここまでで vagrant ssh で SSH ログインできるようになりました。vagrant reload によるリブートや、vagrant halt によるシャットダウンも動作します。しかし、provisioner によるコンフィグの管理ができなくては Vagrant を使う意味も半減です。

vagrant-seil プラグインは、SEIL 専用の provisioner によるコンフィグ設定をサポートしています。以下のように、仮想マシンの SEIL/x86 に読み込ませたいコンフィグを Vagrantfile のプロビジョニング設定として書いてください。

% cat Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "seil"
  config.vm.provision :seil do |seil|
    seil.starter_key = File.read("starterkey.txt")
    seil.function_key = File.read("functionkey.txt")
 
    seil.config = <<-CONF
      hostname Vagrant
      interface lan0 description "for Vagrant"
    CONF
              
  end
end

そして vagrant provision で反映します。

% vagrant provision
==> default: Running provisioner: seil...
    default: load-from Vagrant...
    default: save-to flashrom...
%

反映が完了したら仮想マシンにログインして確認してみてください。

% vagrant ssh
Last login: Fri Oct 23 16:49:52 2015 from 10.0.2.2 on tty??
Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
    The NetBSD Foundation, Inc. All rights reserved.
Copyright (c) 1982, 1986, 1989, 1991, 1993
    The Regents of the University of California. All rights reserved.
 
Vagrant# sh con 
hostname "Vagrant"
timezone "Japan"
environment login-timer 300
interface lan0 description "for Vagrant"
...

"hostname" と "interface lan0 description" の設定が反映されていることが確認できます。今回は "vagrant provision" コマンドで反映させましたが、もちろん vagrant up による起動時の設定にも対応しています。

活用例: Linux 仮想ホストと組み合わせる

最後に活用例を紹介します。Vagrant で構築した Linux 仮想ホストを、SEIL/x86 の L2TPダイアルアップネットワーククライアント機能を使ってオフィスネットワークにつなぎ込んでみます。

Vagrant.configure(2) do |config|
  config.vm.define "seilx86" do |seilx86|
    seilx86.vm.box = "seil"
    seilx86.vm.network "private_network", ip: "192.168.0.2"
    seilx86.vm.provision :seil do |seil|
      seil.starter_key = File.read("starterkey.txt")
      seil.function_key = File.read("functionkey.txt")
 
      seil.config = <<-CONF
        hostname Vagrant
        ppp add REMOTE ipcp enable ipcp-address on ipcp-dns on identifier user@example.jp passphrase PASS
        dialup-network l2tp-dn0 connect-to remote.example.jp ipsec-preshared-key "SECRET"
        interface ppp0 over l2tp-dn0
        interface ppp0 ppp-configuration IDGW
        route add default dhcp
        route add 10.0.0.0/8 ppp0
        nat napt add private 192.168.0.0-192.168.0.255 interface ppp0
        resolver enable
        resolver address add dhcp
      CONF
    end
  end
 
  config.vm.define "ubuntu" do |ubuntu|
    ubuntu.vm.box = "ubuntu/trusty64"
    ubuntu.vm.network "private_network", ip: "192.168.0.3"
    ubuntu.vm.provision "shell", inline: <<-SCRIPT
      sed -i -e '/up route add/d;/VAGRANT-END/i up route add -net 10.0.0.0/8 gw 192.168.0.2 dev eth1' /etc/network/interfaces
      ifdown eth1
      ifup eth1
    SCRIPT
  end
end 

ここでは Vagrant の Multi-Machine 機能を使って、ひとつの Vagrantfile に Linux ホストと SEIL/x86 の両方の VM をまとめて記述してみました。ポイントを記すと、

  1. Vagrant の "private_network" 機能を使って、共有の仮想ネットワークを作る。
  2. SEIL/x86 は L2TP ダイアルアップネットワーククライアント機能を使ってオフィスネットワークに接続する。Linux ホストからの通信は NAT する。
  3. Linux ホストにはリモートアクセス用のルーティングを設定する。

となります。ネットワークの構成によっては、これに加えて DNS もリモートアクセス越しにする必要があるかもしれません。

いかがでしたか? 本記事では Linux 仮想ホストをリモートアクセスサーバにつなぎ込む構成を例として挙げましたが、他にも実ネットワークに投入する前のコンフィグの検証に利用したりもできます。また、Jinja のようなテンプレートエンジンと組み合わせて大量の仮想ルータを用意するような用途にも使えます。さまざまな活用方法が考えられますので、ぜひご利用ください。