概要
タイトルの通りです
ホストはフォルダやクラスタに属しているのでそれを考慮して再帰処理ですべてのホスト情報をフラットに取得します
環境
- Ruby 2.5.5p157
- rbvmomi 2.3.0
サンプルコード
require 'rbvmomi'
def search_hosts(host_folder)
ret = []
if host_folder.is_a? RbVmomi::VIM::Folder
host_folder.children.each { |target|
if host_folder.is_a? RbVmomi::VIM::HostSystem
# host
ret.append(target)
else
# folder or cluster
ret.concat(search_hosts(target))
end
}
else
# RbVmomi::VIM::ClusterComputeResource
ret.concat(host_folder.host)
end
ret
end
# main
vim = RbVmomi::VIM.connect(
host: '192.168.100.10',
user: 'administrator@vsphere.local',
password: 'xxxxxxxxxxx',
insecure: 'true'
)
dc_name = 'Datacenter'
dc = vim.serviceInstance.find_datacenter(dc_name) || fail('datacenter not found')
dc.hostFolder.children.each { |host_folder|
hosts = search_hosts(host_folder)
hosts.each { |host|
puts host.name
}
}
解説
メインの処理でデータセンターの取得とデータセンター配下にあるフォルダ or クラスタ情報を取得します
おそらくですがデータセンターの直下にホストを追加することはできないはずです
取得したフォルダ or クラスタを再帰的に検索してホストを取得します
フォルダの配下にはホスト or クラスタが配置することができるようです
またクラスタ配下にはホストしか配置できないようです
それらを考慮して search_hosts
の再帰処理を実装します
フォルダの場合のみ再度 search_hosts
を実行します
search_hosts
は最終的にホストの一覧の配列を返却します
とりあえずこれで動作しますが改良すれば RbVmomi::VIM::Datacenter クラスのインスタンスメソッドとしても定義できそうです
クラスオープンなどを使って追加しても良いかなと思います
最後に
rbvmomi でデータセンター配下にあるホストをすべて取得してみました
もしかすると直接取得できる API が生えているかもしれませんが見つからなかったのと探すのが面倒だったので自分で作成しました
0 件のコメント:
コメントを投稿