/var/log/study

つまり雑記

備忘録: Ubuntu cloud-image の初期化設定のための変数@vSphere

誤認しているかもしれないが、ubuntuのcloud-image特有 (さらにvSphere固有) の話はドキュメントなさそうで、
vSphere環境のcloud-imageにデフォルトパスワードを設定する方法も以下のstack overflowを見つけなかったら、うまく設定できないでいるところだったので備忘録として残しておく。

askubuntu.com

以下はstack overflowに書いてあることを勝手に補足しつつの適当な訳

ubuntt 22.04 (もしかしたらそれ以前も含むかもしれない) では cloud-image をovaインポートした際に、isoから初期設定のための変数を読み取ることになっていて、 ovaインポートのウィザードで入れる変数を読み取ってくれない。 なので、もし、ovaインポートのウィザードで設定した項目を利用してubuntuが初期設定されて欲しければ、stack overflowの解答にあるように、VMの設定画面から構成->vAppオプション->編集->OVFの詳細->OVF環境の転送のチェックボックスでISOイメージからVMware Toolsに変更してあげる必要がある。

(この文章は元のstack overflowのライセンスに従います。CC BY-SA 4.0 です。)

nixosにddccontrolをインストールする備忘録

https://github.com/ddccontrol/ddccontrol#usage のusage を見たら良いのだが、インストールしただけではダメで、以下の3点を行う必要がありそう。

  1. kernel moduleを起動時に読み込むようにする
  2. ddccontroleのサービスを起動するようにする
  3. root以外のユーザーはi2cグループに所属するようにする

上記はいずれもnixosの流儀に沿って行う必要があり、/etc/nixos/configuration.nix 辺りに書けば良い。

以下はテキトウな設定の抜粋

{
  boot.kernelModules = [
   ...
    "i2c-dev"
  ];
  ...
  services.ddccontrol.enable=true;
  users.extraUsers.hoge = {
    extraGroups = [... "i2c"];
 ...

pipr,vcsim,govc,jqを組み合わせてクエリ構築を簡単にする

先日、piprというツールが紹介されていて、vSphere運用のワークフローを便利にする方法を思いついたので紹介

gihyo.jp

概要

vcsim + pipr + govc + jq を使うとインタラクティブにvCenter から情報を引き出す試行錯誤環境ができる。

pipr_vcsim_govc_jq

--no-isolation

piprはbubblewrapというツールを使って環境を保護するので、ファイルを書いたり消したりができないようになっているが、govcを使う際にsessionをファイルに書こうとするので、--noisolationオプションが必要。
ただ、自分が知らないだけで、何か--no-isolationオプションを使わない方法があるかもしれない。

govcに -persist-session=true Persist session to disk [GOVC_PERSIST_SESSION] があるのでそれを有効にすると pipr の --no-isolation は不要になる。上のgifもソレに合わせて作り直している

背景/改善ポイント

vSphereをそこそこの規模で運用していると、運用している全vCenter/ESXiからサッと情報を得て引き出して現状を確認したい、ということが多々ある。
大抵のケースではgovcとjqを組み合わせたら欲しい情報は引き出せて、普段は以下のようにしている。

  1. テスト用のvCから情報を引き出すgovcのコマンドを作る
  2. コマンドが作れたら、以降無駄にvCenterのAPIを叩かないように一旦jsonに書き出しておく
  3. 書き出したjsonを使って必要な情報に絞り込むjqのクエリを考える
  4. 1と3のコマンドを繋ぎ合わせてうまく動作するか確認する
  5. 組み立てたコマンドを複数vCenterに流す仕組みを作って実行する

ただ、vCenterから取得できる情報のjsonは人間が把握するには情報量が多く、jqのクエリを作り切るのにそこそこ試行錯誤が必要で、ステップ3をやっているうちにステップ1のコマンドがよくわからなくなり... みたいなことがよくあった。
そこでvcsimを用いてAPIを何度コールしても問題無い状況を作り、piprのインタラクティブな環境でjqのクエリを試行錯誤できるようにすると, 元々のステップ1,2,3,4を1つにまとめることができるのではないか?というのが今回の紹介でした。

proxy越しにpyvmomiを利用する

レアケースだとは思いますが、pyvmomiを利用する際のclientとサーバーの間にproxyがいる場合意外と接続が面倒だったので備忘録

参考は以下

github.com

要点は以下

github.com

pyvmomi-community-samples などで使われている、pyvmomiのSmartConnect や、SmartConnectNoSLL を利用せず、 SmartStubAdapterにproxyの設定を渡し, そのAdapterをVimSessionOrientedStubに渡し、VimSessionOrientedStubをServiceIntence生成に使うという方法になっている。

pyvmomiでmoidをベースにオブジェクトを参照するメモ

vSphereのAPI経由でオブジェクトの情報を参照したいとき、かつ、moidはわかっているので
改めてAPI経由で検索する必要がない時のショートカット方法のメモです。

from pyVim.connect import SmartConnect
from pyVmomi import vim

if __name__ == "__main__":
    si = SmartConnect(
        host="ip or fqdn",
        user="username",
        pwd="password",
        port="443",
        disableSslCertValidation=True
    )
    vm = vim.VirtualMachine("moid", si._stub)
    print(vm.name)

年末なのでAPIを利用してNSX-Tをお掃除しよう

この記事は2021年の vExperts Advent Calendar の23日目の記事です。

前日は MT9276さんの VMware HOLで、Apache Log4j のワークアラウンド手順確認(PythonスクリプトをHOLへ持ち込み) でした。 スクリプトを持ち込めるのは自分も初めて知りました! HOLでWAを試せるとなると、複数回試すことができて、実際のWA適用の際に安心できるな、と思いました。

ものすごいいまさらですが、2021年からvExpertになりました、@yaaamaaaguuu です。
ブログやTwitterではあまり言及しませんが、普段はNSXの運用や検証, NSXを利用するソフトウェアの開発などに取り組んでいます。
せっかくなのでNSX-Tに関する記事でvExpertアドベントカレンダーの1記事を担当させていただきます。よろしくお願いいたします。

年末も近いので、大掃除をしないといけない気持ちになってきますね?

この記事では、NSX-TのAPIを利用して、検証等などで作ってしまった不要なリソースを消していく方法を紹介し、年末の大掃除でUIをひたすらポチポチし続ける苦行を回避する方法を共有しようと思います。

目次

注意書き

NSX-T上のオブジェクトを削除するAPIを取り扱います。削除APIをコールすると当然対象のリソースは削除されますので、対象を誤らないように気を付けてください。誤ったAPIコールで、誤ったオブジェクトを削除してしまっても私は責任をとれません。

また本記事は NSX-T 3.1系とLinux上で動作するコマンド (zsh, curl, jq 等)を利用した記事となります。

さらにVMC上のNSX-Tについての差異は扱いません。

NSX-TのAPIについて

2021/12/22 時点での最新のNSX-Tのバージョンは3.2.0となり、APIドキュメントは こちら となります。(基本的にはAPIドキュメントに記載されている内容の抜粋となります。)

何はともあれ、NSX-TのAPIをコールできないことには話が始まりません。とりあえずAPIをコールするにしても、認証情報を付与する必要がありますが、NSX-T上のユーザー名/パスワードをBasic認証の情報として付与してあげるとよいだけです。以下のようなコマンドになると思います。

# 試しにNSXのClusterの情報を参照してみる
curl -k -u "${username}:${password}" https://${NSXMANAGER}/api/v1/cluster/status

JSON形式でNSXのClusterの情報が出力されたら成功です。以降のAPIコールが上手くいかない場合は、利用してるユーザーの権限を確認してみるとよいと思います。(clusterのステータスの表示が上手くいかなくても、消したいと考えているオブジェクトを消す権限などがある可能性もあると思いますし、その逆もあると思います。)

APIコールが上手くいったならば、次に削除対象のオブジェクトを指定する方法を探します。

Full text search API

NSX-T の各個別API (例えば、セグメントを参照する GET /policy/api/v1/infra/segments など) には、細かい条件 (例えば表示名が HOGE で始まるなど) を指定する方法がありません。その代わりに Full text search API が備わっていて、こちらのAPIを利用すると、参照するオブジェクトをある程度細かく指定することができます。

このFull text search APIを利用するパスは2個あります。これは、Policy Planeのオブジェクトか、Management Planeでのオブジェクトか、を意識して使い分ける必要があります。APIドキュメント内の Searchable types には両方が記載されていますが、パスによって参照可能なオブジェクトが異なったりします。(Management PlaneのオブジェクトとPolicy Planeオブジェクトに関する詳細は別途NSX-Tのリソースを参照してください。)

  • GET /policy/api/v1/search/query
    • Policy Planeのオブジェクト用APIパス
  • GET /api/v1/search/query
    • Management Planeのオブジェクト用のAPIパス

APIパスについてをなんとなく把握したら、次はFull text search APIで利用するQuery Syntaxについてです。とはいっても、こちらのSyntaxについてもあるドキュメント程度詳細に記載されているので要点だけ記載します。

  • Query Syntax 要点
    • URLパラメーターの query でクエリを指定する
    • APIレスポンス内のkey と keyのvalueとして想定されるものを : でつなぐ ( = で繋ぐようなサンプルがあった記憶があるが、誤り)
    • 検索のkeyとしたい値がネストしたjsonのkeyならば . で繋ぐことができる
      • {"hoge": {"fuga": 1}}fuga をkeyで検索したければkeyは hoge.fuga をキーとする
    • valueには、 *ワイルドカード指定なども利用できる
    • AND, OR, NOT や、不等価演算子なども使える

ということで、簡単な例を記載しておきます。

# NSX-T上のグループ かつ 表示名の先頭がYAMAGUCHI_ となっているモノ
curl -k -u "${username}:${password}" -k -G --data-urlencode 'query=resource_type:Group AND display_name:YAMAGUCHI_*' 'https://${NSXMANAGER}/policy/api/v1/search'

あとは、上記の要領で、必要となるオブジェクトを検索するクエリを作り上げます。

オブジェクトを削除していく

ここまで来たらあとは、大した手間ではありません。 resource_typeで削除対象としたいオブジェクトを指定しつつ、各個別のオブジェクトの削除APIをたたいていくとよいです。 APIレスポンスからうまく削除対象のidを引き出すためにjqなどと合わせながら以下のようなスクリプトを組みます。(jqがよくわからなければ、 https://stedolan.github.io/jq/manual/ あたりのマニュアルを眺めるとよいです。)

# 例えばYAMAGUCHI_とPrefixのついたグループを片っ端から削除する
for groupId in `curl -k -u "${username}:${password}" -G --data-urlencode 'query=resource_type:Group AND display_name:YAMAGUCHI_*' 'https://${NSXMANAGER}/policy/api/v1/search' | jq '.results[].id' -r`;
do
    echo curl -k -X DELETE 'https://${NSXMANAGER}/policy/api/v1/infra/domains/default/groups/'$id;
    curl -u "${username}:${password}" -k -X DELETE 'https://${NSXMANAGER}/policy/api/v1/infra/domains/default/groups/'$id;
    sleep 1;
done

まとめ

NSX-T のAPI + jq + shell script で NSX-T上のオブジェクトを一括で削除する方法を記載しました。
NSX-T上のお掃除はAPIをうまく利用してサッとやって年末を迎えましょう。

この記事は2021年の vExperts Advent Calendar の23日目の記事でした。

明日は、Yuki Kawamitsuさんがストレージ関連で何かの記事を投稿するとのことです。お楽しみに!

備忘録: Kinesis AdvantageでF1~F10のふるまいを元に戻す

https://kinesis-ergo.com/wp-content/uploads/kb500-user_manual.pdf を見るとよいのだけども = + w を押すと元のF1~F12に戻る。

( = + m を押すと、マルチメディアグループ機能というやつが有効になって、F10とかF11あたりを押すとボリュームのアップダウンになる。)

マルチメディアグループが有効になっていると、IDEを使っているときのF1 ~ F12 を交えたショートカットが軒並みダメになってめちゃくちゃ不便。