インストール編とBox作成編Part.1、Part.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