👐

生成AIエージェントでネットワーク機器の検証作業を自動化できるか試してみた Part 1

2025/03/08に公開

生成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. ステップバイステップガイド(手順解説)

ここでは、どのように実験を行ったかの流れを簡単に紹介します。

  1. 実験環境の用意

    • 事前に仮想ネットワーク機器(例:Cisco IOSvなど)を立ち上げておきます。 今回はIOSvを使用しましたが、他のプラットフォームでも同様の手順で実行可能です。
    • 初期設定として、ssh接続が可能な状態にしておきます。
    • openahansdのgithubリポジトリを参考に、dockerコンテナを立ち上げてOpenHandsを実行します。私はクイックスタートで実行しました。
    • APIキーの発行などが必要ですが上記のリポジトリを参照すれば初期設定はできるかと思います。
    • APIキーはOpenAIgpt-4oを使用しました
  2. 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接続を行えるように、秘密鍵パスワードといった認証情報を渡します。
  3. 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. 課題と解決方法

  1. セキュリティ面の懸念

    • 実行権限を付与するために、パスワードや秘密鍵をAI側に渡す必要がある点は懸念事項です。
    • 対策としては、最低限の権限を付与することや、一時的に有効な認証情報を利用し、使い終わったら速やかに無効化するフローを検討しましょう。
  2. 誤コマンド実行のリスク

    • AIが誤ったコマンドを発行するリスクがあります。今回は実験していないですが、config系コマンドは影響が大きいため慎重な権限設定が必要です。
    • show系コマンドのみに制限するロールベースアクセスを用意するなど制限が必要ですね。
  3. 実行コマンドの調整

    • 今回の実験では、terminal length 0のような補助コマンドを教えないと正しく情報取得ができませんでした。
    • 事前に必要なコマンドを教え込むか、AIがコマンドの前後関係を理解できるような学習を行うことで、よりスムーズな実行が可能になる可能性があります。

4. 結果と考察

今回の実験で得られた知見は以下のとおりです。

  • 自動化の可能性
    生成AIエージェントに適切な権限を与えることで、SSH経由のネットワーク検証作業をある程度自動化できることが確認できました。使い方次第では、様々な作業をAIに任せることが可能になるかもしれません。
  • セキュリティと運用設計のバランス
    パスワードや秘密鍵をAIに渡す必要がある点は大きなリスクです。しかし適切な運用設計(最低限の権限や一時パスワードの活用など)を行うことでリスクを軽減できます。
  • さらなる拡張性
    showコマンドだけでなく、将来的にはコンフィグ変更や障害対応の自動化まで視野に入れられます。ただし、誤操作時の影響も大きいので慎重なステップが求められます。

他の自動化ツールやスクリプトベースの運用と比較しても、AIが自律的に判断・実行できる点に大きな魅力があると言えます。運用者が手動で複雑な手順をスクリプト化する手間が省けるだけでなく、簡易なトラブルシューティングやログ解析にも応用可能です。


まとめ(結論)

生成AIエージェント「OpenHands」を用いて、ネットワーク機器へのSSH接続とshowコマンドの実行を自動化する実験を行ったところ、技術的には十分に実現可能であることが分かりました。一方、セキュリティ面のリスク誤コマンド実行などの課題もあり、現場での活用には慎重な運用設計が必要です。
今後は、限定的な作業範囲から導入を始めつつ、可能性を探っていきたいと思っています。AIに使わせるスクリプトがいっぱいあると今後便利な気がしました。


Discussion