GUIを触らずにvSphereを操作するためのgovc入門とtips
この記事はFJCT アドベントカレンダー 2019の初日のために書いた記事が長くなったために分割した記事です。
GUIの操作はお手軽で良いのですが、色々と不便な側面もあるので、CLIで操作できると良いですよね。
vSphereの操作をCLIでバシバシやっていくための入門とtips紹介記事となります。
vSphereの検証環境がある前提で話をしているので、検証環境が無い場合はvcsimをdockerで動かすサンプルを書いたの、そちらを参考にvcsimの動作環境を手に入れてください。 またこれを読んだ後に、 GUIを触らずにvSphereを操作するためのgovc レシピ を読んでいただけるとありがたいです。
TL;DL
- govc はVMwareの作成したvSphereのAPIクライアント
- govc でのデータ調査は出力をjsonにする。jqで絞る。
- govc はつまりどころがたまにあるので、暇なときにたくさん叩いておく
- govc をたくさん叩いたhistoryはfzfやpecoなどで引き出せるようにしておく
govc
おそらくこの記事を覗きにくる方は、vSphereを操作したことのある方だと思いますが、govcを利用していますか?
利用したことの無い方に向けてgovcとは?を説明しておくと、
VMwareのgovmomiのリポジトリで開発されている
vSphereのAPIクライアントツールで様々な操作が手元のターミナルから操作できるようになります。
govcを使い始めるのに必要な知識はだいたいgovcのREADME を読むとわかります。
チュートリアル的な何か
まず環境の紹介。自分の手元の環境はLinuxでfishを使っている環境となります。
# uname -a Linux shouhei.nixos 4.19.84 #1-NixOS SMP Tue Nov 12 18:21:46 UTC 2019 x86_64 GNU/Linux # echo $SHELL /run/current-system/sw/bin/fish # fish --version fish, version 3.0.2
READMEのインストール手順に沿ってバイナリを落としてきます。
wget https://github.com/vmware/govmomi/releases/download/v0.21.0/govc_linux_amd64.gz gzip -d govc_linux_amd64.gz chmod +x govc_linux_amd64 mv govc_linux_amd64 govc
では試しに、homelab上にある gitlab
とついたオブジェクトを探します。
その前に、予め自分のshellで GOVC_URL, GOVC_USERNAME, GOVC_PASSWORD, (SSL証明書の問題を無視するなら GOVC_INSECUREをtrue) をセットして置きます。
fish なら set -x GOVC_URL 'https://${ip}'
とか bash なら GOVV_URL='https://${ip}'
とかです。
以下のコマンドで正しくセットできているか確かめることができます。
# govc env GOVC_USERNAME=administrator@vsphere.local GOVC_PASSWORD=******** GOVC_URL=vcsa.example.com GOVC_INSECURE=true
では実際にVMを探してみます。
# govc find . -name '*gitlab*'
/mycloud/vm/myprivate/dev/gitlab-dev/ubuntu-gitlab-dev
うまく引けてますね。出力はVMのインベントリパスです。
ではインベントリパスからVMの情報を引きます。
govc find . -name 'ubuntu-gitlab-dev' | xargs govc vm.info Name: ubuntu-gitlab-dev Path: /mycloud/vm/myprivate/dev/gitlab-dev/ubuntu-gitlab-dev UUID: 422d2545-2f5d-f32b-cdbb-02739fcd9544 Guest name: Ubuntu Linux (64-bit) Memory: 16384MB CPU: 2 vCPU(s) Power state: poweredOff Boot time: <nil> IP address: Host: esxi1.mycloud.local
こちらもいい感じに引けていますね。
govc のわかりづらいところ補足
READMEを読むとわかります。だと今回の記事の意味がなくなってしまうので、
govcのわかりづらいと思ったところをいくつか補足しておきます。
- moid では引きづらいのでインベントリパスを探す
- govc の考えているmoidはmobで使う
/mob?moid=${moid}
とは異なる
moid で引くときはオブジェクト構造が異なることを意識する
moidで情報を引く際は govc object.collect
が利用できますが、これでmoidに関連する情報を引くと、
mobで引ける情報とは異なるデータ構造でデータが帰ってきます。
もしmobの情報構造を意識してデータを引きたい場合は、たとえば govc vm.info
などの目的となるオブジェクトに対応したコマンドを利用したほうが便利かと思います。
govc の考えているmoidはmobで使う/mob?moid=${moid}
とは異なる
govcが考えるmoidが使えるところのexampleには書かれているのですが、明記はされていなくて個人的に少し混乱しました。
vCenterのURLで /mob?moid=${moid}
を叩くとvSphere的なオブジェクトを眺める画面にアクセスできますが、
mobの画面で利用できるmoidは たとえば vm-49
などとシンプルな表記です。
govcの考えているmoidは上記のmoidと異なり、たとえば仮想マシンなら VirtualMachine:vm-49
となります。
探しているオブジェクトの ${Type}:${moid}
の ${Type}
側を調べる方法は以下の2点があります。
- vSphere Web Client (HTML5) のURLを見る
- findサブコマンドのヘルプを使う方法
- 正直こっちのほうが早いのでこっちで良いと思います。
# govc find --help Usage: govc find [OPTIONS] [ROOT] [KEY VAL]... Find managed objects. ROOT can be an inventory path or ManagedObjectReference. ROOT defaults to '.', an alias for the root folder or DC if set. Optional KEY VAL pairs can be used to filter results against object instance properties. Use the govc 'object.collect' command to view possible object property keys. The '-type' flag value can be a managed entity type or one of the following aliases: a VirtualApp c ClusterComputeResource d Datacenter f Folder g DistributedVirtualPortgroup h HostSystem m VirtualMachine n Network o OpaqueNetwork p ResourcePool r ComputeResource s Datastore w DistributedVirtualSwitch
govcをサクサク使うための準備
govcサクサクを使っていくための準備を3点ほど挙げておきます
- govcからの最終出力はjsonにして、
jq
で絞り込む - govcの操作履歴を貯めて、素早く引き出せるようにしておく
govcからの最終出力はjsonにして、jq
で絞り込む
govcのデフォルトの出力は結構これだけ?と思うことが多々あります。 チュートリアル的に記載したvm.infoを再掲すると以下しか出ていません。
govc find . -name 'ubuntu-gitlab-dev' | xargs govc vm.info Name: ubuntu-gitlab-dev Path: /mycloud/vm/myprivate/dev/gitlab-dev/ubuntu-gitlab-dev UUID: 422d2545-2f5d-f32b-cdbb-02739fcd9544 Guest name: Ubuntu Linux (64-bit) Memory: 16384MB CPU: 2 vCPU(s) Power state: poweredOff Boot time: <nil> IP address: Host: esxi1.mycloud.local
他の情報は... ? というところですが、 -json
オプションをつけると...
{ "VirtualMachines": [ { "Self": { "Type": "VirtualMachine", "Value": "vm-49" }, "Value": null, "AvailableField": null, "Parent": { "Type": "Folder", "Value": "group-v63" }, "CustomValue": null, "OverallStatus": "green", "ConfigStatus": "green", "ConfigIssue": null, "EffectiveRole": [ -1 ], "Permission": null, "Name": "ubuntu-gitlab-dev", "DisabledMethod": [ "MakePrimaryVM_Task", "TerminateFaultTolerantVM_Task", "ResetVM_Task", "UnmountToolsInstaller", "MountToolsInstaller", "MountToolsInstallerImage", "RebootGuest", "StandbyGuest", "ShutdownGuest", "PowerOffVM_Task", "ExtractOvfEnvironment", "SuspendVM_Task", "AcquireMksTicket", "AnswerVM", "UpgradeTools_Task", "UpgradeToolsFromImage_Task", "ApplyEvcModeVM_Task", "StartRecording_Task", "StopRecording_Task", "StartReplaying_Task", "StopReplaying_Task", "TurnOffFaultToleranceForVM_Task", "MakePrimaryVM_Task", "TerminateFaultTolerantVM_Task", "DisableSecondaryVM_Task", "EnableSecondaryVM_Task", "StopRecording_Task", "StopReplaying_Task", "MarkAsVirtualMachine" ],
という感じでmob相当の情報が取れるようになります。
なので、 govc で最終的に得たい情報は -json
オプションをつけて出力し、 jq コマンドでお目当ての情報を絞り込むのが良いと思います。
govcの操作履歴を貯めて引き出せるようにしておく
govc は非常に便利なのですが、たまに実現したいことを実現するには悩んでしまうことがあります。
なので、暇があるときにgovcをたくさん叩き、shellのヒストリにgovcの便利操作を貯めおくと良いと思っています。
また、ヒストリに貯めるだけだと辛いので、ヒストリをいい感じに絞り込むために peco や fzf を利用しているshellと合わせて設定しておくと良いと思います。
自分はプライベート用のpcは fish + oh-my-fish + peco, 会社の環境ではzsh + oh-my-zsh + peco でhistoryを引き出せるようにしてます。
ここらへんのカスタマイズ方法は一般的な話なので、他の記事に詳細は任せます。
govcに入門し、ヒストリを貯めて引き出せるようにし、GUIを触らずにvSphereを操作する世界を目指しましょう。