はじめに
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)と組み合わせた構築・検証も試したい。

