まとめ

  • vRealize Orchestrator のスクリプティングにおいて、ホストの詳細設定を設定する際に利用する API はHostSystem.configManager.advancedOption で辿れる OptionManager の updateOptions()
  • updateOptions() の配列引数の型 OptionValue のプロパティ value は型に制約があり、必要に応じて value, value_IntValue, value_FloatValue, value_LongValue を使い分けなければならない
  • これは JavaScript の数値に関する型が number しかないことと、WSDL における OptionValue.value の型が xsd:any であるが故の悲劇。vRealize Orchestrator のスクリプティング エンジンが、Java VM 上の JavaScript Engine である Rhino であっても避けられなかった…Orz
  • 詳細設定の各キーの型 OptionManager.supportedOption[] の optionType で全て確認できる。この確認には Managed Object Browser (mob) を使う
  • API ドキュメントには、この Value の型は大体 String と Integer とあるが、大体 String と Long が正しい

はじめに

昨年末より、Dedupe とも言える検証ラボに非常に便利だった メモリの Dedupe ともいえる Transparent Page Sharing (TPS) の機能がデフォルトでオフになってしまいました。

セキュリティの考慮事項および仮想マシン間透過的なページ共有の禁止 (2100628)
Security considerations and disallowing inter-Virtual Machine Transparent Page Sharing (2080735)

デフォルトがオフになった経緯は KB を見て頂くとして、やはりラボではメモリの高効率利用のために TPS を有効にしたいところです。TPS を有効にするための KB は以下になります。

2014 年 10 月 16 日 の ESXi 5.5 パッチおよび 2014 年 Q4 の ESXi 5.1 および 5.0 パッチにおける追加の透過的ページ共有の管理機能について (2092690)
Additional Transparent Page Sharing management capabilities in ESXi 5.5, 5.1, and 5.0 patches in Q4, 2014 (2091682)

ざっくりまとめると以下になります。

  • ホストに詳細設定を適用。詳細パラメータ Mem.ShareForceSalting にて行う。
  • TPS を有効化したい仮想マシンに同一 Salt を設定。詳細パラメータ sched.mem.pshare.salt にて行う。

ホスト台数が多いわけでもないのですが仮想マシンにも設定が必要なので、vRealize Orchestrator にて設定をある程度自動化しようと考えました。ところが、ド嵌まりしてしまったので備忘録として Blog に書き記します。

…ド嵌まり

タイプ HostSystem の host とタイプ Properties の properties を Input とした Scripting Task で以下のコードを実行し、ホストの詳細パラメータのアップデートを試みました。properties の中身は [{“Mem.ShareForceSalting”, 1}] になります。

    var optionMgr = host.configManager.advancedOption;
    
    var changedValues = new Array();
    
    for each (var key in properties.keys) {
        var value = properties.get(key);
        var option = new VcOptionValue();
        option.key = key;
        option.value = value;
        changedValues.push(option);
    
        System.debug("key: "+key+" value: "+value);
    }
    
    optionMgr.updateOptions(changedValues);

残念ながらこのワークフローは以下のエラーで失敗することになります。

[2015-03-30 20:07:19.365] [I] A specified parameter was not correct:  (Workflow:Set host advanced parameters / set options (item1)#14)

“A specified parameter was not correct” は SOAP Server 側 (つまりは vCenter Server) のエラーであり vpxd.log にも出力される内容です。これは、vSphere Web Services SDK に慣れてくるとよく見かけるエラーですが、非常に厄介なエラーでもあります。SDK の Reference には、Mandatory ではない (May not be present) とあるにも関わらず、他の引数との兼ね合いで引数が Mandatory となってしまうことはよくあることです。通常は vSphere Client と Onyx などを使い正解をひねり出すのですが、今回は API Document にヒントがあったので、これに頼ります。

Scripting Object - VcOptionValue

Deprecated.

The value of the option. The Any data object type enables you to define any value for the option. Typically, however, the value of an option is of type String or Integer.

ふむふむ、value は Deplicated になっているので value_{Float, Int, Long}Value を使えということか… Integer とあるので value_IntValue を使ってみます。値が String の場合に対処できていないが、ひとまずこれで挙動を確認します。

    var optionMgr = host.configManager.advancedOption;
    
    var changedValues = new Array();
    
    for each (var key in properties.keys) {
        var value = properties.get(key);
        var option = new VcOptionValue();
        option.key = key;
        option.value_IntValue = value;
        changedValues.push(option);
    
        System.debug("key: "+key+" value: "+value);
    }
    
    optionMgr.updateOptions(changedValues);

そしてワークフローを実行…

[2015-03-30 20:12:22.663] [I] A specified parameter was not correct:  (Workflow:Set host advanced parameters / set options (item1)#14)

ダメじゃんか…Orz

解決へ - MOB で詳細設定の定義を確認

ここで、以前 PowerCLI でホストの詳細パラメータ一覧を取得し、その中に{最小, 最大, デフォルト}値が含まれていたことを思い出します。最小最大があるくらいなのだから型の情報も持っているのでは?と探してみます。

ブラウザで以下の URL にアクセスし、[email protected] でログインします。

https://${vcenter_ip}/mob

これは Managed Object Browser (mob) といい、vCenter Server 内部のオブジェクトの状態を閲覧できるスクリプティング/API での開発に便利なツールです。このツールを使い、vCenter Server の中を紐解いていきます。次の順番にクリックしていきます (クラスタを構成していない環境です)。

凡例: プロパティ名 / 型 / 値
content / ServiceContent / content >
  rootFolder / Manageed Object Reference:Folder / group-? (Datacenters) >
    childEntity / ManagedObjectReference:ManagedEntity[] / datacenter-? ${データセンター名}
      hostFolder / ManagedObjectReference:Folder / group-?
        childEntity / ManagedObjectReference:ManagedEntity[] / domain-? ${ホスト名}
          host / ManagedObjectReference:HostSystem[] / host-? ${ホスト名}
            configManager / HostConfigManager / configManager
              advancedOption / ManagedObjectReference:OptionManager / EsxHostAdvSettings-?

ここまで辿ると、supportedOption に詳細設定の定義が OptionDef の配列として格納されているのを確認できます。数が多いので (more…) をクリックして、全ての詳細設定の定義を表示させます。そして目的の Mem.ShareForceSalting を検索で探し、クリックします。そして optionType をクリックします。

Orz 0,1,2 しか値を取らないのに long とは…

解決

ということでスクリプトは OptionValue.value_IntValue ではなく OptionValue.value_LongValue としなければならなかったのです。

    var optionMgr = host.configManager.advancedOption;
    
    var changedValues = new Array();
    
    for each (var key in properties.keys) {
        var value = properties.get(key);
        var option = new VcOptionValue();
        option.key = key;
        option.value_LongValue = value;
        changedValues.push(option);
    
        System.debug("key: "+key+" value: "+value);
    }
    
    optionMgr.updateOptions(changedValues);

vpxd.log でもうちょい親切なログがでてもよいのではないかと思うところ。

その他

OptionValue の deplicated なプロパティと Mem.ShareForceSalting のデフォルト値

KB は vSphere 5.5 時代に公開されているので、vSphere 6.0 とはデフォルト値が異なっています。API Reference も string や bool の値をどうするのか不明なので、修正のリクエストをかけてみるかな…。

ドキュメントの不備を見つけた場合は、[email protected] に英語で改善要求を送ると対応されるかも知れません。

検索は上手に…

vRealize Orchestrator は、その製品の歴史的経緯もあり Community が非常に充実しています。VMware 社内でも Orchestrator の Jedi Master と畏怖されている 3 人のエンジニアが活発にリプライし、VMware Professional Service Organization (PSO) 謹製のワークフローパッケージが惜しげもなく置いてあり、マニュアルを補ってあまりある情報量となっています。ただし英語ですが…。

Host Advanced Parameters consistently set and defined through vCO

今回のこの問題も 2 年前に PSO が対応していた模様でゲンナリ

改善

いきなり value_LongValue で値を代入するのはイケテなさ過ぎなので、OptionType で型判定して値を代入するように、今後改善してみます。

チート

vRealize Orcehstrator でホストの詳細設定を行う場合には、詳細パラメーターのキーを元に、mob からそのキーの型を確認し、適切な value_*Value を使い値をプロパティにセットする