2020年3月11日水曜日

rbvmomi で指定のデータセンター配下にあるホストの一覧をフラットに取得する方法

概要

タイトルの通りです
ホストはフォルダやクラスタに属しているのでそれを考慮して再帰処理ですべてのホスト情報をフラットに取得します

環境

  • 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 件のコメント:

コメントを投稿