CTC 教育サービス
[IT研修]注目キーワード Python Power Platform 最新技術動向 生成AI Docker Kubernetes
みなさん、こんにちは。
前回は、REST APIを安全に利用するために、APIトークンの扱い、timeout 指定、HTTPエラー処理について取り上げました。APIから情報を取得できるようになると、次に考えたいのは、「取得した結果をどう残すか」です。
ネットワーク自動化では、画面に結果を表示して終わり、という使い方だけでは物足りません。たとえば、複数のルータやスイッチからホスト名、OSバージョン、シリアル番号を取得した場合、その結果をCSVやExcelに残しておくと、あとから確認したり、他の人に共有したりしやすくなります。
また、処理が失敗した場合の記録も大切です。どの機器で失敗したのか、認証エラーなのか、タイムアウトなのか、といった情報がログに残っていれば、原因調査がしやすくなります。自動化は「動いたかどうか」だけでなく、「結果を追えるかどうか」も重要です。
今回は、取得したデータをCSVやExcel、ログファイルとして残す方法を確認していきましょう。どれも基本的な内容ですが、実務で使うスクリプトではよく出てくる処理です。
複数のネットワーク機器から取得した情報を、CSVファイルに列名付きで保存したい。Pythonの標準ライブラリを使う場合、最も適切なものはどれか。
選択肢:
A. csv.DictWriter を使い、fieldnames を指定して書き込む
B. json.loads() を使い、CSVファイルへ直接変換する
C. requests.get() の戻り値をそのまま .csv() で保存する
D. print() で画面に表示すれば、自動的にCSVとして保存される
正解:
A
解説:
正解はAです。csv.DictWriter は、辞書(ディクショナリ)形式のデータをCSVに書き込むためのクラスです。ネットワーク機器から取得した情報は、hostname、ip_address、os_version のように、項目名と値の組み合わせで扱うことが多くあります。そのため、辞書をそのまま行として扱える DictWriter は便利です。
writer = csv.DictWriter(f, fieldnames=["hostname", "ip_address", "os_version"])
引数のfieldnames には、CSVの列名を指定します。最初に writer.writeheader() を呼び出すと、1行目に列名が出力されます。そのあと、機器ごとの情報を writer.writerow() で1行ずつ書き込んでいく、という流れです。
Bの json.loads() は、JSON文字列をPythonの辞書やリストに変換するための関数です。JSONを読み取るときに使いますが、CSVへ書き込む処理そのものではありません。Cの .csv() は、requests のレスポンスオブジェクトで一般的に使うメソッドではありません。Dの print() は画面表示であり、ファイル保存とは別の処理です。
CSVは機器一覧や点検結果を残すときによく使います。シンプルな形式なので、Excelやスプレッドシートでも開け、他のツールにも渡しやすいという利点があります。ただし、自分でカンマ区切りの文字列として組み立てようとすると、値の中にカンマや改行がある場合に崩れることがあります。CSVを扱うときは、csv モジュールを使うのが基本です。
取得したネットワーク機器の情報をExcelファイルに出力したい。OpenPyXLで1行分のデータをワークシート末尾に追加するメソッドとして、最も適切なものはどれか。
選択肢:
A. worksheet.append([...])
B. worksheet.send_command(...)
C. workbook.json()
D. csv.writerows(...)
正解:
A
解説:
正解はAです。OpenPyXLでは、worksheet.append() を使うことで、リストやタプルで渡した値を、ワークシートの末尾に1行として追加できます。
ws.append(["router01", "192.0.2.10", "OK", "15.2"])
この例は、機器名、IPアドレス、確認結果、OSバージョンを1行として追加しています。ネットワーク自動化では、複数機器の確認結果を一覧にして残したい場面があります。たとえば、設定変更後の疎通確認、バージョン確認、バックアップ結果の一覧などです。
Bの send_command() は、Netmikoでネットワーク機器にCLIコマンドを送るときに使うメソッドです。Excelへ行を追加するものではありません。Cの workbook.json() は、OpenPyXLの基本操作として使うものではありません。Dの csv.writerows() はCSVへ複数行を書き込む処理で、Excelワークシートに直接追加するメソッドではありません。
Excelファイルに出力するときは、1行目にヘッダーを入れておくと見やすくなります。また、成功、失敗、未確認などの結果をステータスとして同じ列に入力すると、あとからフィルタしやすくなります。表の見た目を作り込みすぎる必要はありませんが、あとで確認しやすい形にしておくことも大切です。
ネットワーク自動化スクリプトの実行結果を、後から確認できるようにファイルへ記録したい。成功、失敗、警告などのレベルを分けて残す方法として、最も適切なものはどれか。
選択肢:
A. print() だけを使い、画面に表示しておく
B. logging モジュールを使い、INFO や ERROR などのレベルで記録する
C. 例外が起きたら何もせずに pass する
D. 成功した場合だけファイルに記録し、失敗は無視する
正解:
B
解説:
正解はBです。logging モジュールを使うと、処理の状態を INFO、WARNING、ERROR などのレベルに分けて記録できます。ネットワーク自動化では、どの機器に対して、いつ、どの処理を行い、成功したのか失敗したのかを後から確認できることが大切です。
logging.info("router01 backup succeeded")
print() でも簡単な確認はできますが、画面に流れてしまうだけなので、あとから追いかけるのが難しくなります。夜間バッチや定期実行のように、人が画面を見ていない場面では、ログファイルに残す方が実務向きです。
Aは、動作確認をしている段階では使えますが、運用記録としては不足しています。Cの pass は、エラーを隠してしまうため不適切です。スクリプト上は正常終了に見えても、実際には特定の機器だけ失敗している、ということが起こり得ます。Dも、失敗を記録しない点が問題です。
CSVやExcelは結果の一覧、ログは処理の経過や失敗理由を残すもの、と分けて考えるとよいでしょう。たとえば、最終的な機器一覧はExcelに出力し、APIエラーやタイムアウトの詳細はログに残す、という使い分けです。試験対策としては、logging の役割と、print() との違いを押さえておくとよいです。
今回は、ネットワーク自動化で取得したデータを残す方法として、csv.DictWriter、OpenPyXLの worksheet.append()、logging モジュールを取り上げました。
これらは、機器へ接続したり設定を投入したりするライブラリではありませんが、自動化スクリプトを使う場合には重要な周辺技術です。取得した結果をCSVやExcelに残せば、棚卸し、報告、比較、引き継ぎに使いやすくなります。また、ログを残せば、失敗した機器や処理の流れをあとから確認できます。ネットワーク自動化は、コマンドを実行することだけが目的ではありません。取得した情報を整理し、関係者が判断できる形にするところまで含めて考えることも重要です。
次回は、複数の出力結果やログを扱う際に重要になる、ファイル名の付け方、日時の扱い、実行結果の保存先といったテーマを扱う予定です。定期実行や月次点検を想定しながら、後から困らない運用しやすい自動化を考えていきましょう。
[IT研修]注目キーワード Python Power Platform 最新技術動向 生成AI Docker Kubernetes