2015/10/29に掲載された記事です
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
次に、以下の三つのファイルを用意してください。
- SEIL/x86 の Vagrant box ファイル
- 起動キーが書かれたテキストファイル
- 機能キーが書かれたテキストファイル
SEIL/x86 の Vagrant box ファイルと起動キーは、から取得できます。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 サプライサービスでご購入いただくか、あるいは学生の方はアカデミックライセンス(無料)を取得してください。
注: SEIL/x86 Fuji 機能キーの販売およびアカデミックライセンスの提供は終了しました。
起動キーと機能キーは 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 をまとめて記述してみました。ポイントを記すと、
- Vagrant の "private_network" 機能を使って、共有の仮想ネットワークを作る。
- SEIL/x86 は L2TP ダイアルアップネットワーククライアント機能を使ってオフィスネットワークに接続する。Linux ホストからの通信は NAT する。
- Linux ホストにはリモートアクセス用のルーティングを設定する。
となります。ネットワークの構成によっては、これに加えて DNS もリモートアクセス越しにする必要があるかもしれません。
いかがでしたか? 本記事では Linux 仮想ホストをリモートアクセスサーバにつなぎ込む構成を例として挙げましたが、他にも実ネットワークに投入する前のコンフィグの検証に利用したりもできます。
また、Jinja のようなテンプレートエンジンと組み合わせて大量の仮想ルータを用意するような用途にも使えます。さまざまな活用方法が考えられますので、ぜひご利用ください。