AnsibleによるVMware vSphereの自動化:「手動クリック」から「Infrastructure as Code」による管理へ

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

vCenterでの手動クリック作業からの解放

私は現在、8台のESXiホストと約150台のVM(仮想マシン)で構成されるクラスターを運用しています。以前は、開発チームからテスト用に10〜20台のVM作成を依頼されるたびに、気が重くなっていました。テンプレートの選択、命名、メモリやCPUの調整、そして手動でのIP設定という一連の作業は、非常に時間がかかる上にミスも発生しやすかったからです。

Infrastructure as Code (IaC) としてAnsibleを導入したことで、状況は一変しました。仮想マシンにエージェントをインストールする必要はなく、シンプルなYAMLファイルを記述するだけです。最大のメリットは「べき等性(Idempotency)」です。つまり、スクリプトを何度実行しても、Ansibleは実際の状態が記述した内容と異なる場合にのみ変更を加えます。

本記事では、「ボタン一つでVMが完成する環境の構築方法を紹介します。プロビジョニング時間を1時間からわずか2分足らずに短縮しましょう。

なぜVMwareにはAnsibleが最適なのか?

実際の現場では、単にVMを作成するだけでは不十分です。システムの負荷に応じたメモリ増設、ディスクの追加、プロジェクト終了時の削除といったライフサイクル管理が必要です。Ansibleは、専用のAPIモジュールを通じてこれらの課題を解決します。

あなたは「あるべき状態(Desired State)」を定義するだけです。例えば、「UbuntuのVMを5台、2 CPU、4GB RAMで用意する」と記述すれば、Ansibleが自動的にvCenterと比較します。不足していれば追加し、設定が間違っていれば修正します。このアプローチにより、インフラ構成が常に統一され、「このVMだけ設定が違う」という事態を防げます。

環境構築の準備

AnsibleがvCenterと「対話」するためには、コントロールノード(通常はUbuntuやCentOS)が必要です。このマシンから vCenterのIPアドレスに対してポート443で通信できることを確認してください。

1. 依存ライブラリのインストール

AnsibleはVMwareのAPIとやり取りするためにPythonライブラリを使用します。以下の2つをインストールしてください。

pip install pyvmomi pyVim

2. VMware Collectionのインストール

現在、VMware用のモジュールは専用のコレクションにまとめられています。以下のコマンドでインストールします。

ansible-galaxy collection install community.vmware

セキュリティに関する注意点: [email protected] アカウントを直接使用するのは避けましょう。専用のサービスアカウント(例:ansible-svc)を作成し、VMの作成・削除に必要な権限のみをロールベースで割り当ててください

VM自動作成Playbookの作成

以下は、最も一般的なシナリオである、既存のテンプレートからVMをクローンし、即座に静的IPを設定するPlaybookです。

Playbookのサンプル (deploy_vm.yml)

---
- name: vSphere上でのVM自動デプロイ
  hosts: localhost
  gather_facts: false
  vars:
    vcenter_host: "vcenter.company.com"
    vcenter_user: "[email protected]"
    vcenter_pass: "Ansible-Vaultを使用すべきパスワード"

  tasks:
    - name: テンプレートからVMをクローンしハードウェアを構成
      community.vmware.vmware_guest:
        hostname: "{{ vcenter_host }}"
        username: "{{ vcenter_user }}"
        password: "{{ vcenter_pass }}"
        validate_certs: false
        datacenter: "Hanoi-Datacenter"
        cluster: "Prod-Cluster"
        datastore: "PureStorage-LUN01"
        name: "web-app-prod-01"
        template: "ubuntu-22.04-gold-image"
        state: poweredon
        networks:
          - name: "VLAN-10-Web"
            ip: "10.10.10.50"
            netmask: "255.255.255.0"
            gateway: "10.10.10.1"
        hardware:
          memory_mb: 4096
          num_cpus: 2
        wait_for_ip_address: true
      delegate_to: localhost

重要なポイント:

  • delegate_to: localhost: 非常に重要です。vCenterにSSH接続しようとするのではなく、コントロールノード上でモジュールを実行してAPIを呼び出すようにAnsibleに指示します。
  • wait_for_ip_address: VMware ToolsがIPアドレスを報告するまでPlaybookを一時停止します。これにより、後続のソフトウェアインストールタスクで接続エラーが発生するのを防ぎます。
  • state: poweredon: クローン作成後、すぐにVMが起動した状態になるようにします。

Loop(ループ)による大規模環境への最適化

5台のVMを同時に作成する必要がある場合、コードを5回コピー&ペーストしてはいけません。with_items 機能を使用して、Playbookを効率的な製造ラインに変えましょう。

    - name: プロジェクト用VMの一括作成
      community.vmware.vmware_guest:
        name: "{{ item.name }}"
        networks:
          - name: "VM Network"
            ip: "{{ item.ip }}"
      with_items:
        - { name: 'worker-01', ip: '10.10.10.61' }
        - { name: 'worker-02', ip: '10.10.10.62' }
        - { name: 'worker-03', ip: '10.10.10.63' }

トラブルシューティングと確認

ansible-playbook deploy_vm.yml を実行する際は、出力の色に注目してください。黄色(Changed)はシステムに変更が加えられたことを意味します。緑色(OK)はすでに設定通りであり、何も変更する必要がなかったことを意味します。

エラー(赤色)が発生した場合は、-vvv フラグを追加してください。AnsibleがvCenterに送信したJSONリクエストの詳細ログが表示されます。多くの場合、原因はvCenter上のデータストア名やリソースプールの名前がコード内の記述と一致していないことにあります。

また、私はよく vmware_guest_info モジュールを使用してインフラ全体をスキャンしています。vSphere Clientで手動で数える代わりに、わずか30秒で150台のVMリストとそのメモリ/CPU構成をレポートとして出力できます。

おわりに

VMwareの自動化は、単に手間を省くだけではありません。手作業による「うっかりミス」を完全に排除できます。標準的なPlaybookが完成すれば、管理するホストが8台でも80台でも、同じように楽に管理できるようになります。

私からのアドバイス:まずはスケジュールに合わせたVMの起動・停止といった小さな作業から始めてみてください。慣れてきたら、ディスク容量が不足した際の自動拡張など、より複雑なフローを構築してみましょう。皆さんがコードによるインフラ管理をマスターできることを願っています!

Share: