【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 で情報取得するところからスタート
【Nutanix UUIDエクスプローラーを作ってみよう】シリーズ
・REST APIしてみる イマココ
・REST API 結果を Elasticsearch へ
・Elasticsearch から Flask
・Flask表示までのまとめ
開発環境を作る
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」してやるだけです
めちゃ簡単
コンテナ状況をコマンドラインでも確認してみると
ちゃんとポートフォワーディングもしてくれて立ち上がってます
% 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」にアクセスしてみます
お手軽環境よろしく、ここからは notebook で python 開発を進めていきます
REST API 認証部分を作る
Python で REST API の第一歩の認証的なところは、Nutanix.dev参照します
API REFENCE には PRISM v2.0 と PRISM v3 が存在してます
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 API で VMリストを取得する
REST API についてはNutanix Prismクラスタの REST API エクスプローラで参照します
vms の VMのリストを取得することにします
POST でリクエストするパラメータに関しては
Data Type の Model をクリックすることで、パラメータの意味、必須パラメータなのか、オプションなのかなど確認できます
パラメータとして
「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」が返ってきて、いけてそうです
レスポンス結果は、json形式にしてやることで内容を確認できます
response.json()
'entities' に各VMの情報が入っているので、試しにVM名だけを取り出してみます
r_json = response.json() [vm['spec']['name'] for vm in r_json['entities']]
uuid を取り出したい場合は、こう
[vm['metadata']['uuid'] for vm in r_json['entities']]
Nutanix REST API の第一歩目ははなんとかクリア
Elasticsearch編につづく!