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?

containerlab + Arista cEOS + ANTAでネットワークのテスト自動化を試してみた

0
Last updated at Posted at 2026-10-11

はじめに

Arista社製ネットワーク機器(EOSデバイス)の状態検証を自動化するフレームワーク、Arista Network Test Automation(ANTA)を知ったので試してみる。

今回はcontainerlabでcEOSを1台起動し、EOSバージョンと稼働時間の確認から始める。その後、Loopback0のIPアドレスを意図的に変更して、ANTAが設定の不一致を検出できるか確認する。

最後にIPアドレスを元に戻し、正常・設定不一致・復旧の3段階の結果をJSONで保存するところまで試す。

検証環境

項目 今回の環境
実行環境 WSL2上のUbuntu 24.04.5 LTS
containerlab 0.80.0
Python 3.12.3
ANTA 1.10.0
Dockerイメージ ceos:4.34.6M
接続方法 eAPI(HTTPS / TCP 443)

Docker Engine、containerlabの導入と、cEOSイメージの取り込みは完了している前提とする。cEOSイメージは別途Aristaから入手する必要がある。

containerlabの導入については、以前書いた記事を参照。

今回はcEOSを1台だけ起動する。WSL上で実行するANTAから管理IPアドレスへ接続して状態を確認する。

検証構成

ANTAで用意するもの

今回の試験では、主に次の2つのYAMLファイルを用意する。

ファイル 用途
インベントリ テスト対象の装置と接続先を指定する
テストカタログ 実行するテストと期待値を指定する

例えば「Loopback0のIPアドレスは192.0.2.1/32である」という期待値をカタログに書き、実際の装置の状態と比較する。

既存のテストを使う範囲であれば、テスト処理そのものをPythonで書かずに始められる。

1. cEOSを起動する

作業ディレクトリを作成する

WSLのシェルで作業ディレクトリを作成する。以降のファイル作成とシェルコマンドの実行は、このディレクトリ内で行う。

mkdir -p anta-ceos/{inventory,tests,results}
cd anta-ceos

containerlabのトポロジーを作成する

anta-ceos.clab.ymlを作成する。

name: anta-ceos

topology:
  nodes:
    ceos:
      kind: arista_ceos
      image: ceos:4.34.6M
      startup-config: ceos.cfg

cEOSの初期設定を作成する

ceos.cfgを作成する。

hostname ceos-anta

service routing protocols model multi-agent

username admin privilege 15 role network-admin secret 0 admin

management api http-commands
   protocol https
   no shutdown

interface Ethernet1
   description ANTA-TEST
   shutdown

interface Loopback0
   ip address 192.0.2.1/32

ip routing

ANTAが装置へ接続できるように、eAPIのHTTPSを有効化している。

今回は検証用にユーザー名・パスワードをadmin / adminとしている。実環境では適切な認証情報に変更する。

Ethernet1はshutdownとしている。今回は管理接続とLoopback0の状態を確認するため、Ethernet1は試験に使用しない。

起動・確認する

sudo containerlab deploy -t anta-ceos.clab.yml
sudo containerlab inspect -t anta-ceos.clab.yml

今回の管理IPアドレスは172.20.20.2だった。以降の接続先は、各環境の起動結果に合わせて読み替える。

2. ANTAをインストールする

Pythonの仮想環境を作成し、ANTAをインストールする。

python3 -m venv .venv
source .venv/bin/activate

python -m pip install --upgrade pip
python -m pip install "anta[cli]"

anta --version

今回インストールされたバージョンは次のとおり。

anta, version v1.10.0

以降のantaコマンドは、仮想環境を有効化したWSLのシェルで実行する。

3. eAPIへの接続を確認する

まずはANTAを使う前に、curlでshow versionを取得できるか確認する。

curl -k -u admin:admin \
  --connect-timeout 5 \
  --max-time 15 \
  https://172.20.20.2/command-api \
  -H 'Content-Type: application/json' \
  -d '{
    "jsonrpc": "2.0",
    "method": "runCmds",
    "params": {
      "version": 1,
      "cmds": ["show version"],
      "format": "json"
    },
    "id": 1
  }'

応答のうち、今回使う項目を抜粋すると次のとおり。

{
  "modelName": "cEOSLab",
  "version": "4.34.6M-47628985.4346M (engineering build)"
}

※curl -kは証明書検証を省略する指定。

4. インベントリを作成する

inventory/inventory.ymlを作成する。

anta_inventory:
  hosts:
    - host: 172.20.20.2
      name: ceos-anta
      port: 443

インベントリの読み込みを確認する。

anta get inventory \
  --username admin \
  --password admin \
  --inventory inventory/inventory.yml

ceos-antaが表示され、インベントリを読み込めたことを確認した。装置への接続と状態の検証は、次のテストで確認する。

5. EOSバージョンと稼働時間を確認する

テストカタログを作成する

tests/system.ymlを作成する。

anta.tests.software:
  - VerifyEOSVersion:
      versions:
        - "4.34.6M-47628985.4346M (engineering build)"

anta.tests.system:
  - VerifyUptime:
      minimum: 1

EOSバージョンには、先ほどeAPIで取得した文字列をビルド番号なども含めて指定する。

テスト 確認する内容
VerifyEOSVersion EOSバージョンが指定した許可リストに含まれるか
VerifyUptime 稼働時間が指定した最低値を満たすか

VerifyUptimeのminimumは秒単位。今回はまず動作を確認するため、1秒としている。

カタログの形式を確認する。

anta check catalog --catalog tests/system.yml

出力から検証結果を示す行を抜粋する。

Catalog is valid: tests/system.yml

テストを実行する

anta nrfu \
  --username admin \
  --password admin \
  --inventory inventory/inventory.yml \
  --catalog tests/system.yml \
  --insecure \
  table

結果は次のとおり。両方ともsuccessになった。

Device Test Status
ceos-anta VerifyEOSVersion success
ceos-anta VerifyUptime success

基本試験の結果

※当初はEOSバージョンに4.34.6Mのみを指定してfailureとなったため、装置が返す完全なバージョン文字列に合わせた。

6. Loopback0のIPアドレスを確認する

次は、設定を変更したときに不一致を検出できるか試す。

テストカタログを作成する

tests/loopback.ymlを作成する。

anta.tests.interfaces:
  - VerifyInterfaceIPv4:
      interfaces:
        - name: Loopback0
          primary_ip: 192.0.2.1/32

Loopback0のプライマリIPv4アドレスが192.0.2.1/32であることを期待値とする。

正常状態で実行する

anta nrfu \
  --username admin \
  --password admin \
  --inventory inventory/inventory.yml \
  --catalog tests/loopback.yml \
  --insecure \
  table
Device Test Status
ceos-anta VerifyInterfaceIPv4 success

初期設定とカタログの期待値が一致しているため、successとなった。

IPアドレスを意図的に変更する

cEOSのCLIに入る。

docker exec -it clab-anta-ceos-ceos Cli

ここからはEOSのCLIで実行する。

enable
configure terminal
interface Loopback0
no ip address
ip address 192.0.2.99/32
end
show interfaces Loopback0
exit

確認出力では、アドレスが次のように変わっていた。

Loopback0 is up, line protocol is up (connected)
  Hardware is Loopback
  Internet address is 192.0.2.99/32

カタログ側の期待値は変更せず、192.0.2.1/32のままにしておく。

設定不一致を検出する

EOSのCLIを抜け、WSLのシェルで先ほどのanta nrfuコマンドを再実行する。

Device Test Status
ceos-anta VerifyInterfaceIPv4 failure

判定メッセージは次のとおり。

Interface: Loopback0 - IP address mismatch - Expected: 192.0.2.1/32 Actual: 192.0.2.99/32

判定メッセージには、期待値と実際のIPアドレスが表示された。今回は意図的にアドレスを変更しているため、failureが試験として期待する結果になる。

元に戻して再実行する

もう一度cEOSのCLIに入る。

docker exec -it clab-anta-ceos-ceos Cli

EOSのCLIでIPアドレスを元に戻す。

enable
configure terminal
interface Loopback0
no ip address
ip address 192.0.2.1/32
end
exit

WSLのシェルに戻り、同じテストを再実行する。

Device Test Status
ceos-anta VerifyInterfaceIPv4 success

元に戻すとsuccessになった。ここまでで、正常・設定不一致・復旧の3段階を確認できた。

なお、今回の変更はrunning-configに対して行っている。元のceos.cfgを書き換えたり、変更したIPアドレスを保存したりはしていない。

7. 結果をJSONで保存する

画面の表だけでは後から結果を扱いにくいため、JSON形式でも保存してみる。

tableの代わりにjson --outputを指定する。

anta nrfu \
  --username admin \
  --password admin \
  --inventory inventory/inventory.yml \
  --catalog tests/loopback.yml \
  --insecure \
  json --output results/loopback-normal.json

ログでは、表形式での確認後に設定変更と復旧をもう一度行い、各状態のJSONを取得した。保存先は次のように分けた。

保存時のLoopback0のIPv4アドレス 出力ファイル 実際の結果
192.0.2.1/32 results/loopback-normal.json success
192.0.2.99/32 results/loopback-mismatch.json failure
192.0.2.1/32へ復旧 results/loopback-recovered.json success

上のコマンドは正常状態の保存例である。変更後と復旧後も、第6節の手順で装置のアドレスを変更し、その都度--outputに対応するファイル名を指定して実行する。

復旧後のJSONは次の内容だった。

[
  {
    "name": "ceos-anta",
    "test": "VerifyInterfaceIPv4",
    "categories": [
      "interfaces"
    ],
    "description": "Verifies the interface IPv4 addresses.",
    "result": "success",
    "messages": [],
    "atomic_results": [],
    "custom_field": null
  }
]

3つのファイルをまとめて確認する。

python - <<'PY'
import json
from pathlib import Path

for stage in ("normal", "mismatch", "recovered"):
    path = Path(f"results/loopback-{stage}.json")
    for result in json.loads(path.read_text()):
        print(f"{stage}: {result['name']} / {result['test']} / {result['result']}")
        for message in result["messages"]:
            print(f"  {message}")
PY

出力は次のとおり。

normal: ceos-anta / VerifyInterfaceIPv4 / success
mismatch: ceos-anta / VerifyInterfaceIPv4 / failure
  Interface: Loopback0 - IP address mismatch - Expected: 192.0.2.1/32 Actual: 192.0.2.99/32
recovered: ceos-anta / VerifyInterfaceIPv4 / success

JSONから結果と判定メッセージを取り出せるので、試験レポートへの転記や集計にも使えそうである。

おわりに

今回は、cEOSのEOSバージョン・稼働時間・Loopback0のIPv4アドレスをANTAで検証した。設定変更前後の確認に使うため、今後は検証項目を増やしていきたい。

装置間の疎通やトラフィック転送は今回の試験には含めていない。今後は物理機器での試験や、Arista AVD(Arista Validated Designs)と組み合わせた構築・検証も試したい。

参考

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?