
みなさん、こんにちは。
今回は「Pythonとネットワーク自動化基礎検定」の出題範囲の中から、例外処理やタイムアウト、エラーハンドリングといった「失敗を前提にした自動化」に関するポイントを取り上げます。
ネットワーク自動化では、正常に動作するケースだけを想定していては不十分です。機器に接続できない、応答が遅い、想定外の値が返ってくるといった状況は、実務では日常的に発生します。こうした場面でスクリプトが停止してしまうのか、それとも適切に処理を継続できるのかが、自動化の品質を大きく左右します。
今回は、そうした観点を確認できる模擬問題を3問用意しました。単に文法を覚えるのではなく、「なぜその処理が必要なのか」を意識しながら確認していきましょう。
【問題1】例外処理の基本
Netmiko を使って機器に接続する処理を行う。接続に失敗した場合でもプログラム全体を停止させず、エラー内容を表示したい。最も適切な書き方を1つ選びなさい。
選択肢:
| net_connect = ConnectHandler(**device) print(“connected”) |
| try: net_connect = ConnectHandler(**device) print(“connected”) except: print(“error”) |
| try: net_connect = ConnectHandler(**device) print(“connected”) except Exception as e: print(f”接続エラー: {e}”) |
| if ConnectHandler(**device): print(“connected”) |
正解:3
解説:
Netmiko で機器に接続する場合、次のような例外が発生する可能性があります。
- 認証失敗(ユーザー名・パスワード誤り)
- 到達不能(ネットワーク経路の問題)
- タイムアウト
- SSHネゴシエーション失敗
これらはすべて「例外」として発生します。例外処理を記述しない場合、1台の接続失敗だけでスクリプト全体が停止します。複数機器を対象とする自動化では致命的です。そのため、try / except による例外処理が必須となります。選択肢3のように、except Exception as e と記述すれば、発生した例外の内容を取得し、原因を確認できます。エラー内容を表示・記録することで、後からの調査や改善にも役立ちます。
選択肢2のように、単に except: とだけ書く方法もありますが、これはすべての例外を無差別に捕捉してしまうため、実務では推奨されません。意図しない例外まで握りつぶしてしまい、問題の発見を遅らせる可能性があります。実務では「何が起きたのか」を記録できないコードは避けるべきです。選択肢1には例外処理がないので、接続に失敗するとスクリプトはそこで停止します。複数台処理では不適切です。選択肢4は、ConnectHandler() が失敗すると例外が発生するため、if 文で判定する前に停止します。接続の成否を真偽値で返す設計ではありません。
【問題2】タイムアウトの設定
機器への接続やコマンド実行時に応答が返らない場合、処理が長時間停止してしまうことがある。これを防ぐための方法として最も適切なものを1つ選びなさい。
- while文で再試行を繰り返す
- タイムアウト値を設定する
- print文を追加する
- sleep() を追加する
正解:
2
解説:
ネットワークでは、機器がダウンしている、ネットワーク経路が断たれている、CPU高負荷で応答が遅れている、といった状況が発生することは珍しくありません。このようなとき、タイムアウトを設定していないと、処理が長時間、あるいは無限に待ち続けてしまう可能性があります。そのため、選択肢2のように、タイムアウト値を適切に設定することが最も重要な対策です。タイムアウトを設定すれば、一定時間応答がない場合に例外が発生し、次の処理へ進むことができ、1台の応答遅延が全体を止める事態を防げます。
たとえば、Netmiko では、timeout などのパラメータを指定することで、一定時間応答がなければ例外を発生させることができます。
| net_connect = ConnectHandler( host=’192.168.1.1′, username=’admin’, password=’password’, timeout=5 ) |
選択肢1のように、再試行を無制限に行う設計は危険です。停止条件がなければ、無限ループに陥る可能性があります。再試行処理を行う場合でも、まずはタイムアウトを設定し、そのうえで回数制限を設けるのが基本です。選択肢3のように print文を追加しても、処理の待機時間は変わりません。選択肢4の sleep() は一定時間待機するだけであり、応答が返らない問題を解決するものではありません。むしろ処理時間を長引かせる可能性があります。
【問題3】ログの記録方法
cronなどで自動実行しているスクリプトにおいて、エラー発生時の原因を後から確認する方法として最も適切なものを1つ選びなさい。
- print() を増やす
- logging モジュールを使用する
- input() を追加する
- 例外を無視する
正解:
2
解説:
自動実行されるスクリプトでは、標準出力に表示される print() の内容を確認できない場合があります。そのため、ログファイルに記録を残す仕組みが必要です。以下のように、Pythonの標準ライブラリである logging モジュールを使えば、エラー内容や発生時刻をファイルに記録でき、エラーの追跡や原因分析が容易になります。自動実行スクリプトでは、print ではなく logging を使うのが基本です。
| import logging logging.basicConfig( filename=’app.log’, level=logging.ERROR, format=’%(asctime)s %(levelname)s: %(message)s’ ) |
選択肢1の print() はデバッグ用途としては使えますが、運用設計としては不十分です。選択肢3の input() はユーザーからの入力を待つための関数です。選択肢4のように例外を無視してしまうと、エラーが発生しても気づかないまま処理が進む可能性があります。障害の発見を遅らせる原因となり、運用上のリスクが高くなります。
まとめ
今回は、例外処理、タイムアウト設定、ログ出力という3つの観点から、「失敗を前提にした自動化」について確認しました。ネットワーク自動化のスクリプトは、正常に動作するケースだけを想定していては不十分です。認証エラー、到達不能、応答遅延、想定外のデータ形式など、現場ではさまざまな“想定外”が発生します。そうした状況でもスクリプトが停止せず、状況を記録し、適切に次の処理へ進める設計が求められます。
自動化とは、単に作業を速くすることではなく、「止まらない仕組み」を作ることでもあります。成功時の動作だけでなく、失敗時の振る舞いをどこまで設計できているかが、スクリプトの完成度を左右すると言えます。
次回も、試験対策として押さえておきたいポイントを整理しつつ、実務でもそのまま使える考え方や設計の視点を取り上げていきます。どうぞお楽しみに。












