AnsibleのVMwareのモジュールはvSphere API(SOAP)を使って操作する作りになっています。
接続先はvCenter1台に対して複数のVMを操作する場合、普通にPlaybookを書くとシングル処理で動いてしまっていたので並列に動かすやり方例について記録しておきます。
1. VMwareモジュール
ここでは、例として vmware_guest_file_operation
モジュールを使います。
1-1. シングル処理について
ドキュメントに従ってPlaybookを作ってみます。
---
- name: VMware Module Test
hosts: localhost
gather_facts: no
tasks:
- name: copy file to guest os
vmware_guest_file_operation:
hostname: vCenterIP or FQDN
username: administrator@vsphere.local
password: secret
validate_certs: no
vm_id: "{{ item }}"
vm_username: root
vm_password: secret
copy:
src: ./testfile
dest: /root/upload/testfile
overwrite: False
with_items:
- devel
- devel2
このPlaybookでは devel
devel2
に対して testfile
をVMのゲストOSへコピーするものになっています。
実際に実行すると以下のようになります。
画面左上が devel
で 右上が devel2
です。
with_items
では一つのタスクが終わったら次のタスクというふうに順番に実行されることがわかります。
これだと、一つ一つ実行していくのでVM数に比例して時間がかかります。
1-2. 並列処理について
並列処理にする例です。
inventory
ファイルを使って並列化してみます。
以下はinventoryファイル例です。
[vms]
devel ansible_connection=local
devel2 ansible_connection=local
Playbookでは vm_id
にマジック変数の inventory_hostname
を指定します。
---
- name: VMware Module Test
hosts: vms
gather_facts: no
tasks:
- name: copy file to guest os
vmware_guest_file_operation:
hostname: vCenterIP or FQDN
username: administrator@vsphere.local
password: secret
validate_certs: no
vm_id: "{{ inventory_hostname }}"
vm_username: root
vm_password: secret
copy:
src: ./testfile
dest: /root/upload/testfile
overwrite: False
実際に実行すると並列にアップロードされていることがわかります。
2. 注意
vSphere API経由からファイルをゲストOSへコピーする時はVMware Toolsが動作していなければなりません。
また、一度vCenter/ESXiを経由してゲストOSへコピーするためオーバーヘッドが大きいのでサイズがでかいファイルや一度に大量コネクションを張ると負荷が懸念されます。
※でかいサイズのファイルのコピーは正直遅いです。