Help us understand the problem. What is going on with this article?

WindowsでVagrantな仮想マシンをサービスとして常駐させる

More than 1 year has passed since last update.

経緯

VMをVagrantで管理している人はそれなりに居ると思う。特にWindowsユーザーの人には多いんじゃないかなぁーいくらWSLが最高とはいえ、不安になる点がいくつかあるのは事実だし。

で、そんなことをしていると思うことがあるわけでして。
「VagrantなVMを常駐させたい!」

ここ数年ChinachuをVagrantで動かしているのだが、再起動のたびに vagrant halt するのがかったるくて仕方がない。
厄介なのが vagrant halt せずにシャットダウンとかしちゃうと、VMがぶっ壊れてうまく動かなくなる事があったりもする(VirtualBox特有の症状なのかもだけど)
その昔、タスクスケジューラで同様のことをやろうとしたのだがうまく動いてくれなかった。おそらく「シャットダウンの前」ではなく「シャットダウン中」に動くためVirtualBoxが中途半端に終了しちゃっているんじゃないかと邪推している。

そんなこんなでNSSMでVagrantでのVM管理をサービス化しちゃおうという話。

概要

NSSMを入れて、適当に設定して、おしまい。
NSSMを本格的に利用したのは今回が初だが、これは「何でもサービス化しちゃう」という強力なツール。

勘所としては、「Vagrantで起動したVirtualBoxを掴み続ける」というのが予想以上に難しかったので、起動&動作を観察する的なbatを作って、これをサービスとして登録している。

試した環境は以下の通り。理論上はHyper-VなVMでも同じことができるとは思う。

  • Windows 10 Pro for Workstations 1803
  • VirtualBox 5.2.8
  • Vagrant 2.0.4
  • NSSM 2.24

下準備

各種batを準備

起動用とか終了用とかのbatたち。Vagrantfile と同じ階層に保存しておく。

起動&死活監視用bat

start_and_check.bat

cd /d %~dp0
C:\HashiCorp\Vagrant\bin\vagrant.exe up

@echo off
:loop
  curl http://localhost:20772  > nul
  if not %ERRORLEVEL%==0 goto :eof
  powershell sleep 10
goto :loop

:loop な部分に関しては環境に応じて見直すと良さそう。
SSHのポートをチェックする…とかでもいいのかもね。

終了用bat

halt.bat

cd /d %~dp0
C:\HashiCorp\Vagrant\bin\vagrant.exe halt

NSSMをインストール

公式サイトがいつも不安定。この記事を書いているときはつながったけど、いつ繋がらなくなるかわかったもんじゃない…
NSSM - the Non-Sucking Service Manager

なので私はChocolateyで入れた。(Chocolateyのインストールがまだな人はここを参照)
Chocolatey Gallery | NSSM - the Non-Sucking Service Manager 2.24.101.20180116

choco install nssm

サクッとすぐ入る。管理者権限で動かした cmd.exe とかで nssm って打つとこんな感じ出てくる。
image.png

設定カキカキ

管理者権限で動かした cmd.exe とかで nssm install xxxxx を実行すると新規サービスが作れる。作ったサービスは nssm edit xxxxx で編集できる
私はChinachuを動作させるVMを動かしたかったわけなので以下のようにした。

nssm install chinachu

以下設定項目のスクショを貼り付けておく(ちなみにスクショは nssm edit chinachu で撮っているが、そこは気になさらず)

Application

image.png
Path には起動用のbatを Startup directory には Vagrantfile が設置されているディレクトリをそれぞれ設定

Details

image.png
VirtualBoxが最低限必要としているサービスがいまいちわからなかったので、日和って遅延実行にしている。恐らく遅延実行じゃなくてもちゃんと動くとは思うけど…

Log on

image.png
ここ、ハマった。
Log on as はちゃんと設定しようね。

Process

image.png
Console window にチェックが入っていればそれで良さそう。

Shutdown

image.png
雑だけど、とりあえずこれで動いている。

Exit action

image.png
Restart application にしてある。

I/O

image.png
特に必須じゃないけど、デバッグとかをしたいのであれば設定しておくとログがファイルに書き出されるので便利。

Hooks

image.png
image.png

Service stopApplication exit にそれぞれ終了用batを設定している

動作確認

いぇーい

image.png

所感

NSSMは便利。

余談

ちなみに上記で動かしたVirtualBoxなVMはなぜかマネージャーから眺められない。
変な方法で起動しているからなのかなぁ…
Vagrantfile で定義したプロビジョナーで全部設定を済ませてしまって以後いじらない…みたいな使い方をしているといいのかもだけど vagrant ssh とかができない。
今のところ私は支障をきたしてはいないので、まぁいいかなーと割り切って詳しく調べてはないけど、使い方によっては結構不便なのかも。
image.png

恐らく実行タイミング or 実行ユーザーが何かしらの原因なんじゃないかと邪推しているけど、真相は不明。

yanoshi
ここはメモ書き。 誰かの役に立つこともあるかもしれない。
http://yanoshi.hatenablog.jp
dmmcom
総合エンタテイメントサイト「DMM.com」を運営。会員数は2,900万人を突破。動画配信、FX、英会話、ゲーム、太陽光発電、3Dプリンタなど40以上のサービスを展開。沖縄での水族館事業参入、ベルギーでのサッカークラブ経営など、様々な事業を手掛ける。また2018年より若手起業家の支援を強化、「DMM VENTURES」による出資や、M&Aなどを積極的に展開している。
https://dmm-corp.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした