/var/log/study

つまり雑記

私的 homelab向け vSphere 7.0 アップグレード メモ

ESXi 6.7 -> ESXi 7.0 にアップグレードしたのでそのメモ

次 ESXi 7.x にアップグレードする際に自分が参照する用

あくまでhomelab向けの話なので、プロダクションに適用する際はこの記載を信用しないこと。

homelabの大まかな構成

vSphereの観点でhomelabの構成を軽く書いておく

  • vCenter
  • データストア
    • NFS 1台
    • vSAN
  • ESXi
    • 6.7
    • 3台
  • 物理ホスト構成
    • ベース
      • NUC6i3SYH
    • NIC
      • 組み込みのnicが1つ
      • USB NICが2つ
    • ディスク

アップグレードの流れ

vCenterをアップグレードしてから、ESXiをアップグレード

vCenter アップグレード

vCをアップグレードすること自体はだいたい1~2時間程度で終わる (インストーラーが動く環境を手に入れるのに時間がかかった)

  • ESXi/vCenterのisoを手に入れておく
  • vCenterのインストーラーが動く環境を用意する
  • vCenter をアップグレードする
    • 6.7 -> 7.0 は以下の問題を踏んだ程度だった。
    • 要件的にはTinyでも良いのだが、検証の快適さを求めてsmallにしている

ESXi アップグレード

USBのboot driveを作成して利用する方法。こっちも方法を確立さえしてしまえば1台1h程度で作業が完了した。

モダンなやり方としては、LifeCycle Managerを利用する方法もあるが、 ハードウェアコンパチビリティの無いhomelabという都合でLifeCycle Managerが正しく動作しなかった。 (アップグレードできたかのように見えるが、ESXiをrebootすると以前のバージョンに戻ってしまう問題に当たった)

  • 以下を見て、ESXi7.0 のbootable usb を作る
  • (7.0へアップグレードするとき)
    • 以下を読んで /bootbank の領域についての変更を把握しておく
    • kwmtlog.blogspot.com
  • ESXiをアップグレードする
    • メンテナンスモードに入れる
      • docs.vmware.com
      • アクセシビリティの確保を選ぶと良さそう
      • (vSANの何かに困っていてこのページに当たってしまった人向けに書いておきますが、困っていたらVMwareに聞いたほうが確実です。)
    • 実際のアップグレード
      • boot driveにしたUSBを刺して、reboot
      • 自分の利用しているNUCだとF10を2回押すと, boot driveが選択できるようになる
      • ESXiのインストーラーを指定して起動する
    • host clientにアクセスし、sshを有効化しておく
    • USB NIC用のvibをインストールする
      • USB NICをscpなりで、esxiに持っていく
      • esxcli でオフラインバンドルとして、usb nic用vibをインストールする
  • アップグレードしたESXiを接続し、残りのホストをアップグレードする
    • vSANクラスタを壊さないように、時間的余裕を持って取り組むこと

アップグレードが完了したら

  • vDSのアップグレードを実施しておくと良い
    • NSX-T 検証などをする際に重要なポイントになるはず。

最後に

あくまでhomelab向けの話なので、プロダクションに適用する際はこの記載を信用しないこと。

packerのvsphere-iso builder

VMwareのvSphere環境で, isoから仮想マシンのイメージを作成するための自動化ツールとして、Packerが挙げられます。

そのPackerでも内部的にはbuilderという形でいくつかの選択肢があり、VMware製品環境ではvmware-isoというのをよく使っていたのですが、vsphere-isoというのがあることに最近気づきました。

詳細はここ

ちなみに開発元はJetBrainsらしいです。JetBrains最高だな...

vsphere-iso buildrの注意点

