0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Codex + Containerlab + MCP で EOS/Junos を操作してみる

0
Last updated at Posted at 2026-05-30

OpenAI Codex のデスクトップアプリ版から MCP サーバを登録してコントロールできるとのことで試してみました。

今回は以下を実施してみまました

  • containerlab 上に以下を準備
    • MCP サーバを構築
      • pyATS MCP を利用
    • Arista cEOS / Juniper cJunosEvolved を接続
  • Windows の Codex から MCP Server を登録
  • Codex から 自然言語で EOS/Junos を操作

という構成を試してみました。

以下の画像は Codex のチャットからインターフェースの IP 設定をしてもらったときの画像です
image.png

構成イメージ

image.png

  • pyATS MCP Server
  • Arista cEOS
  • Juniper cJunosEvolved

を containerlab 上で起動します。

Codex から MCP Server に接続し、EOS/Junos を自然言語で操作します。

今回の環境

  • Ubuntu 24.04.4 LTS
  • containerlab : 0.75.0
  • pyATS MCP
  • Arista cEOS : 4.36.0.1F
  • Juniper cJunosEvolved : 25.4R1.13-EVO
  • Codex ( Windows デスクトップアプリ )

事前準備

今回は Containerlab 上で cEOS、cJunosEvolved、pyATS MCP Server を動作させます。

事前に以下を準備しておきます。

  • Containerlab
  • Arista cEOS イメージ
  • Juniper cJunosEvolved イメージ

Containerlab のインストール

Ubuntu 環境では以下のコマンドでインストールできます。

curl -sL https://containerlab.dev/setup | sudo -E bash -s "all"

インストール後にバージョンを確認します。

containerlab version

今回利用したバージョンは以下です。

containerlab : 0.75.0

cEOS の準備

Arista から取得した cEOS イメージを Docker に読み込みます。
( cEOS は Arista のサポートサイトから取得します。無料で取得できますが Arista アカウント登録が必要です)

docker image load -i cEOS64-lab-4.36.0.1F.tar.xz

読み込み後に確認します。

docker images

今回の記事では以下のタグを利用しています。

ceos:4.36.0.1F

cJunosEvolved の準備

Juniper のダウンロードサイトから cJunosEvolved の Docker Tarball を取得します。

取得したイメージを Docker に読み込みます。

docker image load -i cJunosEvolved-25.4R1.13-EVO.tar.gz

読み込み後に確認します。

docker images

今回利用したイメージは以下です。

cjunosevolved:25.4R1.13-EVO

pyATS MCP Server のビルド

以下の手順でまずは pyATS MCP Server のコンテナをビルドします

# 今回の構成やコンフィグを一式 GitHub からダウンロード
git clone --depth=1 https://github.com/katsumi2018/clab-pyats-mcp.git

# ディレクトリ移動
cd clab-pyats-mcp

# ビルド
docker build -t pyats-mcp-proxy:latest .

docker imagesコマンドで以下のように表示されれば準備完了です

$ docker images
IMAGE                        ID           DISK USAGE
ceos:4.36.0.1F               02db955e2eec     2.25GB
cjunosevolved:25.4R1.13-EVO  ec5c060ab764     2.11GB
pyats-mcp-proxy:latest       5a4db979eef5     1.88GB
$

今回はこれらのイメージを利用して、

  • cEOS
  • cJunosEvolved
  • pyATS MCP Server

を Containerlab 上で起動し、Codex から MCP Server 経由で操作していきます。

ディレクトリ構成

今回利用するファイルは以下のとおりとなります

clab-pyats-mcp/
├── clab-pyats-mcp.clab.yml
├── Dockerfile
├── .env
└── testbed.yaml

containerlab トポロジー

今回利用した containerlab のトポロジーファイルです。

Containerlab では YAML 形式でノードやリンクを定義できます。
今回は cEOS と cJunosEvolved を 1 本のリンクで直結しています。

ceos1 eth1
  |
cjunosevo1 et-0/0/0

Dockerfile

pyATS MCP Server のコンテナをビルドするための Dockerfile です。

主なポイントは以下のとおりです。

  • pyATS MCP を git clone
  • requirements.txt を install
  • mcp-proxy を利用
  • HTTP で MCP を公開

.env

pyATS MCP Server が参照する環境変数です。
testbed ファイルのパスやキャッシュ動作などを設定しています。
PYATS_MCP_CONNECTION_TIMEOUT=
PYATS_MCP_MIT=
と設定することで、testbed ファイルで定義した内容を読み込めるようになります

pyATS testbed.yaml

pyATS が利用する testbed ファイルです。
cEOS と cJunosEvolved の接続情報を定義しています。

Junos 側はページャが表示されると処理しづらいため、以下を設定しています。

set cli screen-length 0
set cli screen-width 0

containerlab起動

containerlab deploy -t clab-pyats-mcp.clab.yml

以下のような表示が出れば OK です

image.png

Codex に MCP Server を登録

Codex 側に MCP Server を登録します。

今回は HTTP 公開しているので、

http://<containerlab-host>:8080/mcp

を登録するだけです。(最後に mcp を付けるのを忘れないよう登録してください)

まずは画面左下の設定画面を押すと以下の画面が表示されるので。「MCP サーバー」から「+サーバーを追加する」を選択します
image.png

以下の画面で名前を入力して、URLに'http://:8080/mcp'を入力して保存、アプリの再起動で反映されます
image.png

これで Codex から、自然言語で実施できます。

実際に AI に設定投入させる

バージョンを取得してみる

image.png

EOS/Junos のバージョン情報を自動取得して、表形式で整理してくれます。

IFにIP設定してみる

次に以下の指示をして IP アドレスの設定をしてもらいます

以下にとおりIP設定して
ceos1 Et1 : 192.168.100.1/24
cjunosevo1 et-0/0/0.0 : 192.168.100.2/24

image.png

IP アドレスの設定と合わせて ping での疎通確認もやってくれてます

OSPFの設定をしてもらう

最後に OSPF の設定をしてもらいます

設定したIFでOSPFの設定してネイバーが張れるようにして

image.png

こちらは OSPF が問題なく設定されました

面白かったポイント

EOS/Junos 混在でも自然言語で操作できる

普通はベンダごとの差分を吸収する必要がありますが、

IF に IP つけて

だけで EOS/Junos それぞれに適切な config を投入してくれるのはかなり便利です。

AI が切り分けてくれる

設定については、設定完了までに、以下の画面のように、Codex が自分で切り分けながら設定を登録修正や動作確認をしてました
image.png

Ansible Playbook のように事前に定義した手順を実行する方式では、想定外の事象が発生した場合の切り分けは利用者のスキルに依存する部分があると思います。

一方で Codex は、状況に応じて AI が追加の調査を行いながら原因を推測し、必要な show コマンドを実行してくれます。この点は従来の自動化ツールとは大きく異なると感じました。

実際のネットワーク運用では、設定変更を AI に任せるのはまだ慎重になると思いますが、設定レビューや状態確認、設定ミスの指摘といった用途では非常に有効そうです。特に障害切り分けの初動対応では、大きな効果が期待できると感じました。

ハマったところ

Junos の pager

はじめは、MCP Server 経由で Junos の show interfaces terse など出力の長いコマンドを実行すると、途中でページャが表示されてしまい、コマンド結果を最後まで取得できない問題が発生しました。

これを回避するため、testbed.yamlinit_exec_commands に以下を設定し、接続時にページャを無効化しています。

init_exec_commands:
  - set cli screen-length 0
  - set cli screen-width 0

これにより、Junos へ接続するたびに自動でページャが無効化されるため、MCP Server から安定してコマンド結果を取得できるようになるはずでした。

しかし、この設定を追加しても当初は期待どおりに動作しませんでした。

そこで以下の Issue を投稿したところ、

開発者の方がすぐに問題を確認し、修正してくださいました。

修正後は .env に以下を設定することで正常に動作するようになりました。

PYATS_MCP_MIT=

Issue の投稿から修正まで非常にスピーディーに対応していただき、オープンソースコミュニティのありがたさを改めて感じました。

まとめ

containerlab + MCP + Codex を組み合わせると、

  • 仮想ネットワーク
  • AI
  • 自然言語
  • マルチベンダ操作

がかなり簡単につながります。

特に、

「AI が EOS/Junos を理解して操作・切り分けして確認する」

体験はかなり未来感がありました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?