ジョーシスAPIで機器の状態を一括で変えてみた
はじめに
多分きっとおそらくMaybe新米情シスなっちです。
資産管理としてジョーシスを導入し半年ほど立ちました。
かなり使いやすく良いソリューションです。しかし使用しているとかゆいところに手が届かない事があります。今回の記事ではAPIを用いて大規模入れ替え後の旧端末の使用者解除&ステータス変更を行います。
おすすめな人
ジョーシスを導入している方でこれからデバイスの大規模入替を行う方
CSVでステータス変更ができなくてモヤモヤしている方
本題
■今回の課題
デバイスのステータスをCSVで変更できない仕様だが一括で変更したい
■開発環境
使用言語:Python
使用するモジュール:Request,csv,json
■準備物
コードを書く前にジョーシスでの作業が必要になります。
APIユーザーキー作成
APIシークレット作成
作成の方法は下記ドキュメントを御覧ください。
■処理の概要
①:ジョーシスAPIを用い、全デバイス一覧CSVを作成(コード①)
②:ステータスを変更したいデバイスを残し②で作成したCSVから削除(手作業)
③:②から使用し対象機器を一括解除&ステータス変更(コード②)
#コード ①
トークンの発行→一覧の取得→CSVへの落としこみとなっています。
import requests # HTTPリクエストを送信するためのライブラリ
import csv # CSVファイルを読み書きするためのライブラリ
import json # JSONデータを扱うためのライブラリ
# ジョーシスから入手したAPIキーとシークレット
APIKEY = "ジョーシスで作成したAPIユーザーキー"
APISEC = "ジョーシスで作成したAPIシークレット"
# ジョーシスAPIのベースURL
base_url = "https://developer.josys.it/api"
def Token_get():
"""ジョーシスからAPIを実行するためのTokenを取得する
Returns:
str: token
"""
# トークン取得のエンドポイントURL
endpoint_url = base_url + "/v1/oauth/tokens"
# トークン取得のためのリクエストデータ
data = {
"grant_type": "client_credentials",
"api_user_key": APIKEY,
"api_user_secret": APISEC
}
# トークン取得のためのPOSTリクエストを送信
response = requests.post(endpoint_url, json=data)
print(response.json()) # レスポンスの内容を出力
token = response.json()["id_token"] # レスポンスからトークンを取得
return token # トークンを返す
def Devicelist_get(token: str):
"""デバイスのリストを取得する
Args:
token (str): アクセストークン
Returns:
list: デバイスデータ
"""
# デバイスリスト取得のエンドポイントURL
endpoint_url = base_url + "/v1/devices"
# 認証ヘッダー
header = {
"Authorization": "Bearer " + token
}
# ページネーションのパラメータ
params = {
'page': 1,
"per_page": 1000
}
# 取得した全デバイス情報を格納するリスト
all_devices = []
while True:
# APIからデバイス情報を取得
response = requests.get(endpoint_url, headers=header, params=params)
Total = int(response.headers.get('X-Total-Pages')) # 総ページ数を取得
# レスポンスのステータスコードを確認
if response.status_code == 200:
devices = response.json() # JSONレスポンスをパース
all_devices.extend(devices["data"]) # 取得したデバイス情報をリストに追加
print(params["page"]) # 現在のページ番号を出力
if Total != params["page"]:
params['page'] = int(params['page']) + 1 # 次のページ番号を設定
else:
break # 次のページがない場合、ループを終了
else:
print(f"APIリクエストに失敗しました。ステータスコード: {response.status_code}")
break
return all_devices # 取得した全デバイス情報を返す
def Output(data):
"""取得したデバイスデータをCSV化する
Args:
data (list): 取得したデバイスデータ
"""
# CSVファイルを開く
with open('devices.csv', 'w', newline='') as csvfile:
# CSVファイルのヘッダー
fieldnames = [
'uuid', 'asset_number', 'device_type', 'status', 'source', 'manufacturer',
'model_number', 'model_name', 'operating_system', 'serial_number',
'device_procurement', 'start_date', 'end_date', 'additional_device_information',
'custom_fields', 'mdm_fields', 'assignment_detail'
]
writer = csv.DictWriter(csvfile, fieldnames=fieldnames) # CSVファイルへの書き込みオブジェクト
writer.writeheader() # ヘッダーを書き込む
for device in data:
writer.writerow(device) # 各デバイス情報を書き込む
# メイン処理
token = Token_get() # トークンを取得
res = Devicelist_get(token) # デバイスリストを取得
Output(res) # デバイスリストをCSVファイルに出力
#コード ②
トークンの発行→CSVを読み込み→①件づつステータスを変更
今回はステータスを利用中から破棄に変更しました。
import requests # HTTPリクエストを送信するためのライブラリ
import csv # CSVファイルを読み書きするためのライブラリ
import json # JSONデータを扱うためのライブラリ
# ジョーシスから入手したAPIキーとシークレット
APIKEY = "ジョーシスで作成したAPIユーザーキー"
APISEC = "ジョーシスで作成したAPIシークレット"
base_url = "https://developer.josys.it/api"
def Token_get():
"""ジョーシスからAPIを実行するためのTokenを取得する
Returns:
str: token
"""
# トークン取得のエンドポイントURL
endpoint_url = base_url + "/v1/oauth/tokens"
# トークン取得のためのリクエストデータ
body = {
"grant_type": "client_credentials",
"api_user_key": APIKEY,
"api_user_secret": APISEC
}
# トークン取得のためのPOSTリクエストを送信
response = requests.post(endpoint_url, json=body)
print(response.json()) # レスポンスの内容を出力
token = response.json()["id_token"] # レスポンスからトークンを取得
return token # トークンを返す
def unassign(data, token):
"""デバイスの割り当てを解除する
Args:
data (dict): デバイスデータ
token (str): Token_get関数で取得したアクセストークン
"""
# 割り当て解除のためのリクエストボディ
# 他のステータスに変更したい場合はこの部分を変更する
body = {
"target_status": "DECOMMISSIONED",
"assignment_end_date": "20yy-mm-dd",
"end_date": "20yy-mm-dd"
}
# 認証ヘッダー
header = {
"Authorization": "Bearer " + token
}
# デバイスのUUIDを取得
uuid = data["uuid"]
# 割り当て解除のエンドポイントURL
endpoint_url = base_url + "/v1/devices/unassign/" + uuid
# 割り当て解除のためのPOSTリクエストを送信
response = requests.post(endpoint_url, headers=header, json=body)
print(response) # レスポンスを出力
# トークンを取得
token = Token_get()
# CSVファイルのパスを指定
csv_file_path = 'devices.csv'
# CSVファイルを読み込む
with open(csv_file_path, mode='r', newline='') as csvfile:
csvreader = csv.DictReader(csvfile)
for row in csvreader:
unassign(row, token) # 各デバイスの割り当てを解除
#他のステータスに変えたい場合
この部分を変更するとで対応できます。
body = {
"target_status": "DECOMMISSIONED",
"assignment_end_date": "20yy-mm-dd",
"end_date": "20yy-mm-dd"
}
例)不明にする場合
body = {
"target_status": "UNKNOWN",
"assignment_end_date": "20yy-mm-dd",
}
詳細は下記を御覧ください
最後に
ジョーシスの開発者様へ
CSVで処理ができるようになればいいなぁ(チラ
以上!!!!!!!!!!