「Click-ops」に別れを:TerraformによるVMware vSphereの自動化

VMware tutorial - IT technology blog
VMware tutorial - IT technology blog

VMwareインフラ管理における3つの進化段階

VMwareを管理しているなら, おそらく以下の3つの「段階」のいずれかに該当するでしょう. 自分がどこにいるか確認してみてください.

  • レベル1:手動管理(GUIベース). vCenterにログインし, クラスターを右クリックして「新規仮想マシン」を選択します. 1〜2台作成するだけなら問題ありません. しかし, K8sを実行するために20台の仮想マシンが必要な場合, 2時間ずっと「次へ, 次へ, 完了」をクリックし続けるのは苦行です.
  • レベル2:スクリプティング(PowerCLI). PowerShellを使用してvCenterに命令を出します. この方法は高速ですが, 「命令型(Imperative)」です. マシンにステップA, B, Cを実行するように教える必要があります. チェックせずにスクリプトを再実行すると, 名前の重複やリソースの既存によりエラーが発生しやすくなります.
  • レベル3:Infrastructure as Code(Terraform). これは「宣言型(Declarative)」の考え方です. 最終的な状態を記述するだけです. 例えば「Ubuntuマシン3台, 4GB RAM, Network VLAN 10が欲しい」と記述すれば, Terraformが現実と一致するように自動的に計算してくれます.

なぜTerraformはPowerCLIよりも「価値がある」のか?

以前, 私はLinux仮想マシンを10台クローンし, 手動でIPを変更するためだけに午後を丸々潰したことがありました. Terraformに切り替えてから, すべてが完全に変わりました. 最大のメリットはState Management(状態管理)です.

Terraformはterraform.tfstateファイルを使用してインフラの状態を記録します. 誰かが誤ってvCenter上の仮想マシンを削除しても, Terraformは即座にそれを検知します. 次回の実行時に, 元の状態を復元するためにそのマシンを自動的に再作成します.

もちろん, すべてが良いことばかりではありません. 基本的なプログラミング思考と標準的なディレクトリ構成が必要です. ステートファイルを紛失すると, 既存のインフラを再同期させるのにかなりの労力を要することになります.

実体験: ラボ環境をVMwareからProxmoxに移行した際, TerraformのおかげでProviderを変更するだけで済みました. RAM, CPU, ネットワークトポロジの構成全体が, 10分足らずで正確に再現されました.

作業を開始する前の準備チェックリスト

スムーズに開始するために, 以下の3つを準備してください.

  1. vCenter Server: 管理者権限, またはリソースの作成/削除権限を持つアカウント.
  2. Terraform Binary: HashiCorpから最新版をダウンロード.
  3. VM Template: OS(Ubuntu 22.04など)がインストール済みで, open-vm-toolsが含まれ, テンプレートに変換された仮想マシン.

4つのステップで最初の仮想マシンをデプロイする

ステップ1:vCenterへの接続

main.tfファイルを作成して, vCenterの情報を定義します. 注意:ラボ環境では自己署名証明書を使用することが多いため, allow_unverified_sslを有効にする必要があります.

provider "vsphere" {
  user           = "[email protected]"
  password       = "あなたのパスワード"
  vsphere_server = "vcenter.yourdomain.com"
  allow_unverified_ssl = true
}

ステップ2:リソースのクエリ(Data Sources)

IDをハードコード(直接入力)すると間違いやすいため, Terraformに名前からデータセンターやネットワークのIDを自動で探させます.

data "vsphere_datacenter" "dc" { name = "Datacenter-HN" }

data "vsphere_datastore" "ds" {
  name          = "Storage-SATA"
  datacenter_id = data.vsphere_datacenter.dc.id
}

data "vsphere_network" "net" {
  name          = "VM Network"
  datacenter_id = data.vsphere_datacenter.dc.id
}

ステップ3:仮想マシンの定義

ここでサーバーの「形」を設計します. 以下のコードは, テンプレートからクローンを作成し, 静的IPを自動的に割り当てます.

resource "vsphere_virtual_machine" "web" {
  name             = "web-server-01"
  resource_pool_id = data.vsphere_compute_cluster.cluster.resource_pool_id
  datastore_id     = data.vsphere_datastore.ds.id

  num_cpus = 2
  memory   = 4096
  guest_id = data.vsphere_virtual_machine.template.guest_id

  network_interface { network_id = data.vsphere_network.net.id }

  disk {
    label = "disk0"
    size  = 40
  }

  clone {
    template_uuid = data.vsphere_virtual_machine.template.id
    customize {
      linux_options {
        host_name = "web-server-01"
        domain    = "itfromzero.local"
      }
      network_interface {
        ipv4_address = "192.168.1.100"
        ipv4_netmask = 24
      }
      ipv4_gateway = "192.168.1.1"
    }
  }
}

ステップ4:実行コマンド

ターミナルを開き, 以下の3つの基本コマンドを実行します.

  • terraform init: 必要なプラグインをダウンロードします.
  • terraform plan: 変更内容をプレビューします. 稼働中の仮想マシンを誤って削除しないよう, このステップを注意深く確認してください.
  • terraform apply: yesと入力して実行結果を待ちます.

運用現場からのアドバイス

IaCを実際に導入する際は, 以下の3つの「生命線」となるルールを覚えておいてください.

  • ステートファイルを公開Gitにプッシュしないこと. このファイルにはパスワードやIPアドレスが含まれています. .gitignoreを使用するか, Terraform Cloudに保存して安全を確保してください.
  • 変数(Variables)を活用すること. IPアドレスをmainファイルにハードコードしないでください. variables.tfファイルに切り分けましょう. 10台作成する必要がある場合は, count変数の数値を変更するだけで済みます.
  • Cloud-initとの組み合わせ. 仮想マシンの作成だけで終わらせないでください. cloud-initを使用して, マシンが起動した直後にDockerのインストールやSSHキーの追加を自動化しましょう.

最初にコードへの移行を行う際は, セットアップに少し手間がかかるかもしれません. しかし, 長期的にはシステムがよりプロフェッショナルになり, 拡張も容易になります. 何より, 管理者の負担が大幅に軽減されるはずです.

Share: