arista ceos環境構築　忘備録


# インストール
##環境
Server: 4Core mem 16GB
OS: Ubuntu 20.04.1 

## Docker
aptやrpmのデストロパッケージでもいいかもしれないけど念のため最新版インストール。

```bash
$ sudo apt-get remove docker docker-engine docker.io containerd runc
$ sudo apt-get update
$ sudo apt-get install ca-certificates curl gnupg lsb-release
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
$ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
```

## コンテナイメージ取得
Aristaのサイトにユーザー登録し、ログイン（詳細省略）
https://www.arista.com/jp/user-registration

下記サイトからcEOSをダウンロード(なぜかtar.xzではなくtarファイルが落ちてきた)
https://www.arista.com/jp/support/software-download
ここではcEOS64-lab-4.27.0F.tarを利用
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132165/54597f84-fb6e-8cf1-f081-009cb77f5793.png)

ダウンロードしたイメージをDockerにimport

```
$ sudo docker import cEOS64-lab-4.27.0F.tar ceos:4.27.0F
# 1分ぐらいかかる
$ sudo docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
ceos         4.27.0F   831f8479cf54   10 seconds ago   1.73GB 
```

##ceos起動テスト

```bash
$ sudo docker create \
  --name=ceos \
  --privileged \
  -e INTFTYPE=eth \
  -e ETBA=1 \
  -e SKIP_ZEROTOUCH_BARRIER_IN_SYSDBINIT=1 \
  -e CEOS=1 -e EOS_PLATFORM=ceoslab \
  -e container=docker \
  -i -t ceos:4.27.0F /sbin/init \
  systemd.setenv=INTFTYPE=eth \
  systemd.setenv=ETBA=1 \
  systemd.setenv=SKIP_ZEROTOUCH_BARRIER_IN_SYSDBINIT=1 \
  systemd.setenv=CEOS=1 \
  systemd.setenv=EOS_PLATFORM=ceoslab \
  systemd.setenv=container=docker

# cEOS起動
$ sudo docker start ceos

# cEOSコンテナの起動確認
$ sudo docker ps 
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS     NAMES
55ee1850ab59   ceos:4.27.0F   "/sbin/init systemd.…"   38 seconds ago   Up 23 seconds             ceos

# ターミナルログインしてみる
$ sudo docker exec -it ceos Cli

localhost>show version
Arista cEOSLab
Hardware version: 
Serial number: 
Hardware MAC address: Not available
System MAC address: Not available

Software image version: 4.27.0F-24308433.4270F (engineering build)
Architecture: x86_64
Internal build version: 4.27.0F-24308433.4270F
Internal build ID: 9088210e-613b-47db-b273-7c7b8d45a086
Image format version: 1.0

cEOS tools version: 1.1
Kernel version: 5.11.0-1022-azure

Uptime: 1 minute
Total memory: 16395120 kB
Free memory: 14754252 kB

# cEOSログアウト
localhost>quit
# cEOSコンテナ停止＆削除
$ sudo docker stop ceos
ceos
$ sudo docker rm ceos
ceos

```

## docker-topoインストール


dockerコマンドでも良いけどnetworkの設定が面倒なので簡単にnodeの作成とnode間リンクを作成できる`docker-topo`を利用して下記トポロジーを作成してみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132165/8737360b-aabe-39fc-bd28-1443e82d00ae.png)

```bash
$ sudo apt-get install -y python3-pip python-is-python3 
$ sudo python3 -m pip install --upgrade --user git+https://github.com/networkop/docker-topo.git
# コマンドにパスが通ってないのでシンボリックリンク作成
$ sudo ln -s /root/.local/bin/docker-topo /usr/local/bin/docker-topo

# デフォルトで使われるceosイメージがceos:latestなのでタグ作成
$ sudo docker tag ceos:4.27.0F ceos:latest 
$ sudo docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
ceos         4.27.0F   831f8479cf54   41 minutes ago   1.73GB
ceos         latest    831f8479cf54   41 minutes ago   1.73GB

# 下記設定ファイル作成。
$ cat testnet.yaml 
VERSION: 2
driver: veth
links:
    - endpoints: ["spine:eth1", "leaf1:eth1"]
    - endpoints: ["spine:eth2", "leaf2:eth1"]

# docker-topo実行
$ sudo docker-topo --create testnet.yaml 
INFO:__main__:
alias spine='docker exec -it testnet_spine Cli'
alias leaf1='docker exec -it testnet_leaf1 Cli'
alias leaf2='docker exec -it testnet_leaf2 Cli'
INFO:__main__:All devices started successfully
WARNING:pyroute2.ipdb.main:shutdown in progress

# ceosコンテナ起動
$ sudo docker ps
CONTAINER ID   IMAGE         COMMAND                  CREATED         STATUS         PORTS     NAMES
7f56757681a9   ceos:latest   "/sbin/init systemd.…"   4 minutes ago   Up 4 minutes             testnet_leaf2
c3ac12303145   ceos:latest   "/sbin/init systemd.…"   4 minutes ago   Up 4 minutes             testnet_leaf1
44d7b1386acc   ceos:latest   "/sbin/init systemd.…"   4 minutes ago   Up 4 minutes             testnet_spine

# 接続してみる
$ sudo docker exec -it testnet_spine Cli
localhost>
```

## 注意：Config保存
**eosのwriteコマンドではConfigが保存されない。** ホストのdocker-topoでrunning configが保存される。次回`docker-topo --create testnet.yaml`すると保存したconfigで起動する。

```bash
# configの保存
$ sudo docker-topo -s testnet.yaml 
INFO:__main__:All configs saved in ./config
# config ディレクトリができる
$ ls -a ./config/
.  ..  testnet_leaf1  testnet_leaf2  testnet_spine
# configが保存されている
$ cat ./config/testnet_leaf1
> show running
! Command: show running-config at line 1
! device: localhost (cEOSLab, EOS-4.27.0F-24308433.4270F (engineering build))
!
no aaa root
!
transceiver qsfp default-mode 4x10G
!
##### <SNIP > ######
```

## 注意：docker-topo設定ファイル変更
`testnet.yaml`のような設定ファイルを変更する前に全EOSコンテナを停止する。停止する前に`testnet.yaml`を変更してしまうとdocker-topoコマンドから 全EOSコンテナを停止できなくなる。（docker コマンドでゴミ掃除が必要になる）
コンテナの停止は下記で。


```
$ sudo docker-topo --destroy testnet.yaml
```