vsphere-iso builder の良い点

  • vmware-isoでは必須だったGuestIPHackの有効化が不要になっている
    • GuestIPHack はVMのビルドに使うESXiごとに設定する必要のある項目
    • 共用の検証環境でこっそりGuestIPHackを有効にするなどは微妙だと思っていたので良い改善点
  • vCenter配下のクラスタ指定でVMをビルドできるようになった
    • ホストに特定の設定が入っているか?を気にする必要がなくなった恩恵だと思います。
    • (手元で検証している限り、クラスタ内に存在するホストを指定しないと動かないのですが、クラスタを指定するとホストの指定を無視するような振る舞いをしてます。 )
  • VM起動後の操作にVNCを使わなくなった?
    • vmware-isoのときは、コンソールへの操作にvncを使っていた記憶があります
    • vsphere-isoにはvncの設定がなくなったのでweb API経由での操作に切り替わったかもしれないです。
  • サンプルが豊富

ぱっとVMをビルドしてみた限りでは、vsphere-iso builderはvmware-iso builderの不便な点を解消したものになっているので、新規でvSphere環境でisoからVMの作成を自動化したい場合は、vsphere-iso builderを使うと良いと思います。

私的Nixosアップデートメモ 20.03

nixos を 19.09 -> 20.03 にアップデートしたのでメモ書き

20.03 のコードネームは Markhor で、面白い角を持った動物だった。

リリースノートはこれ

NixOSのアップデート

  1. チャンネルの変更
    • sudo nix-channel --add https://nixos.org/channels/nixos-20.03 nixos
    • sudo nix-channel --update nixos
  2. システムパッケージのアップデート
    • sudo nixos-rebuild switch --upgrade
  3. ユーザーパッケージのアップデート
    • nix-env --upgrade

アップデート後の対処

KDE5を使っている環境でアプデ後にいくつかアプリが駄目になるのが頻発するのでメモ。

再インストール/アップデートはnoxコマンドを使えば良い。

  • なにはともあれやること
    • glibcを再インストール/アップデートする
  • FirefoxなどでIMEの切り替えがおかしい
    • fcitxとfcitx-mozcを再インストール/アップデートする
  • Terminator でIMEの切り替えがうまく行かない
    • terminator を再インストール/アップデートする
  • Albertの背景透過がうまく行かない/起動しなくなる
    • albertを再インストール/アップデートする
    • ハードウェアの設定 -> ディスプレイとモニタ -> Compositor -> コンポジターの起動を有効にするにチェックを入れる

VMRCをdockerコンテナに詰めてLinuxから使う

自分は普段、NixOS というOSがインストールされたLaptopを使っている。

で、VMwareの製品はたいていUbuntuRHELをサポートしていて、当然NixOSはサポートに入っていない。

なので、NixOSからVMware製品がインストールされたUbuntuのコンテナを起動して使うことになる。 任意のディストリにVMware製品をインストールするのもできると思うが、多分Ubuntuコンテナに詰めるほうが楽だと思う。

VMRC をコンテナに詰める

VMRCは、vSphereで作成したVMのコンソールにアクセスできるアプリケーションで、 web版もあるけど、諸事情によりwebではない方を使えるようにしておきたい。

出来上がったのがこちら。以下のDockerfile とmyvmwareからダウンロードしてきたVMRCのインストーラーを使ってビルドしたら出来上がる。

gist.github.com

$ ls -1
Dockerfile
VMware-Remote-Console-11.1.0-15913118.x86_64.bundle*
$ docker build . -t vmrc:latest

使いかた

docker上で起動したfirefoxをホスト側で操作する - takapiのブログ

上記の方のコマンドを参考に、以下のような感じでrunするとOK

# 実行前にxhostを忘れない。
docker run -it --privileged=true --net=host --rm -e 'DISPLAY=:0' -v /tmp/.X11-unix/:/tmp/.X11-unix/ vmrc:latest 'vmrc://${host}/?moid=${moid}'

これで最低限、vmrcが動くようになるはず。

GUIを触らずにvSphereを操作するためのgovcレシピ

この記事はFJCT アドベントカレンダー 2019の初日の記事です。

明日は @zombeanさんの FJCTで知ったもの、身についたものいろいろ書こうと思います となります。

