日記

日本語の勉強のためのブログ

Vagrantを使って仮想マシンの初期設定を自動化する

注意

GUI仮想マシンUbuntu Desktopなど)は対象としていません。

はじめに

訳あってVirtualBox上のUbuntu仮想マシンUbuntu Server)を使用する必要が出てきた*1が、初期設定が非常に面倒である。
そこでVagrantを導入し、自動で仮想マシンを作成してもらうことにする。さらに作成後のパッケージ追加なども自動化する。

環境

1. VagrantVirtualBoxのインストール

winget*2を使うことで即座にインストールが完了する。

# PowerShellで以下を実行
winget install Oracle.VirtualBox Hashicorp.Vagrant

インストール完了後、再起動する。

2. Vagrantfileの作成

Vagrantでは、Vagrantfileの記述に沿って仮想マシンが自動的にセットアップされる。
Vagrantfileを作成するには、適当なディレクトリでvagrant init <Box名>を実行すればよい。
ここでBoxとは、仮想マシンのベースとなるimageを指している*3。とりあえずはDockerのimageと同じような解釈でいいと思う。

たとえば、bento/ubuntu-22.04というBoxを使用するためのVagrantfileを作成するには、以下を実行すればよい。

# PowerShellで以下を実行
vagrant init bento/ubuntu-22.04

3. Vagrantfileの追記

今回は仮想マシン作成後のパッケージ追加まで自動化したいので、Vagrantfileの末尾にあるconfig.vm.provisionあたりを修正する。
provisionを設定することで、マシン作成後に実行してほしいコマンドを指定できる。

たとえば、apt updateapt install vimを実行してほしい場合、Vagrantfileを次のように修正する。

(前略)
  # Enable provisioning with a shell script. Additional provisioners such as
  # Ansible, Chef, Docker, Puppet and Salt are also available. Please see the
  # documentation for more information about their specific syntax and use.
  config.vm.provision "shell", inline: <<-SHELL
    apt update
    apt install -y vim
  SHELL
end

補足:default: SSH auth methodで止まる・タイムアウトする場合

さまざまな解決法があるようだが、自分の環境では以下の記事を参考にしたら解決した。

qiita.com

ただ、別のBoxを試したほうがいい気もする。ちなみに自分の環境ではgeneric/ubuntu2204なら止まらず動作した。

(追記)
vagrant up --debugデバッグ情報を出力するようにしたところ、成功率が上がった気がする。

4. 仮想マシンの立ち上げ

ここまで来たらvagrant upを実行することで、初期設定と立ち上げが自動実行される。
立ち上げ後、vagrant sshを実行すればターミナルにアクセス可能である。

ちなみに仮想マシンを止めたい際はvagrant haltを実行すればよい。

補足:ホスト側のディレクトリをマウントする

これもVagrantfileの書き換えで可能。ゲスト側のディレクトリの場所は絶対パスで書く必要があるとのこと。

(前略)
  # Share an additional folder to the guest VM. The first argument is
  # the path on the host to the actual folder. The second argument is
  # the path on the guest to mount the folder. And the optional third
  # argument is a set of non-required options.
  config.vm.synced_folder "../host_directory", "/guest_directory"
(後略)

*1:訳ありでDockerやWSLは使えない

*2:簡単に言えば、Ubuntuで言うaptのようなもの

*3:https://developer.hashicorp.com/vagrant/tutorials/getting-started/getting-started-boxes