Vagrant 1.6 プレビュー機能:Windows ゲストOS

Vagrant Blog:Feature Preview: Windows Guests

Vagrant 1.6 では、Vagrantに重要な機能が追加されます。
Linux環境と同様に簡単にWindows環境を管理することがVagrantで可能になり、Varantとして公式にサポートします。

勘違いしないでください、Windows上でVagrantを使用することはサポートしています。
Vagrantは一年間Windows上での動作をサポートしてきました。
Vagrant 1.6 では、Vagrant 環境内での(VirtualBox、Hyper-V、EC2上での)Windows動作をサポートします。

Vagrant 1.6 でWindowsゲストのサポートを提供し、Linux環境同様に、Windows環境をサインアップし、ソフトウェアのインストールや設定にPowerShellスクリプト、Chef、Pupetなどを使うことができます。

Linux環境では、Vagrant ssh、Windowsゲストには、Windows環境にリモートデスクトップにコマンド一つでアクセスできるVagrant rdpが提供されます。

VagrantはWindowsへの通信に、SSHまたはWinRMを使用します。
WinRMは、とても便利です。

WinRMのサポートは、新しい1.6からです

Vagrant.configure("2") do |config|
	# ...
	config.vm.communicator = "winrm"
end

知っても得はしないけど、しりたいよね?vagrant shareの裏側の仕組み

image

1.vagrant share

仮想マシンのNW状況を確認します。
IPやポートフォワードの状況などを確認して、設定すべき情報をチェックします。

2.プロキシサーバーの登録と共有URLの発行 register.vagrantshare.com

https://register.vagrantshare.com のRest APIにリクエストを投げます。
リクエストを受け取ると、プロキシサーバーが生成されます。
プロキシサーバーが生成されたら、レスポンスが返ってきます。
レスポンスには、プロキシサーバーの名前と有効期限、ポート番号が含まれています。

3.ホストOSでプロキシソフトを起動

プロキシサーバーと通信をするために、プロキシを起動します。
Windowsの場合は、

C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-share-1.0.0/localbin/proxy_windows_386.exe
を起動します。
起動オプションに、プロキシサーバー名やポート番号がわたされます。
内側から外側に向けた通信でトンネル作成ですね。

4.プロキシソフトからプロキシサーバーに接続

プロキシソフトから、プロキシサーバー(register.vagrantshare.com:8000)に接続して、通信を確立します。

5.インターネット上から接続します

これでインターネット中からアクセスできるようになりました。
http://bored-lovebird-5488.vagrantshare.com
にアクセスすると、プロキシサーバーにアクセスし、プロキシサーバー経由でホストOS、ホストOSからゲストOSに接続します。

あら、素敵。

VagrantでHyper-Vやるぜ!

VagrantがサポートしているHyper-Vは、Windows 8.1のみ。
以前のバージョンのHyper-VのAPIに対応していなくて、動作しないことがあるらしい。

Hyper-VとVirtualBox、VMwareなどの仮想化技術は共存ができない。Hyper-Vが有効になっているとVirutualBoxでエラーが出るので、Hyper-Vを無効化する必要がある。具体的には、[Windows 8.1で、VirtualBoxとHyper-Vを簡単に切り替える方法]を参照。

Hyper-Vを使用するには、予めWindowsの機能追加と削除でHyper-Vを有効にしておく必要がある。
image

 

Hyper-Vを使用するには、[vagrant up]コマンドのオプション[—provider]に[hyperv]を指定する。実行するときには、管理者特権が必要で、権限がない場合、Vagrantはエラーを返す。

image

The Hyper-V provider requires that Vagrant be run with
administrative privileges. This is a limitation of Hyper-V itself.
Hyper-V requires administrative privileges for management
commands. Please restart your console with administrative
privileges and try again.

 

コマンドプロンプトを意気揚々と管理者特権で起動してコマンド実行!

vagrant init hashicorp/precise64
vagrant up –provider=hyperv

また、エラー・・・。

image

