しばたテックブログ

PowerShellを中心に気分で書いている技術ブログです。

WindowsでVagrantを扱う私的まとめ (運用編)

インストール編とBox作成編Part.1Part.2の続きです。
最後にVagrantを使った運用周りについて書きます。

Vagrantfileの設定

VagrantでWindowsを扱う場合、Vagrantfileにいくつか独自の設定をする必要があります。

ゲストの種類

まずVMのゲストの種類をデフォルトのLinuxからWindowsにする必要があります。

config.vm.guest = :windows

通信方法

VagrantではWinRMを使ってゲストのWindows OSを管理するためCommunicatorをデフォルトのSSHからWinRMに変更します。

config.vm.communicator = "winrm"

また、WinRMとリモート管理のためにRDPのポートに対してポートフォーワードする様にします。

config.vm.network :forwarded_port, guest: 3389, host: 13389
config.vm.network :forwarded_port, guest: 5985, host: 15985, id: "winrm", auto_correct: true

プロビジョニング方法

WindowsではデフォルトでShell Provisonerが使え、PowerShellのスクリプトを実行することができます。

config.vm.provision "shell", inline: "Write-Host 'Hello Worl!'"

内部動作としては、指定されたブロックやスクリプトファイルをpowershell.exe -ExecutionPolicy Bypassで実行しています。
powershell_argsパラメーターを設定することで実行するPowerShellに追加のオプションを設定することもできます。

他にはPuppet Apply ProvisonerがWindowsでも使えるっぽいですが試していません。*1

Vagrantfile 設定例

上記を踏まえた最低限必要な設定を以下に示します。

単体ゲストの設定

Vagrant.configure(2) do |config|
  # Box名を指定
  config.vm.box = "Win2012R2"
  # ゲストの種類をWindowsにする
  config.vm.guest = :windows
  # 既定の通信方法をsshからwinrmに変更する
  config.vm.communicator = "winrm"
  # RDPとWinRMのポートフォーワーディング設定を行う
  config.vm.network :forwarded_port, guest: 3389, host: 13389
  config.vm.network :forwarded_port, guest: 5985, host: 15985, id: "winrm", auto_correct: true

  config.vm.provider "virtualbox" do |vb|
    # Windowsの場合はGUIを表示しておいた方が何かと便利
    vb.gui = true
    # VirtualBox 5.0なら準仮想化を有効にすると良い
    # vb.customize ["modifyvm", :id, "--paravirtprovider", "hyperv"]
  end
end

複数ゲストの設定

Vagrantfileで複数ゲストを扱う場合は、以下の設定例の様に各ゲスト毎のブロックを作ります。
VM名やポートフォーワードするポートが重複しない様に気をつけてください。

Vagrant.configure(2) do |config|
  # サーバー1
  config.vm.define "server01" do |server01|
    server01.vm.box = "Win2012R2"
    server01.vm.guest = :windows
    server01.vm.communicator = "winrm"
    server01.vm.network :forwarded_port, guest: 3389, host: 13389
    server01.vm.network :forwarded_port, guest: 5985, host: 15985, id: "winrm", auto_correct: true
    server01.vm.provider "virtualbox" do |vb|
      vb.gui = true
      # vb.customize ["modifyvm", :id, "--paravirtprovider", "hyperv"]
    end
  end

  # サーバー2
  config.vm.define "server02" do |server02|
    server02.vm.box = "Win2012R2"
    server02.vm.guest = :windows
    server02.vm.communicator = "winrm"
    server02.vm.network :forwarded_port, guest: 3389, host: 23389
    server02.vm.network :forwarded_port, guest: 5985, host: 25985, id: "winrm", auto_correct: true
    server02.vm.provider "virtualbox" do |vb|
      vb.gui = true
      # vb.customize ["modifyvm", :id, "--paravirtprovider", "hyperv"]
    end
  end
end

よく使うコマンドとデバッグオプション

よく使うコマンドについて軽く説明します。詳細は公式のヘルプをみてください。

vagrant init

最初に一回だけ行います。
ディレクトリの初期化処理と、Boxに応じた初期Vagrantfileを作成します。

vagrant init [ボックス名]

vagrant up

ゲストVMを起動します。VM名を指定しない場合は全てのVMを起動します。

vagrant up [VM名]

vagrant halt

ゲストVMをシャットダウンします。VM名を指定しない場合は全てのVMを停止します。

vagrant halt [VM名]

vagrant rdp

ゲストVMにRDPで接続します。複数VMある場合はVM名の指定が必須になります。
ホストOSがWindowsの場合はmstsc.exeが実行され、--の後ろにmstsc.exeの引数を指定することも可能です。
詳細については公式のヘルプを参照してください。

vagrant rdp [VM名]

or

vagrant rdp [VM名] -- [mstsc.exeのオプション]

また、ホストOSがWindowsでない場合、Macの場合は.rdpファイルに紐づくアプリを、その他Linuxの場合はrdesktopを起動しようと試みます。

vagrant destroy

VMを破棄します。実行の際は注意して行ってください。

vagrant destory [VM名]

--debugオプション

各コマンドの末尾に--debugを付けるとコマンド実行時に標準エラー出力にデバッグログを出すことができます。
コマンドの実行に失敗した場合にこのオプションをつけて再実行することで調査の役に立つことがあります。

vagrant up --debug

プラグインについて

Vagrantはプラグイン方式で機能を追加することができます。
プラグインの実態はGemパッケージでどの様なプラグインが存在するかはGemを検索することで見つけることが出来ます。だいたいの場合vagrant-****という名称になっているので、こちらのリンクから探すと見つけやすいでしょう。

あと、vagrantの便利に使えるプラグイン6選 - Qiitaで紹介されているプラグインはお勧めです。

その他注意事項

Vagrant WinRMにおける日本語の扱い

現在Vagrantが使用しているWinRMライブラリは日本語の扱いに難が有り、実質日本語は扱えないものとして考えた方が良いでしょう。
これによって何が問題かというと日本語のWindowsをインストールした際にNIC名が日本語(ローカルエリア接続イーサネット)な為にIPアドレスを設定する際にエラーが発生してしまう場合があります。
これを解決するにはNIC名をASCII文字にしておく必要があります。*2

*1:ソースを見る限りWindows向けのコードがあるのは確認しました。

*2:Vagrant自体にパッチを当てる方法もあるのですが、こちらについては別エントリで書きます。