生成AIエージェントでネットワーク機器の検証作業を自動化できるか試してみた Part 1
生成AIエージェントでネットワーク機器の検証作業を自動化できるか試してみた Part 1
はじめに(イントロダクション)
ネットワークエンジニアリングの現場では、日々多くの検証作業が発生します。特にマルチベンダー環境や膨大な数の機器を扱う場合、SSHでログインして各種のshowコマンドを実行し、設定を確認するだけでも大きな手間ですよね。
そこで今回は、生成AIエージェント「OpenHands」と、Pythonのネットワーク自動化ライブラリであるNetmikoを組み合わせることで、ネットワーク機器の検証を自動化できないかを実験してみました。AIに検証作業を任せることで得られるメリットや潜在的な課題を探りながら、今後の活用可能性について考察します。
本文
1. 背景と説明
AIエージェント「OpenHands」とは?
「OpenHands」は、特定の権限(APIキーやコマンド実行権限など)を付与することで、AIにさまざまなタスクを“実行”させるコンセプトをもった仕組みです。ChatGPTなどの大規模言語モデル(LLM)とは異なり、対話だけでなく実際のプログラム実行や外部ツール操作が可能になります。
Netmikoとは?
Netmikoは、PythonでSSHを使ったネットワーク機器の自動化を簡単に実装できるライブラリです。Cisco IOSやJuniper JunOSなど、多数のプラットフォームに対応しているため、多様なネットワーク機器へのアクセスが容易になります。
今回の実験では、この2つを組み合わせて「仮想ネットワーク機器にSSHでログインし、showコマンドを自動実行し、取得した情報をAIエージェントが確認・評価する」という流れを試みました。
2. ステップバイステップガイド(手順解説)
ここでは、どのように実験を行ったかの流れを簡単に紹介します。
-
実験環境の用意
- 事前に仮想ネットワーク機器(例:Cisco IOSvなど)を立ち上げておきます。 今回はIOSvを使用しましたが、他のプラットフォームでも同様の手順で実行可能です。
- 初期設定として、ssh接続が可能な状態にしておきます。
- openahansdのgithubリポジトリを参考に、dockerコンテナを立ち上げてOpenHandsを実行します。私はクイックスタートで実行しました。
- APIキーの発行などが必要ですが上記のリポジトリを参照すれば初期設定はできるかと思います。
- APIキーは
OpenAI
のgpt-4o
を使用しました
-
OpenHandsに指示を出す
- こんな指示を出してみました。
リモートマシンにリモートアクセス接続(ssh)して情報を取得してください 対象 - IPアドレス:192.168.64.30 - username:wanpachi - 秘密鍵:以下のものを使ってください。これはテスト用のものです (秘密鍵の中身) - 接続方式:SSH priviledgeを15に設定しているので特権モードへ昇格済みです。 その上で - show version - show running-config - show ip int brief を入力して結果を表示してください。 それを実現するために`netmiko`や`paramiko`でpythonスクリプトを作成して実行してください。 公開鍵認証のため、パスワード入力は不要です。 それではよろしくお願いします。
- AIエージェントがSSH接続を行えるように、秘密鍵やパスワードといった認証情報を渡します。
- こんな指示を出してみました。
-
OpenHandsdの実行
- OpenHandsは指示を受け取って、作業を開始します
- 失敗を繰り返しながら、最終的にスクリプトが実行成功するまで自分で考えて動き出します
- 最終的にこんなスクリプトを作り上げました。
import paramiko import time HOST = "192.168.64.30" USERNAME = "wanpachi" KEY_FILE = "/tmp/test_rsa_key" # Create SSH client and set policy to add host key automatically client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) try: client.connect(HOST, username=USERNAME, key_filename=KEY_FILE, look_for_keys=False, allow_agent=False) except Exception as e: print(f"Failed to connect: {e}") exit(1) # Invoke an interactive shell shell = client.invoke_shell() # Wait for the shell to be ready time.sleep(1) # Clear any initial banner if shell.recv_ready(): initial_banner = shell.recv(65535).decode('utf-8') else: initial_banner = '' commands = ["show version", "show running-config", "show ip int brief"] full_output = initial_banner for cmd in commands: shell.send(cmd + "\n") # Wait for the command to execute; increase sleep if necessary time.sleep(2) # Read available output while shell.recv_ready(): output = shell.recv(65535).decode('utf-8') full_output += output time.sleep(0.5) client.close() print(full_output)
- 動きそう。
- 作業の中で
/tmp/test_rsa_key
に秘密鍵を保存していました。 - そして最終的にこのスクリプトを実行しましたが、うまくいきませんでした。
- こんな感じ
RT2#show version Cisco IOS Software ------snip------ RT2#how running-config ^ % Invalid input detected at '^' marker. RT2#show ip int brief Interface IP-Address OK? Method Status Protocol Ethernet0/0 unassigned YES TFTP administratively down down Ethernet0/1 unassigned YES TFTP administratively down down Ethernet0/2 unassigned YES TFTP administratively down down Ethernet0/3 192.168.64.30 YES DHCP up up RT2#
-
terminal length 0
を入れるべきでしたね。これは考えてやってくれないようです。 - そして追加で
terminal length 0
を入れて実行してというと、
RT2#show version Cisco IOS Software ------snip------ Configuration register is 0x0 RT2#show running-config Building configuration... ------snip------ end RT2#show ip int brief Interface IP-Address OK? Method Status Protocol Ethernet0/0 unassigned YES TFTP administratively down down Ethernet0/1 unassigned YES TFTP administratively down down Ethernet0/2 unassigned YES TFTP administratively down down Ethernet0/3 192.168.64.30 YES DHCP up up
- うまくいきました。
- なぜ失敗したかはあまり考えてくれないようで、こちらから指示を出す必要がありました。ただし、工夫次第でなんとかなるかもしれません。
3. 課題と解決方法
-
セキュリティ面の懸念
- 実行権限を付与するために、パスワードや秘密鍵をAI側に渡す必要がある点は懸念事項です。
- 対策としては、最低限の権限を付与することや、一時的に有効な認証情報を利用し、使い終わったら速やかに無効化するフローを検討しましょう。
-
誤コマンド実行のリスク
- AIが誤ったコマンドを発行するリスクがあります。今回は実験していないですが、
config
系コマンドは影響が大きいため慎重な権限設定が必要です。 -
show
系コマンドのみに制限するロールベースアクセスを用意するなど制限が必要ですね。
- AIが誤ったコマンドを発行するリスクがあります。今回は実験していないですが、
-
実行コマンドの調整
- 今回の実験では、
terminal length 0
のような補助コマンドを教えないと正しく情報取得ができませんでした。 - 事前に必要なコマンドを教え込むか、AIがコマンドの前後関係を理解できるような学習を行うことで、よりスムーズな実行が可能になる可能性があります。
- 今回の実験では、
4. 結果と考察
今回の実験で得られた知見は以下のとおりです。
-
自動化の可能性
生成AIエージェントに適切な権限を与えることで、SSH経由のネットワーク検証作業をある程度自動化できることが確認できました。使い方次第では、様々な作業をAIに任せることが可能になるかもしれません。 -
セキュリティと運用設計のバランス
パスワードや秘密鍵をAIに渡す必要がある点は大きなリスクです。しかし適切な運用設計(最低限の権限や一時パスワードの活用など)を行うことでリスクを軽減できます。 -
さらなる拡張性
showコマンドだけでなく、将来的にはコンフィグ変更や障害対応の自動化まで視野に入れられます。ただし、誤操作時の影響も大きいので慎重なステップが求められます。
他の自動化ツールやスクリプトベースの運用と比較しても、AIが自律的に判断・実行できる点に大きな魅力があると言えます。運用者が手動で複雑な手順をスクリプト化する手間が省けるだけでなく、簡易なトラブルシューティングやログ解析にも応用可能です。
まとめ(結論)
生成AIエージェント「OpenHands」を用いて、ネットワーク機器へのSSH接続とshowコマンドの実行を自動化する実験を行ったところ、技術的には十分に実現可能であることが分かりました。一方、セキュリティ面のリスクや誤コマンド実行などの課題もあり、現場での活用には慎重な運用設計が必要です。
今後は、限定的な作業範囲から導入を始めつつ、可能性を探っていきたいと思っています。AIに使わせるスクリプトがいっぱいあると今後便利な気がしました。
Discussion