Vagrant環境を作り直すワンライナー(halt && destroy -f && up)

  • Vagrant

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

vagrant環境を作り直したいとき用のワンライナー。

$ vagrant halt && vagrant destroy -f && vagrant up

vagrant halt でVMを停止、vagrant destroy -f でVMを削除、vagrant up で作り直す。3コマンドを繋げて実行するだけ。

destroy は単体だと「本当に削除する?」の確認プロンプトが出るが、-f(--force)を付けると確認なしで即削除される。ワンライナーで流す前提なら -f は必須。

用途としては、Vagrantfileやprovisioningスクリプトをいじった後に「クリーンな状態から作り直して確認したい」ときに使う。vagrant reload --provision でも設定変更は反映できるが、VM自体を作り直したい(ディスクの状態も含めてリセットしたい)場合はこっちの方が確実。

普段使いなら shell の alias や関数にしておくと打つ手間が減る。

haltを挟む理由

vagrant destroy -f だけでも動くには動く(destroy側で起動中のVMも止めて削除してくれる)。それでもhaltを先に挟んでいるのは、VirtualBoxなどのプロバイダ側でVMが起動したまま削除処理に入ると、ゲストOS側のシャットダウン処理をすっ飛ばして強制停止になるケース(ネットワークインターフェースの解放が中途半端になる、など)があるため。数百msの差だが、明示的に落としてから消す方が安全という認識。

destroyで消えるもの・消えないもの

  • 消える: VM本体(ディスクイメージ含む)、.vagrant ディレクトリ配下のVM固有情報
  • 消えない: ダウンロード済みのbox(vagrant box list に出てくるもの)、Vagrantfile自体

なのでbaseのOSイメージから作り直すわけではなく、あくまで「そのVagrantfileから生成されたVMインスタンス」をリセットするだけ。box自体を更新したい場合は別途 vagrant box update が必要。

地味に時間がかかる

up の中身次第だが、provisioningスクリプトが重い(パッケージインストールが多いなど)と、このワンライナー全体で数分かかることもある。synced folder(NFS等)を使っている場合は、up時にマウント周りの処理も入るので、頻繁に打つコマンドとしては地味にコストがある。頻度が高いなら、provisioningをidempotentに書いておいて vagrant reload --provision で済ませられないか検討した方がいい場面もありそう。