HashiCorp Packerを使いこなす:ProxmoxとVMwareでのVMテンプレート自動作成術

Virtualization tutorial - IT technology blog
Virtualization tutorial - IT technology blog

OSの手動インストール作業から解放されよう

入社初日、一番の悩みは仮想マシン(VM)の手動インストール作業でした。開発チームが新しいUbuntuやCentOSを必要とするたびに、ISOファイルをマウントし、「次へ」を何度もクリックし、ユーザー名を設定し、SSHキーをコピーする…。1台や2台ならまだしも, 1日に10台も作ると、さすがに疲弊してしまいます。

現在、私は15台以上のVMを抱えるProxmoxのホームラボを管理しています。もし手動インストールのままだったら、サーバー1台につき約30分はかかっていたでしょう。リポジトリの設定ミスやファイアウォールの消し忘れも起こり得ます。そこで導入したのがHashiCorp Packerです。このツールを使えば、インストールプロセスをクリーンなコードに変えることができます(Infrastructure as Code)。コマンドを1回叩いてコーヒーを飲んでいる間に、Proxmox上にテンプレートが出来上がります。

Packerのインストールは一瞬

PackerはWindows、Mac、Linuxなど、あらゆる環境にインストール可能です。Ubuntuを使用している場合は、ターミナルで以下のコマンドを実行してください:

wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update && sudo apt install packer

packer versionを実行して正常にインストールされたことを確認しましょう。次に、最初のプロジェクト用のディレクトリを作成します:

mkdir packer-lab && cd packer-lab
touch ubuntu-2204.pkr.hcl

必要なプラグインを自動でダウンロードするために、packer init .を実行するのを忘れないでください。

Packerの仕組み:内部では何が起きているのか?

Packerが既存のOSを上書きすると勘違いされることがありますが、実際には非常に洗練されたプロセスで動作します:

  1. 一時的なVMの作成: PackerはProxmox/VMwareに、元のISOファイルから新しい仮想マシンをゼロから作成するよう命令します。
  2. フォームの自動入力: user-data(Cloud-init)を使用して、OSインストール時の質問(タイムゾーン、言語、ディスク構成など)に自動で回答します。
  3. プロビジョニング: OSが起動すると、PackerはSSHで接続し、DockerやNginx、監視エージェントなどを必要に応じてインストールします。
  4. テンプレート化: 最後に、マシンをシャットダウンしてテンプレートに変換し、不要な一時ファイルをクリーンアップします。

設定にはHCL(HashiCorp Configuration Language)という言語を使用します。Terraformを触ったことがあれば、すぐに馴染めるでしょう。CI/CDのプロセスで設定ファイルを変換する必要がある場合は、YAML ↔ JSON Converterが便利です。ブラウザ上で動作するため、機密情報が漏洩する心配もありません。

実践:Proxmoxでテンプレートを作成する

以下は、Ubuntuテンプレートを作成するための基本的なHCLファイルです。実行前にProxmoxのAPIトークンを準備しておいてください。

# ubuntu-2204.pkr.hcl

source "proxmox-iso" "ubuntu" {
  proxmox_url = "https://192.168.1.100:8006/api2/json"
  username    = "root@pam!packer_token"
  token       = "あなたのシークレット"
  
  node                 = "pve"
  iso_file            = "local:iso/ubuntu-22.04-live-server-amd64.iso"
  vm_name              = "ubuntu-2204-template"
  memory               = 2048
  cores                = 2
  
  network_adapters {
    model = "virtio"
    bridge = "vmbr0"
  }

  ssh_username = "ubuntu"
  ssh_password = "itfromzero-random-pass"
  ssh_timeout  = "20m"
}

セキュリティに関するヒント:パスワードをファイルに直接書き込む(ハードコードする)のは絶対にやめましょう。Password Generatorでランダムな文字列を生成し、環境変数に保存することをお勧めします。これにより、GitHubにコードをプッシュする際も安心です。

VMware (vSphere) の場合は?

VMwareの構文もほぼ同じで、ビルダーを vsphere-iso に変更するだけです。共通の構成フレームワークを使用することで、仮想化プラットフォームを問わずサーバーの構成を統一できます。

高度なテクニック:Cloud-initとシステムのクリーンアップ

優れたテンプレートとは、起動時に自動設定が可能なものです。PackerとCloud-initを組み合わせてSSHキーを事前注入しましょう。また、provisioner "shell" を使用してビルド時にOSを最適化します:

build {
  sources = ["source.proxmox-iso.ubuntu"]

  provisioner "shell" {
    inline = [
      "sudo apt-get update",
      "sudo apt-get install -y qemu-guest-agent",
      "sudo truncate -s 0 /etc/machine-id"
    ]
  }
}

注意:machine-id の削除は必須です。これを忘れると、このテンプレートから作成されたすべてのVMが同じIDを持つことになり、DHCPネットワーク内でのIP衝突など、非常に面倒なトラブルの原因になります。

ビルド前に、ISOファイルが破損していないか確認してください。私はよく Hash Generator を使ってSHA-256チェックサムを確認します。インストールの失敗で数時間を無駄にするより、10秒のチェックに時間をかける方が賢明です。

Packer使用時の教訓とベストプラクティス

  • ハードコードを避ける: IPアドレス、ユーザー名、パスワードなどのパラメータには variables.pkr.hcl ファイルを使用してください。
  • iso_checksumを確認する: ISOファイルが壊れている場合、Packerはすぐに停止するため、無駄な作業を省けます。
  • Makefileの活用: make build-ubuntu のように、ビルドコマンドをMakefileにまとめておくと作業が捗ります。
  • エラー時はログを有効化: ビルドが失敗した場合は、PACKER_LOG=1 packer build . を実行して、各ステップの動作を詳細に確認してください。

この記事が、手動でのVMインストール作業からあなたを解放する助けになれば幸いです。早めに自動化を導入することで、より創造的な研究や開発に時間を割けるようになります。頑張ってください!

Share: