私的 homelab向け vSphere 7.0 アップグレード メモ
ESXi 6.7 -> ESXi 7.0 にアップグレードしたのでそのメモ
次 ESXi 7.x にアップグレードする際に自分が参照する用
あくまでhomelab向けの話なので、プロダクションに適用する際はこの記載を信用しないこと。
homelabの大まかな構成
vSphereの観点でhomelabの構成を軽く書いておく
アップグレードの流れ
vCenterをアップグレードしてから、ESXiをアップグレード
- アップグレードしたいバージョンを決める
- アップグレードパスが問題ないか軽く見とく
- USB Network Native Driver for 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をアップグレードする
- アップグレードした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の注意点
- 2020/04/27時点でissueを上げるべきなのは https://github.com/hashicorp/packer
- ただし、開発元のJetBrainsのほうにも100程度のissueが残されているので、わからないことがあったらそっちも覗くと良い
vsphere-iso builder の良い点
- vmware-isoでは必須だったGuestIPHackの有効化が不要になっている
- GuestIPHack はVMのビルドに使うESXiごとに設定する必要のある項目
- 共用の検証環境でこっそりGuestIPHackを有効にするなどは微妙だと思っていたので良い改善点
- vCenter配下のクラスタ指定でVMをビルドできるようになった
- VM起動後の操作にVNCを使わなくなった?
- サンプルが豊富
- https://github.com/jetbrains-infra/packer-builder-vsphere/tree/master/examples
- 大概のビルドの設定はここのサンプルにあるので悩んだら眺めると良い
ぱっと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のアップデート
- チャンネルの変更
sudo nix-channel --add https://nixos.org/channels/nixos-20.03 nixos
sudo nix-channel --update nixos
- システムパッケージのアップデート
sudo nixos-rebuild switch --upgrade
- ユーザーパッケージのアップデート
nix-env --upgrade
アップデート後の対処
KDE5を使っている環境でアプデ後にいくつかアプリが駄目になるのが頻発するのでメモ。
再インストール/アップデートはnoxコマンドを使えば良い。
VMRCをdockerコンテナに詰めてLinuxから使う
自分は普段、NixOS というOSがインストールされたLaptopを使っている。
で、VMwareの製品はたいていUbuntuやRHELをサポートしていて、当然NixOSはサポートに入っていない。
なので、NixOSからVMware製品がインストールされたUbuntuのコンテナを起動して使うことになる。 任意のディストリにVMware製品をインストールするのもできると思うが、多分Ubuntuコンテナに詰めるほうが楽だと思う。
VMRC をコンテナに詰める
VMRCは、vSphereで作成したVMのコンソールにアクセスできるアプリケーションで、 web版もあるけど、諸事情によりwebではない方を使えるようにしておきたい。
出来上がったのがこちら。以下のDockerfile とmyvmwareからダウンロードしてきたVMRCのインストーラーを使ってビルドしたら出来上がる。
$ 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のわかりづらいと思ったところをいくつか補足しておきます。
- 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を操作する世界を目指しましょう。
vcsimをdockerで動かすサンプル
govcやpyvmomiで色々と操作してみたいが、その前に挙動を確認したいなどがある気がする。
vSphereの動作検証環境を持っている方がどれだけいるか知らないので、
今回はvcsimを動かすための諸々を書いていく。
ただ、vcsimを動かすためにローカルの環境を汚したくは無いのでdockerとdocker-composeで動かす。
vcsim
vcsimとはvCenterとESXiを模すシミュレーター。
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の検証を。