まえがき
VagrantでWindowsをゲストとしたBoxを構築する場合、Linuxなどで使用される起動時のSSHが使用出来ない。
Windowsがゲストの場合、WinRMというSOAPベースのプロトコルが使用されるらしい。
そのため、box化するWindowsのWinRMの設定が必要となるのだが、設定がなかなか見つからなかったためまとめておく。
設定手順(ゲスト側)
Vagrantユーザーの追加
これは…管理者権限持った「vagrant」という名前のユーザーを「vagrant」というパスワードで追加してやればいいだけなので割愛。
firewallの穴あけ
WinRMが使用する以下のTCPポートを開る。
port |
---|
5985 |
5986 |
Enable-PSRemoting
これをやらないと、ハマります。
PowerShellを「管理者として実行」で起動して
Enable-PSRemoting
と入力し、以下のようなメッセージが出てきたら、 A を入力していく
PS C:\WINDOWS\system32> Enable-PSRemoting
WinRM クイック構成
Windows リモート管理 (WinRM)
サービスを使用して、このコンピューターのリモート管理を有効にするコマンド
"Set-WSManQuickConfig" を実行します。
これには、次の処理が含まれます:
1. WinRM サービスを開始または (既に開始されている場合は) 再起動します。
2. WinRM サービスのスタートアップの種類を [自動] に設定します。
3. どの IP アドレスでも要求を受け付けるリスナーを作成します。
4. WS-Management トラフィック用の Windows
ファイアウォールの受信規則の例外を有効にします (HTTP のみ)。
続行しますか?
[Y] はい(Y) [A] すべて続行(A) [N] いいえ(N) [L] すべて無視(L) [S] 中断(S) [?] ヘルプ
(既定値は "Y"):a
WinRM は既にこのコンピューター上で要求を受信するように設定されています。
このコンピューター上でのリモート管理には、WinRM が既に設定されています。
確認
この操作を実行しますか?
対象 "名前: microsoft.powershell SDDL:
O:NSG:BAD:P(A;;GA;;;BA)(A;;GA;;;IU)(A;;GA;;;RM)S:P(AU;FA;GA;;;WD)(AU;SA;GXGW;;;WD)。選択し
たユーザーがこのコンピューターに対して Windows PowerShell
コマンドをリモートで実行できるようにします。" に対して操作 "Set-PSSessionConfiguration"
を実行しています。
[Y] はい(Y) [A] すべて続行(A) [N] いいえ(N) [L] すべて無視(L) [S] 中断(S) [?] ヘルプ
(既定値は "Y"):a
PS C:\WINDOWS\system32>
WinRMの設定
そのまま、PowerShellで以下を実行する。
winrm quickconfig -q
winrm set winrm/config/winrs '@{MaxMemoryPerShellMB="512"}'
winrm set winrm/config '@{MaxTimeoutms="1800000"}'
winrm set winrm/config/service '@{AllowUnencrypted="true"}'
winrm set winrm/config/service/auth '@{Basic="true"}'
sc.exe config WinRM start= auto
疎通確認
そのままPowerShellから以下を実行
(-Split (( winrm id | where {$_ -like '*ProductVersion*'}) -Split '=')[1])[5]
エラーにならなければ(「3.0」と表示されるはず)OK。
設定手順(ホスト側)
VagrantfileのVMのWindowsのboxベースのVMの設定に以下を記載する
config.vm.guest = :windows
config.vm.communicator = "winrm"
config.vm.provider "virtualbox" do |vb|
vb.gui = true
vb.memory = "4096"
vb.customize ["modifyvm", :id, "--paravirtprovider", "hyperv", "--hardwareuuid", "ほげほげ"]
end
備考
「modifyvm」で「hardwareuuid」を指定しているのは、ライセンス認証を通したマシンのUUIDを設定しておかないと、別のマシンと判断されて、ライセンス認証しないといけなくなるため…
悪用厳禁です!
同じ「hardwareuuid」を持ったVMを同時起動しないこと!(同時起動するとライセンス違反になると思いますので…同じマシンが2つあるって、そもそも、あり得ないお話でしょうから)
参考
PowerShellでリモートPCの操作を行うに為にEnable-PSRemotingをするための準備
WindowsでVagrantを扱う私的まとめ (Windows OSのBox作成編 Part.1)