There are no virtual switches created for Hyper-V! Please open
the Hyper-V Manager, go to the "Virtual Switch Manager", and create
at least one virtual switch.
A virtual switch is required for Vagrant to create a Hyper-V
machine that is connected to a network so it can access it.

Hyper-V用の仮想スイッチが作成されていないので、Hyper-Vマネジャーで仮想スイッチマネージャーから仮想スイッチを作成してね!っとのこと。
てなわけで、仮想スイッチを作成しちゃいましょう!

image

仮想スイッチを作成したら、改めて[Vagrant up]

vagrant up –provider=hyperv

image

SMBフィル共有で何かエラーがでているが、もう疲れたよ、ママン。
なので、エラーはでてるが気にしない。
気にしなければ、Hyper-Vでの操作はおしまい。

SMB同期

デフォルトでは、SMB同期が有効になっている。
SMB同期は、ネットワーク共有設定をするが、[vagrant destroy]などでネットワーク共有をクリーンアップしないので残り続けるので、必要に応じて自分で解除する必要がある。

image

 

制限事項

Vagrantは、まだHyper-V用の新しいネットワーク設定と作成方法を把握していません。
Hyper-Vでマシーンを起動するとき、Vagrantはどの仮想スイッチに仮想マシンを接続したいかを確認します。

Vagarantは、固定IP設定や自動NAT設定をすることはできません。

Vagrant upの過程で、マシンの仮想IPを報告し、ホストオンリーのネットワークでIPアドレスを使用できます。

 

vagrant up –provider=hyperv でエラー

c:\work\ubuntu>vagrant up –provider=hyperv
Bringing machine ‘default’ up with ‘hyperv’ provider…
==> default: Importing a Hyper-V instance
    default: Cloning virtual hard drive…
    default: Creating and registering the VM…
C:/HashiCorp/Vagrant/embedded/gems/gems/childprocess-0.5.1/lib/childprocess/abstract_process.rb:183:in `assert_started’:
process not started (ChildProcess::Error)
        from C:/HashiCorp/Vagrant/embedded/gems/gems/childprocess-0.5.1/lib/childprocess/windows/process.rb:39:in `exite
d?’
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.5.0/lib/vagrant/util/subprocess.rb:207:in `ensure in exec
ute’
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.5.0/lib/vagrant/util/subprocess.rb:209:in `execute’
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.5.0/lib/vagrant/util/subprocess.rb:22:in `execute’
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.5.0/lib/vagrant/util/powershell.rb:32:in `execute’
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.5.0/plugins/providers/hyperv/driver.rb:96:in `execute_pow
ershell’

こんな感じで、エラーが出ると途方にくれますね。
[SET VAGRANT_LOG=debug]で詳細ログを見ると、原因がわかるかも。

ちなみに今回のケースでは、仮想スイッチ名に日本語を使用していたらから、文字化けしちゃって使用できなかったから。仮想スイッチ名を[新しい仮想スイッチ]からアルファベット(たとえば[out]とか)にしたら正常に動作した。

Vagrant Cloudで、Vagrant Shareをやってみた

Vagrantのバージョン確認

Vagrant のバージョンが、1.5以降である必要があります。次のコマンドでVagrantのバージョンを確認しましょう。

vagrant -v

次に、Vagrant Cloudで、アカウントを作成します。
作成が終わったら、Vagrantでの操作に戻ります。

Vagrant upの準備

vagrant shareするには、httpサーバーを動かしている必要があるので、httpdをインストールするVagrantfileを用意する。ポートフォワードを使用することにして、次のようなVagrantfileを使った。

Vagrantfile

VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "hashicorp/precise32"
  config.vm.network "forwarded_port", guest: 80, host: 8080
  config.vm.provision:shell,:inline=> <<-EOT
    yum update -y
    service iptables stop
    chkconfig iptables off
  
    yum -y install httpd
    chkconfig httpd on
    service httpd start
  EOT
end

ファイルを準備したら、仮想マシンを起動する。

vagrant up

 

vagrant login

vagrant shareするには、Vagrant Cloudにログインしておく必要があるので、次のコマンドでログインする。

vagrant login

 

vagrant share

ここまでで準備が完了なので、vagrant shareしてみる。

vagrant share

次のように結果が出力されるので、ブラウザでアクセスしてみる。
image

 

http://slick-moose-8753.vagrantshare.comに接続すると・・・

image

 

無事、アクセスできますね。これは便利!!

ちなみに、Vagrant Cloudで確認すると、次のように状態管理されていることが確認できます。

image

 

後片付け

Ctrl+c

で、Varant Shareを終了させる。
Ctrl+cで終了させると、Vagrant Cloudにも連携して、割り当てが解除される。

ウィンドウを×で閉じちゃうと、Vagrant shareは終了して、アクセスできなくなるけど、1時間たつまでは、Vagrant Cloudにそのまま情報が残る。アクセスできないし、1時間で解除されるから×で閉じてもいいけど、気持ち悪いのでおとなしく、Ctrl+cで止めましょう。

まとめ

ローカルで開発して、それの動作確認をインターネットごしにできるのは、開発用とだけでみると素敵に楽すぎる。

vagrant cloudの「Shares」概要:Vagrant環境の共有

Sharesは、インターネットにネットワークで接続している人が誰でもVagrant動作環境に接続共有できるようにするものです。
いくつかの共有タイプがあります。

HTTP Sharing

デフォルトで、Vagrant Shareは世界中の誰でもVagrant環境にHTTPアクセスできるように共有します。作成したURLは、公にアクセスできるようにし、アクセスするのにVagrantは不要でブラウザだけでアクセスできます。

$ vagrant share
==> default: Local HTTP port: 5000
    default: Local HTTPS port: disabled
==> default: Your Vagrant Share is running!
==> default: URL: http://frosty-weasel-0857.vagrantshare.com

一度、shareを作成すると、比較的わかりにくいURLが出力されます。このURLは直接起動したVagrant環境にルーティングします。将来的には、アクセス生業や監査ログ機能が追加される予定です。

SSH Access

Vagrant Shareは、1つフラグをたてるだけで、誰でも簡単にVagrant環境にSSHできるようにします。

SSH Accessはデフォルトでは共有されます。SSH共有を有効にするには、[vagrant share]に、[—ssh]フラグをつけなければなりません

$ vagrant share –ssh
==> default: SSH Port: 22
==> default: Generating new SSH key…
    default: Please enter a password to encrypt the key:
    default: Repeat the password to confirm:
    default: Inserting generated SSH key into machine…
==> default: Checking authentication and authorization…
==> default: Creating Vagrant Share session…
    default: Share will be at: awful-squirrel-9454
==> default: Your Vagrant Share is running!

[–ssh]フラグを立てると、VagrantはSSH Access用に新しいSSHキーペアを生成します。公開鍵は自動的にVagrant環境に挿入されます。非公開鍵は、Vagrant Share接続管理用サーバーにアップロードされます。パスワードで暗号化された非公開鍵はどこにもアップロードされません。

SSH Accessがshareされると、Vagrant環境にアクセスしたい人は、SSHするために[vagrant connect]を使用します。

$ vagrant connect --ssh awful-squirrel-9454
Loading share 'awful-squirrel-9454'...
Password for the private key:
Executing SSH...
Welcome to Ubuntu 12.04.1 LTS
 * Documentation:  https://help.ubuntu.com/
Last login: Wed Feb 26 08:38:55 2014 from 192.168.148.1
vagrant@precise64:/vagrant$

Vagrant Connect

Vagrant Shareは、TCP/UDP接続を共有できます。

[vagrant connect SHARE-NAME]を実行して共有します。

$ vagrant connect awful-squirrel-9454
==> connect: Connecting to: awful-squirrel-9454
==> connect: Starting a VM for a static connect IP.
    connect: The machine is booted and ready!
==> connect: Connect is running!
==> connect: SOCKS address: 127.0.0.1:62167
==> connect: Machine IP: 172.16.0.2
==> connect:
==> connect: Press Ctrl-C to stop connection.
...