AnsibleでvSphere上に仮想マシンを大量展開する
この投稿は、vExperts Advent
Calendar 2024 の 2日目です。
本当はvSAN関連で別のネタを用意していたのですが、パブリックに公開するにしては内容的にちょっとアレな気がしたので、没ネタについては機会があればオフラインイベントでご紹介しようかなと思います。
紆余曲折ありましたが、今年は少し角度を変えてAnsibleネタにしました。
仮想マシンを大量展開
検証用途などで大量にVMを展開したいケースなどあると思います。
一般的にはPowerCLIで実施するケースが多いと思いますが、個人的にはPowerCLIは好きじゃないのでAnsibleでやってみます。
Ansibleでfor文ライクな繰り返し処理を記述する
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
Ansibleでfor文のような繰り返し処理を記述するにはloopやwith_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名のみが異なる仮想マシンを大量展開しましたが、繰り返し処理で利用する変数は複数の組み合わせでループさせることもできますので、
ループのたびにリソースやOSやIP設定の異なるVMを展開することも可能ですし、ループ変数に代入する値のセットを別のファイルに記述して他のプレイブックで再利用したり、メンテナンス性を高めることも可能です。
検証環境などで同じような環境VMセットを繰り返し展開したい場合などにも有効活用できるかと思います。
明日のAdvent Calendarの投稿は mina_imさんです。よろしくお願いします。
コメント
コメントを投稿