見出し画像

PythonとJamfProのAPIを使ってMacのインベントリを取得してみた。


修正履歴

・2024/01/20:初版
・2024/01/20:タイトル変更
・2024/01/21:実行結果を追記。文章のおかしなところを修正。

やること

JamfProのAPIを使って管理下のMacのインベントリを取得してみました。
そしてLastUpdateが一ヶ月を超過しているMacを判断するという処理をしてみました。

事前準備

コードを書く前にJamfPro側の準備が必要になります。
以下のことが必要です。
・APIロールを作成。
・APIクライアントを作成。
・クライアントシークレットを作成。

これらのやり方は以下のJamfのドキュメントに記載されていますので、参照しつつ作成していきましょう。

コードを書く前に

必要な関数をpip installしておきましょう。

pip install --upgrade requests

コードを書く

では早速コードを書いていきましょう!

main関数の雛形

まずは雛形から。
モジュールとしての再利用性のためこのように書くことが推奨されていますので、それに従いましょう。
mainの上で行われているimportはこれから利用する関数群を呼び出しています。

import requests
import json
from datetime import datetime
from dateutil.relativedelta import relativedelta


def main():
    # メインのプログラムのロジック

if __name__ == '__main__':
    main()

Token呼び出し

ではmainの中を書いていきましょう。
まずはAPIを使えるようにするためにAPIクライアントとクライアントシークレットを使ってTokenを取得する処理です。
{xxxx}で記述しているところは各社に合わせて書き換えて下さい。
(注意)各所にprint文を入れているのはデバッグのためです。

またテストなのでキー等をコードに直接書いていますが、業務で使う際にはファイルに格納するなり工夫をして下さい。

参照マニュアル


import requests
import json
from datetime import datetime
from dateutil.relativedelta import relativedelta


def main():
    print('開始-main')

    print('開始-Token取得')
    str_url_api_base = "https://{xxxx}.jamfcloud.com"
    str_url_token = "/api/oauth/token"
    str_url_auth = str_url_api_base + str_url_token
    print('URL:[' + str_url_auth + ']')

    str_json_token = {
        'grant_type': 'client_credentials',
        'client_id': '{xxxx}',
        'client_secret': '{xxxx}'
    }

    str_headers = {'Content-Type': 'application/json'}

    try:
        str_res_token = requests.post(str_url_auth, params=str_json_token, headers=str_headers)
    except Exception as e:
        print(f'Token取得中にエラーが発生しました: {str(e)}')

    json_response_token = str_res_token.json()
    print('return_token_type:[' + json_response_token['token_type'] + ']')
    print('return_expires_in:[' + str(json_response_token['expires_in']) + ']')
    print('return_id_token:[' + json_response_token['access_token'] + ']')

    print('終了-Token取得')

    print('終了-main')

if __name__ == '__main__':
    main()

インベントリ取得

Tokenが呼び出せたら、今度はそのTokenを使ってインベントリを取得してみましょう。
今回はコンピュータ名とJamfProにアクセスしてインベントリを更新した日時を取得し、取得日が1ヶ月以上経過しているコンピュータ名を出力しています。

参照マニュアル


import requests
import json
from datetime import datetime
from dateutil.relativedelta import relativedelta


def main():
    print('開始-main')

    print('開始-Token取得')
        ・・・
    print('終了-Token取得')

    print('開始-コンピュータ情報一覧取得')
    str_url_computers = "/api/v1/computers-inventory"
    str_url_auth = str_url_api_base + str_url_computers
    print('URL:[' + str_url_auth + ']')

    str_json_computerlist = {
        'section': 'GENERAL',
        'page': 0,
        'page_page': 10,
        'sort': 'general.name:asc'
    }

    str_json_headers = {
        'Authorization': 'Bearer ' + json_response_token['access_token'],
        'Content-Type': 'application/json'
    }

    str_res_computerlist = requests.get(str_url_auth, headers=str_json_headers, params=str_json_computerlist)
    # print('return_all:[' + str_res_computerlist.text + ']')

    json_response_computerlist_headers = str_res_computerlist.headers
    json_response_computerlist_body = str_res_computerlist.json()

    print('return_header_Content-Type:[' + json_response_computerlist_headers.get('Content-Type') + ']')

    # 1ヶ月前の日付を計算
    now = datetime.now()
    one_month_ago = now - relativedelta(months=1)
    str_one_month_ago = one_month_ago.strftime("%Y/%m/%d")
    # print(one_month_ago.strftime("%Y/%m/%d"))

    for jsonObj_results in json_response_computerlist_body['results']:
        # print(jsonObj_results.get('id'))
        # print(jsonObj_results.get('udid'))

        # 最終アクセス日時を取得
        obj_lastcontacttime = datetime.fromisoformat(jsonObj_results.get('general').get('lastContactTime'))
        str_lastcontactdate = obj_lastcontacttime.strftime('%Y/%m/%d')

        # print(str_lastcontacttime)
        if str_one_month_ago > str_lastcontactdate:
            str_name = jsonObj_results.get('general').get('name')
            str_lastcontactdatetime = obj_lastcontacttime.strftime('%Y/%m/%d %H:%M:%S')
            print('[' + str_name + ']/[' + str_lastcontactdatetime + ']')

    print('終了-コンピュータ情報一覧取得')

    print('終了-main')

if __name__ == '__main__':
    main()

実行結果

これで文字列としてコンピュータ名とインベントリの最終更新日を取得できたかと思います。

(testxxx) xxxx % python3 testxxx.py 
[PC-10000.xxx.xxx]/[2023/12/10 06:28:15]
[PC-10002.xxx.xxx]/[2023/12/09 20:47:42]
[PC-10023.xxx.xxx]/[2023/12/14 04:25:30]
(testxxx) xxxx % 

あとはこれをSlackに出力するなり、Googleスプシに出力するなりすれば、一定期間でやっているであろう以下の定型業務を減らすことができます。
・JamfProを開く
・インベントリを検索
・LastUpdateで並べ直し
・確認

以上

この記事が気に入ったらサポートをしてみませんか?