さて。本日はニフクラの運用メンバーらしくvSphere周りとして、GUIを触らずにvSphereを操作するためのgovcレシピをいくつか書き残します。 本記事のターゲットはgovcを触ったことがある程度の人です。触れない人はこの記事の前半として、GUIを触らずにvSphereを操作するためのgovc入門とtips を書いたので読んでほしいです。

2019年に利用したgovcコマンドの備忘録的な側面が強いので、網羅性はありませんし、普段govcを使っている人にとって目新しいことは無いですが書いていきます。

以下は別解答が多数あると思われます。 (もとイケてる方法があるじゃん!と思った場合 一緒にIaaSを作りましょう!!!)

複数の操作対象があるパターン

ケースにもよると思いますが以下のようなことをすることが多いです。

govc find ${cond} | xargs govc ${operation}

VMの電源on, off

VMの電源on, off自体は govc vm.power でできるのだけど。 使いそうなオプションとしていくつかあり、 -offでパワーオフ, -onでパワーオン、-s でシャットダウン、-wait で電源の上げ下げのタスク完了を待つなどのオプションがついている。 -M オプションは複数のVMを一度に電源on できるオプション

以下は電源を上げるケース

govc find . -type m -name "${VM-NAME}" | xargs govc vm.power -on -M=true

以下はシャットダウンのケース

govc find . -type m -name "${VM-NAME}" | xargs govc vm.power -s -wait=false

VMのデバイス情報を引く

VMのデバイスの情報はgovc vm.info でも引けるが、 device.info を利用するほうが良い。

govc device.info -json -vm `govc find -type m  -name="${VM-NAME}"` | jq .

