AnsibleでvSphere上に仮想マシンを大量展開する

この投稿は、vExperts Advent Calendar 2024  2日目です。
本当はvSAN関連で別のネタを用意していたのですが、パブリックに公開するにしては内容的にちょっとアレな気がしたので、没ネタについては機会があればオフラインイベントでご紹介しようかなと思います。

紆余曲折ありましたが、今年は少し角度を変えてAnsibleネタにしました。


仮想マシンを大量展開

検証用途などで大量にVMを展開したいケースなどあると思います。
一般的には
PowerCLIで実施するケースが多いと思いますが、個人的にはPowerCLIは好きじゃないのでAnsibleでやってみます。

 

 

Ansiblefor文ライクな繰り返し処理を記述する

 AnsibleのインストールやVMwareモジュールの使い方などについては前回、前々回のブログをご参照ください。

#前回ブログURL
https://itorwar.blogspot.com/2024/05/how-to-use-ansible-vmware-module.html 

#前々回ブログURL

https://itorwar.blogspot.com/2024/05/how-to-use-ansible-module-for-vxrail.html

 

Ansiblefor文のような繰り返し処理を記述するにはloopwith_itemsディレクティブを利用することで可能となります。

for文のような整数のシーケンスを生成するためには、rangeファンクションを使います。

どうやら最近はloop変数のほうが主流なようですが、本記事ではwith_items ディレクティブを利用しています。

Ansibleは細かい仕様や文法を知らなくても利用できる点が魅力だと思っておりますので、細かい解説はしません(というか知らない)。

ループをさせたいタスク内にwith_items ディレクティブを記述すると、with_items内で指定したシーケンスの数だけ繰り返しされます。

シーケンスはタスク内のitem変数に格納されて繰り返し処理のたびに違う変数を格納できます。

今回はシーケンスとしてrange関数で整数の連番を生成しているため、繰り返しのたびにインクリメントされた整数がitem変数に代入されます。

 

 

実装サンプルは以下です。(create_guestvm_loop.yml

~# cat create_guestvm_loop.yml
- hosts: localhost
  gather_facts: false
  tasks:
  - name: Create a virtual machine on given ESXi hostname or cluster
    with_items:
      - "{{ range(1, 700 + 1) | list }}"   # VM名に付与するサフィックス。1~700まで1ずつインクリメントしながら繰り返す
    vmware_guest:
      name: "test{{ item }}"                 # VM名。test + 数字の組み合わせ
      hostname: "{{ vcenter_hostname }}"  # vars.yaml から取り込む
      username: "{{ vcenter_username }}" # vars.yaml から取り込む
      password: "{{ vcenter_password }}" # vars.yaml から取り込む
      datacenter: <datacenter name>  # VMを展開するデータセンターオブジェクト名を記載
      folder:  <vm folder name> # VMを展開するフォルダ名を記載
      validate_certs: false
      state: poweredon             # 起動状態にする
      guest_id: centos7_64Guest  # 仮想マシンの作成時には必須であり、テンプレートからの作成時には不要
      esxi_hostname:  <esxi hostname>  # VMを展開するESXiホスト名。clusterを記載した場合は不要
      #cluster: <cluster name> # VMを展開するクラスタ名。esxi_hostnameを記載した場合は不要
      disk:
      - size_gb: 1 # VMに接続するvmdkサイズ。
        type: thin
        datastore: <datastore name> # vmdkを保存するデータストア名
      hardware: # vCPU、メモリ、scsiコントローラの設定
        memory_mb: 1024
        num_cpus: 1
        scsi: paravirtual
      networks:
      - name: <port group name> # vNICを接続するポートグループ名
        start_connected: true
    delegate_to: localhost

 

 

vCenterサーバの認証情報など、他のプレイブックと共有できる変数はインベントリファイルとして個別に作成しています。

※データセンター名などの変数をこちらに格納しても問題ありません。

# cat vars.yaml
all:
  vars:
    vcenter_hostname: <vcenter server ip>
    vcenter_username: administrator@vsphere.local
    vcenter_password: <passowrd>

 

 

インベントリファイルを指定してプレイブックを実行するコマンドは以下です

# ansible-playbook -i vars.yaml create_guestvm_loop.yml

 

 

 

実行結果

 実行すると以下のようにitem変数に格納される整数がインクリメントされながら繰り返し実行されている様子が確認できます。
※下記の例では生成した整数シーケンスの開始を
301 にしています。


 

まとめ

今回はAnsibleの繰り返し処理を利用して仮想マシンを大量展開する方法を紹介しました。

今回はVM名のみが異なる仮想マシンを大量展開しましたが、繰り返し処理で利用する変数は複数の組み合わせでループさせることもできますので、

ループのたびにリソースやOSIP設定の異なるVMを展開することも可能ですし、ループ変数に代入する値のセットを別のファイルに記述して他のプレイブックで再利用したり、メンテナンス性を高めることも可能です。

検証環境などで同じような環境VMセットを繰り返し展開したい場合などにも有効活用できるかと思います。

 以上、vExperts Advent Calendar 2024 の2日目の投稿でした。
明日のAdvent Calendarの投稿は 
mina_imさんです。よろしくお願いします。

コメント

このブログの人気の投稿

vSwitchにSTPが不要な理由

ESXi に DNS サーバを何個まで登録できるか

NTPと同期してくれないときのトラブルシューティング