konchangakita

KPS IoT(旧Xi IoT)を一番楽しんでるブログ 会社の看板を背負いません 転載はご自由にどうぞ

【Nutanix UUIDエクスプローラーを作ってみよう】REST APIしてみる

【Nutanix Advent Calendar 2021】 2日目の記事です!

Nutanix で 何ごとか調査するときには往々にして uuid をキーにして調査することが多いです。
uuid と一言で言ってみても、VM の uuid やら Volume Group (Volumes)の uuid やらあれやこれや調べる必要がでてきます
都度都度、ssh して ncli、acli、、、、結構メンドウです
そんなメンドウごとをGUIで簡単にできないか立ち向かってみます

開発環境は、少し前にチャレンジした「お手軽開発環境(Docker, Jupyter, VScode)」を駆使していきます

過去の記事↓
おてがる開発環境をつくろう カテゴリーの記事一覧 - konchangakita


今回は、初歩の初歩、Nutanixクラスタから REST API で情報取得するところからスタート


開発環境を作る

Python 開発環境としては、Dockerhub を眺めて
https://hub.docker.com/_/python
python3.9.9-slim
を使うことにします


python 開発環境用のコンテナイメージをこんな感じで作成
ゆくゆくのことを考えて、今回は docker compose も使って環境を作っていきます

Dockerfile

FROM python:3.9.7-slim

RUN apt update -y
RUN pip install -U pip
RUN pip install jupyterlab

WORKDIR /home

# execute jpyterlab
CMD ["jupyter", "lab", "--ip=0.0.0.0", "--allow-root", "--LabApp.token=''"]


docker-compose

version: '3.7'
services:
  python:
    build:
      context: ./python3.9.7
      dockerfile: Dockerfile
    container_name: python
    ports:
      - 1234:8888
      - 5678:5000
    volumes:
    - ./python3.9.7/app:/home/app:z
    networks:
      - elastic

networks:
  elastic:
    driver: bridge


ディレクトリ構造

├── python3.9.7
 │   ├── dockerfile
 │   └── app/
└── docker-compose


あとはこれを実行してみるだけ
とはいっても、コマンドラインで 「docker-compose up -d」は必要なく
VS Code なら docker-composeファイルを右クリックして、「Compose Up」してやるだけです
f:id:konchangakita:20211129232239p:plain
めちゃ簡単

コンテナ状況をコマンドラインでも確認してみると
ちゃんとポートフォワーディングもしてくれて立ち上がってます

% docker ps
CONTAINER ID   IMAGE                         COMMAND                  CREATED          STATUS          PORTS                                                                  NAMES
254f1f0e45c5   hack21-uuid-explorer_python   "jupyter lab --ip=0.…"   12 seconds ago   Up 11 seconds  0.0.0.0:5678->5000/tcp, 0.0.0.0:1234->8888/tcp   python


これで、Jupyter Lab が起動しているはずなので、ブラウザから「localhost:1234」にアクセスしてみます
f:id:konchangakita:20211129235141p:plain

お手軽環境よろしく、ここからは notebook で python 開発を進めていきます


REST API 認証部分を作る

PythonREST API の第一歩の認証的なところは、Nutanix.dev参照します
API REFENCE には PRISM v2.0 と PRISM v3 が存在してます
f:id:konchangakita:20211130000557p:plain


PRISM v3 の Authentication を参照して、Nutanixクラスタとの接続・認証部分を書いていきます

import urllib3
import requests
import json
from base64 import b64encode
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)


#########################
# Cluster情報を入力
#########################
prism_ip = '10.xxx.xx.xxx'
prism_user = 'admin'
prism_pass = 'nutanix/4u'

# authentication
# 参考 https://www.nutanix.dev/reference/prism_central/v3/authentication
request_url = 'https://' + prism_ip + ':9440/api/nutanix/v3/vms/list'

encoded_credentials = b64encode(bytes(f'{prism_user}:{prism_pass}', encoding='ascii')).decode('ascii')
auth_header = f'Basic {encoded_credentials}'
headers = {'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': f'{auth_header}', 'cache-control': 'no-cache'}



REST APIVMリストを取得する

REST API についてはNutanix PrismクラスタREST API エクスプローラで参照します
f:id:konchangakita:20211202003302p:plain


vms の VMのリストを取得することにします
f:id:konchangakita:20211202002701p:plain


POST でリクエストするパラメータに関しては
Data Type の Model をクリックすることで、パラメータの意味、必須パラメータなのか、オプションなのかなど確認できます
f:id:konchangakita:20211202005132p:plain


パラメータとして
「kind : vm
「length : 256」
だけを指定してみます

payload = '{"kind":"vm", "length":256}'

response = requests.request('post', request_url, data=payload, headers=headers, verify=False, timeout=3.5)
response

実行してみると「200」が返ってきて、いけてそうです
f:id:konchangakita:20211202000801p:plain

レスポンス結果は、json形式にしてやることで内容を確認できます

response.json()

f:id:konchangakita:20211130011711p:plain


'entities' に各VMの情報が入っているので、試しにVM名だけを取り出してみます

r_json = response.json()
[vm['spec']['name'] for vm in r_json['entities']]

f:id:konchangakita:20211130012246p:plain


uuid を取り出したい場合は、こう

[vm['metadata']['uuid'] for vm in r_json['entities']]

f:id:konchangakita:20211202010723p:plain



Nutanix REST API の第一歩目ははなんとかクリア
Elasticsearch編につづく!