以下は vm.info のときのjson。DeviceのTypeがなくてどれがどのデバイスか?を機械的に判別するのが難しい。

        "Hardware": {
          "NumCPU": 1,
          "NumCoresPerSocket": 1,
          "MemoryMB": 32,
          "VirtualICH7MPresent": null,
          "VirtualSMCPresent": null,
          "Device": [
            {
              "Key": 200,
              "DeviceInfo": {
                "Label": "IDE 0",
                "Summary": "IDE 0"
              },
              "Backing": null,
              "Connectable": null,
              "SlotInfo": null,
              "ControllerKey": 0,
              "UnitNumber": null,
              "BusNumber": 0,
              "Device": null
            },

以下は device.info を引いたときのjson。DeviceのTypeがあるので機械的判別がしやすい。

{
  "Devices": [
    {
      "Name": "ide-200",
      "Type": "VirtualIDEController",
      "Key": 200,
      "DeviceInfo": {
        "Label": "IDE 0",
        "Summary": "IDE 0"
      },
      "Backing": null,
      "Connectable": null,
      "SlotInfo": null,
      "ControllerKey": 0,
      "UnitNumber": null,
      "BusNumber": 0,
      "Device": null
    },

あるホスト上の電源オン状態のVMのインベントリパス

ホスト名を調べておいた上で以下のコマンドを叩くと、あるホストの上にいるpowerdOnVMのインベントリパスがとれます。

govc find -i . -type h -name ${HOST-NAME} | xargs -Ih govc find . -type m -runtime.powerState poweredOn -runtime.host h

あるホスト上の電源オン状態のVMの情報収集

上のヤツに更にvm.infoをつなげるパターンです。更に vm.info -json を使ってjqで絞り込むパターンがあると思います。

govc find -i . -type h -name ${HOST-NAME} | xargs -Ih govc find . -type m -runtime.powerState poweredOn -runtime.host h | xargs govc vm.info

クラスタにあるESXiのリストを取得する

あるクラスタに所属するESXiを調べる方法はいくつかあるのですが、これが一番簡単な気がします。 これも host.info につなげる方法があるかな?と思います。

govc find . -type c -name ${ClusterName} | xargs govc ls -t HostSystem

データストアの残容量順に並べる

どのデータストアが一番残っているか?はたまに気にしたい事項だと思っていて、以下のような方法で引けます。

govc datastore.info -json | jq '.Datastores[].Info| [(.FreeSpace|tostring),.Name]  | join(" ")' -r | sort -n

あるデータストアを消費している順にVMを調べる

これの方法が見つけられていないのが残念

あるvCenter配下のデータストアのタイプ一覧

あまり無いと思うが、datastore.infoつながりで、こんな感じでvC配下のデータストアのタイプが調べられます。

govc datastore.info -json | jq '.Datastores[] | [.Info.Name, .Summary.Type] | @csv' -r

あるESXiのオプションを調べる方法

たまにESXi側の設定を一括で調べたいことがあり、以下のコマンドを gocv find . -i -type h と組み合わせて使うことがある。

govc host.option.ls --host=${InventoryPath} ${OptionName}

あるESXiのサービスを調べる方法

オプションと同じ要領で、サービスも調べられそう.

govc host.service.ls --host=${InventoryPath} ${OptionName}

あるESXiのvibのリストを調べる

govc host.info では見れなさそうなのでesxcliで直接叩きに行く

govc host.esxcli softoware vib list

アドベントカレンダーに向けて書けたのはここまでなのでまたgovcをパチパチと叩いたら追記します。

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のわかりづらいと思ったところをいくつか補足しておきます。

  1. moid では引きづらいのでインベントリパスを探す
  2. 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点があります。

  1. vSphere Web Client (HTML5) のURLを見る
    • mobをよく使う人なら、mobで使うmobはflashのweb clientで対象のオブジェクトを開くとURLにmoidが書いてあることを知っていると思います。
    • govc で使えるmoidはHTML5版のClientで対象の種類のオブジェクトを開くと書いてあります。
      • 例えば ホストを開くと /ui/#?objectId=urn:vmomi:HostSystem:host-321:${uuid}
  2. 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点ほど挙げておきます

  1. govcからの最終出力はjsonにして、jq で絞り込む
  2. 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の便利操作を貯めおくと良いと思っています。

また、ヒストリに貯めるだけだと辛いので、ヒストリをいい感じに絞り込むために pecofzf を利用しているshellと合わせて設定しておくと良いと思います。

自分はプライベート用のpcは fish + oh-my-fish + peco, 会社の環境ではzsh + oh-my-zsh + peco でhistoryを引き出せるようにしてます。
ここらへんのカスタマイズ方法は一般的な話なので、他の記事に詳細は任せます。


govcに入門し、ヒストリを貯めて引き出せるようにし、GUIを触らずにvSphereを操作する世界を目指しましょう。

vcsimをdockerで動かすサンプル

govcやpyvmomiで色々と操作してみたいが、その前に挙動を確認したいなどがある気がする。
vSphereの動作検証環境を持っている方がどれだけいるか知らないので、 今回はvcsimを動かすための諸々を書いていく。

ただ、vcsimを動かすためにローカルの環境を汚したくは無いのでdockerとdocker-composeで動かす。

vcsim

vcsimとはvCenterとESXiを模すシミュレーター。

github.com

dockerを使ったvcsimの動かし方

vcsimのInstallationにgolangが動く環境での動かし方が書いてあるが、前述の通り手元の環境にgolangをインストールしたくないのでdockerとdocker-composeで動かす。

動かし方としてはこんな感じ。

以下はローカルホストの443でvcsimが動き始めます。

git clone https://github.com/shouhei/example-vcsim-docker
cd example-vcsim-docker
docker-compose build && docker-compose up -d

このあと以下のようなコマンドと出力が得られていれば動作成功

# govc find . -type h
/DC0/host/DC0_H0/DC0_H0
/DC0/host/DC0_C0/DC0_C0_H0
/DC0/host/DC0_C0/DC0_C0_H1
/DC0/host/DC0_C0/DC0_C0_H2

動作停止は

docker-compose down

あとは必要に応じでdocker-composeを書き換えて欲しい。

ちょっとした工夫

https://github.com/shouhei/example-vcsim-docker/blob/master/vcsim/Dockerfile が全てだが、vcsimが1バイナリで動くようになっている。

vcsimのイメージはdockerhubに転がっているが、適当なosのうえで動くようになっていたはず。


良きvSphere APIの検証を。