2016年12月17日土曜日

ESXi6.0 の API を使って ESXi とか VM を操作してみる (Ruby 編)

概要

ESXi6.0 の API を使って ESXi の操作や VM の操作をしてみました
素の API はおそらく SOAP でそのまま使うのは辛いので Ruby のライブラリを使って Ruby から操作してみました
また、ESXi の API を操作するにあたって Managed Object Browser を有効にしておくと良いと思います

環境

  • VirtualBox 5.1.10
  • ESXi 6.0 update 2
  • Windows7 Enterprise バージョン 6.1
    • Intel Core i5-5300U CPU @ 2.30GHz
    • メモリ 10GB
    • ストレージ 120GB (SSD)
  • Ruby 2.2.4p230
  • rbvmomi 1.9.4

ライブラリのインストール

  • bundle init
  • vim Gemfile
gem "rbvmomi"
  • bundle install

サンプルコード

いくつかサンプルコードを紹介します
一番はじめに「接続」を必ず行ってから各種コードを実行してください

接続

require 'rbvmomi'

vim = RbVmomi::VIM.connect(
  host: '192.168.56.103',
  user: 'your-user',
  password: 'your-password',
  insecure: 'true'
)

という感じで接続してください
host, user, password は各自の環境に併せて変更してください
HTTPS で接続しに行くので、証明書など設定していない場合は「insecure」を指定するようにしてください

ESXi のバージョン情報の取得

puts vim.serviceInstance.RetrieveServiceContent.about.fullName

データストアの一覧の取得

hosts = vim.serviceInstance.RetrieveServiceContent.rootFolder.childEntity
hosts.each {|h|
  ds = h.datastore
  ds.each {|d|
    puts d.info.name
    puts d.info.url
  }
}

vSwitch の一覧の取得

hosts = vim.serviceInstance.RetrieveServiceContent.rootFolder.childEntity
hosts.each {|h|
  ns = h.network
  ns.each {|n|
    puts n.name
    puts n.vm.count
  }
}

VM の一覧の取得

hosts = vim.serviceInstance.RetrieveServiceContent.rootFolder.childEntity
hosts.each {|h|
  vmf = h.vmFolder
  puts vmf.childEntity.count
  vmf.childEntity.each {|vm|
    puts vm.name
  }
}

VM の起動

hosts = vim.serviceInstance.RetrieveServiceContent.rootFolder.childEntity
hosts.each {|h|
  vmf = h.vmFolder
  vmf.childEntity.each {|vm|
    if vm.guest.guestState != "running"
      puts vm.name
      vm.PowerOnVM_Task.wait_for_completion
    end
  }
}

VM のステータスを見て起動中以外であれば PowerOn しています
全台パワーオンします

最後に

Ruby を使って ESXi の操作をしてみました
一部の API を使って操作しただけなので他にもできることはたくさんあります
おそらく Web Client でできることはすべてできると思うので独自の UI やツールを作ることができると思います

認証も ID/PW のみなので、簡単に使えますが権限が強いユーザだと VM の起動や停止の他に削除等の Mofity/Delete 系の操作もできてしまうので、その辺の操作をする際には気をつけてください

SOAP の通信内容が見たい場合は、接続時に debug: 'true' を追加で指定すれば確認することができます

一点注意点として、今回使用したライブラリがあまりメンテナンスされていないようです
すべての API をコールしたわけではないのでわかりませんが、もしかすると ESXi6.0 だと対応されていない API があるかもしれません

参考サイト

0 件のコメント:

コメントを投稿