見出し画像

やってみようNetDevOps - 03 ネットワーク仮想環境の構築 後編


はじめに


こんにちは!株式会社SHIFTのインフラサービスグループの小野 志峰です。

この"やってみようNetDevOps"シリーズでは、数記事に渡って実践的なNetDevOpsの取り組みをBlogで綴っていきます。
NetDevOpsがどのようなものかについては、シリーズ1記事目をご参照ください。

シリーズの目次


  1. やってみようNetDevOpsの紹介

  2. ネットワーク仮想環境の構築 前編

  3. ネットワーク仮想環境の構築 後編  ←いまここ

  4. ネットワーク機器にAnsibleを実行

  5. AWXの構築

  6. AWXからネットワーク機器にAnsibleを実行

  7. Gitlab/Gitlab Runnerの構築

  8. git pushをきっかけにAWXのWorkflowを動かす仕組みを作る

  9. configのgit pushから検証ネットワーク機器に投入されるまでの仕組みを作る

  10. ネットワーク機器から情報を収集しテストする仕組みを作る

  11. ネットワーク機器のconfigをgit pushする仕組みを作る

  12. 承認をきっかけにGitlabから参照したconfigを本番機器に投入する仕組みを作る

  13. Netboxの構築

  14. Netboxを参照しAnsibleを動かす仕組みを作る

  15. Zabbixの構築

  16. Netboxを参照しZabbixにネットワーク機器を登録し死活監視する仕組みを作る

  17. 打ち上げ

ネットワーク構成を更新


前回のやってみようNetDevOps - 02では下図のようなルータ2台が直結した状態を構築しました。

今回はこのネットワーク構成を更新して、下図のような現実に存在しそうな意味のあるネットワークを構築します。

ネットワーク構成図

サーバのGatewayがVRRPで冗長化されていて、ceos01のpriority値の変更によってtrafficを迂回したり戻したりする運用という想定です。 VRRPについて簡単に説明すると、複数のルータをグループ化して1つの仮想IPアドレスをゲートウェイとして提供するL3冗長化技術です。
類似するものとしてCisco独自技術のHSRPが挙げられますが、HSRPと違ってVRRPは異なるベンダ同士でもグループ化が可能です。

ということで、今回の実施する内容は以下のようになります。

  1. 現行のtopologyの削除

  2. 新topologyの定義

  3. 新topologyの立ち上げ

  4. 正常性確認

それではぁ、やってみよう、Net!Dev!!Ops!!!

現行のtopologyの削除


まず、前回作成したtopologyの定義ファイルを元にcontainerlab destroyコマンドで機器を全て削除します。

# -c optionによってdeployした際に作成されたdirectoryごと消します

$ sudo containerlab -t topology.clab.yaml destroy -c

# コンテナがなくなったことを確認
$ docker ps

# output
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

コンテナが削除されました。

新topologyの定義


それでは、新たなtopologyを以下の通り定義します。

---
name: ceos

topology:
  nodes:
    ceos01:
      kind: ceos
      image: ceos:4.32.5.1M
      startup-config: ./ceos01.cfg
      ports:
        - 50022:22
    ceos02:
      kind: ceos
      image: ceos:4.32.5.1M
      startup-config: ./ceos02.cfg
      ports:
        - 50122:22 
    ceos03:
      kind: ceos
      image: ceos:4.32.5.1M
      startup-config: ./ceos03.cfg
      ports:
        - 50222:22
    sv1:
      kind: linux
      image: woahbase/alpine-ssh:latest
      ports:
        - 50322:22
      env:
        S6_ROOTPASS: password
        S6_USER: alpine
        S6_USERPASS: password
      exec:
        - ip addr add 10.0.10.254/24 dev eth1
        - ip route add 10.0.20.0/24 via 10.0.10.1 dev eth1
        - ip link set eth1 up
        - apk add --no-cache python3
    sv2:
      kind: linux
      image: woahbase/alpine-ssh:latest
      ports:
        - 50422:22
      env:
        S6_ROOTPASS: password
        S6_USER: alpine
        S6_USERPASS: password
      exec:
        - ip addr add 10.0.20.254/24 dev eth1
        - ip route add 10.0.10.0/24 via 10.0.20.1 dev eth1
        - ip link set eth1 up
        - apk add --no-cache python3
  links:
    - endpoints: ["ceos01:eth1", "ceos03:eth1"]
    - endpoints: ["ceos02:eth1", "ceos03:eth2"]
    - endpoints: ["sv1:eth1", "ceos03:eth3"]
    - endpoints: ["sv2:eth1", "ceos03:eth4"]

上記YAMLを"topology.clab.yaml"で上書き保存します。

まず新しく出てきた機器を見ていきます。
nodesにceos03、sv1、sv2が登場しました。

ceos3は他のceos01、ceos02と異なり、ネットワークスイッチの役割を果たしています。
linksのそれぞれのendpointsを見て分かるように、sv1、sv2、ceos01、ceos02の全機器と接続しています。

sv1とsv2はそれぞれvlan10(10.0.10.0/24), vlan20(10.0.20.0/24)に所属するサーバです。
このサーバはpingを打つ程度の役割しかないので、とにかく軽量なものを探しまして、alpine linuxベースでSSH serverが最初から動いているwoahbase/alpine-sshを利用しました。
環境変数でusernameとpasswordも設定できるので、大変ありがたいimageです。

その他、新しく出てきた項目について説明します。
startup-config: これは読んで字のごとく、startup-configのpathにあるfileをceosの起動時に読み込んでくれます。
それぞれの機器のstartup-configの内容は後述します。

env: コンテナで使われる環境変数を記載します。
woahbase/alpine-sshのドキュメントを参照し、ここではusernameに"alpine"を、userとrootのpasswordに"password"を設定しています。

exec: containerの起動後に実行したいcommandを記載します。
私はdockerのentrypointやcmdの辺りがいつも記憶があやふやになって都度調べているので、気にしなくて済むのはとても嬉しいです。
ここでは以下のことを行っています。

  • eth1にip addressを割り当て。

  • 相手側のネットワークへのstatic routeをVRRPのVIP宛に設定。

  • eth1をupさせてip addressの割り当てを反映。

  • python3のinstall

各ceosのstartup-configは以下です。
ceos01, 02はvlan10, vlan20それぞれでVRRPを組んでいて、ceos01がmasterになる設定です。

# ceos01

username admin privilege 15 secret admin
!
vlan 10,20
!
interface Ethernet1
   switchport trunk allowed vlan 10,20
   switchport mode trunk
!
interface Vlan10
   ip address 10.0.10.2/24
   vrrp 10 priority-level 110
   vrrp 10 ipv4 10.0.10.1
!
interface Vlan20
   ip address 10.0.20.2/24
   vrrp 20 priority-level 110
   vrrp 20 ipv4 10.0.20.1
!
ip routing
!
ip route 0.0.0.0/0 172.20.20.1
# ceos02

username admin privilege 15 secret admin
!
vlan 10,20
!
interface Ethernet1
   switchport trunk allowed vlan 10,20
   switchport mode trunk
!
interface Vlan10
   ip address 10.0.10.3/24
   vrrp 10 priority-level 100
   vrrp 10 ipv4 10.0.10.1
!
interface Vlan20
   ip address 10.0.20.3/24
   vrrp 20 priority-level 100
   vrrp 20 ipv4 10.0.20.1
!
ip routing
!
ip route 0.0.0.0/0 172.20.20.1

ceos03はスイッチとして使っているので、各interfaceにvlanをアサインしているだけです。

# ceos03

username admin privilege 15 secret admin
!
vlan 10,20
!
interface Ethernet1
   switchport trunk allowed vlan 10,20
   switchport mode trunk
!
interface Ethernet2
   switchport trunk allowed vlan 10,20
   switchport mode trunk
!
interface Ethernet3
   switchport access vlan 10
!
interface Ethernet4
   switchport access vlan 20
!
ip routing
!
ip route 0.0.0.0/0 172.20.20.1

startup-configには全てを書く必要はなく、templateで用意されているdefaultのconfigに上書きしてくれます。
しかし、なぜかuser/passはtemplateでも定義されているにもかかわらず、startup configに記載しないと上手くloginできませんでした。
なので、templateと同内容ですがuser/passの情報もstartup-configに記載しています。

また、ip route 0.0.0.0/0 172.20.20.1で設定しているdefault routeのnexthopである172.20.20.1は何者かというと、containerlabがdocker上に作成したマネジメントネットワークのゲートウェイです。
dockerでは作成されたネットワークのネットワークアドレス + 1(つまり172.20.20.0/24だったら172.20.20.1)がゲートウェイになります。
containerlabが作成したネットワークをdockerコマンドで確認してみます。

# dockerのネットワークを一覧します
$ docker network ls

# output
NETWORK ID     NAME           DRIVER    SCOPE
2e17fa7a7a18   bridge         bridge    local
ba51fe9945f7   clab           bridge    local  <= containerlabが作成したネットワーク
6385398356d0   host           host      local
6947b776da16   none           null      local
e4bcff1021be   service-mesh   bridge    local

# clabのネットワークの内容を表示します
$ docker network inspect clab

# output
[
    {
        "Name": "clab",
        "Id": "ba51fe9945f7ca39472cc66d05a68ba3caa0394a2e5de1b04984021e3e019401",
        "Created": "2025-06-04T08:12:33.370746678Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv4": true,
        "EnableIPv6": true,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.20.20.0/24" <= ここから所属するネットワークのアドレスが分かります。
                },
                {
                    "Subnet": "3fff:172:20:20::/64"
                }
            ]
<snip>

新topologyの立ち上げ


さて、新topologyの定義ファイルと、ceosのstartup-configが揃いましたので、deployしてみます。

$ sudo containerlab -t topology.clab.yaml deploy

# output
14:39:00 INFO Creating lab directory path=/home/containerlab/clab-ceos
14:39:00 INFO Creating container name=sv1
14:39:00 INFO Creating container name=sv2
14:39:00 INFO Creating container name=ceos03
14:39:00 INFO Creating container name=ceos01
14:39:01 INFO Running postdeploy actions for Arista cEOS 'ceos03' node
14:39:01 INFO Created link: sv1:eth1 ▪┄┄▪ ceos03:eth3
14:39:01 INFO Created link: sv2:eth1 ▪┄┄▪ ceos03:eth4
14:39:01 INFO Created link: ceos01:eth1 ▪┄┄▪ ceos03:eth1
14:39:01 INFO Running postdeploy actions for Arista cEOS 'ceos01' node
14:39:01 INFO Creating container name=ceos02
14:39:01 INFO Created link: ceos02:eth1 ▪┄┄▪ ceos03:eth2
14:39:01 INFO Running postdeploy actions for Arista cEOS 'ceos02' node
14:40:26 INFO Executed command node=sv1 command="ip addr add 10.0.10.254/24 dev eth1" stdout=""
14:40:26 INFO Executed command node=sv1 command="ip route add 10.0.20.0/24 via 10.0.10.1 dev eth1" stdout=""
14:40:26 INFO Executed command node=sv1 command="ip link set eth1 up" stdout=""
14:40:26 INFO Executed command node=sv2 command="ip addr add 10.0.20.254/24 dev eth1" stdout=""
14:40:26 INFO Executed command node=sv2 command="ip route add 10.0.10.0/24 via 10.0.20.1 dev eth1" stdout=""
14:40:26 INFO Executed command node=sv2 command="ip link set eth1 up" stdout=""
14:40:26 INFO Adding host entries path=/etc/hosts
14:40:26 INFO Adding SSH config for nodes path=/etc/ssh/ssh_config.d/clab-ceos.conf
╭──────────────────┬────────────────────────────┬─────────┬───────────────────╮
│       Name       │         Kind/Image         │  State  │   IPv4/6 Address  │
├──────────────────┼────────────────────────────┼─────────┼───────────────────┤
│ clab-ceos-ceos01 │ ceos                       │ running │ 172.20.20.4       │
│                  │ ceos:4.32.5.1M             │         │ 3fff:172:20:20::4 │
├──────────────────┼────────────────────────────┼─────────┼───────────────────┤
│ clab-ceos-ceos02 │ ceos                       │ running │ 172.20.20.6       │
│                  │ ceos:4.32.5.1M             │         │ 3fff:172:20:20::6 │
├──────────────────┼────────────────────────────┼─────────┼───────────────────┤
│ clab-ceos-ceos03 │ ceos                       │ running │ 172.20.20.2       │
│                  │ ceos:4.32.5.1M             │         │ 3fff:172:20:20::2 │
├──────────────────┼────────────────────────────┼─────────┼───────────────────┤
│ clab-ceos-sv1    │ linux                      │ running │ 172.20.20.3       │
│                  │ woahbase/alpine-ssh:latest │         │ 3fff:172:20:20::3 │
├──────────────────┼────────────────────────────┼─────────┼───────────────────┤
│ clab-ceos-sv2    │ linux                      │ running │ 172.20.20.5       │
│                  │ woahbase/alpine-ssh:latest │         │ 3fff:172:20:20::5 │
╰──────────────────┴────────────────────────────┴─────────┴───────────────────╯

立ち上がりました!

ところで、立ち上げた際に出てくるコンテナの一覧表は、立ち上げ時以外にも参照したいことがありますよね。
以下コマンドで表示できます。

$ sudo containerlab inspect

# output
08:45:44 INFO Parsing & checking topology file=topology.clab.yaml
╭──────────────────┬────────────────────────────┬─────────┬───────────────────╮
│       Name       │         Kind/Image         │  State  │   IPv4/6 Address  │
├──────────────────┼────────────────────────────┼─────────┼───────────────────┤
│ clab-ceos-ceos01 │ ceos                       │ running │ 172.20.20.2       │
│                  │ ceos:4.32.5.1M             │         │ 3fff:172:20:20::2 │
├──────────────────┼────────────────────────────┼─────────┼───────────────────┤
│ clab-ceos-ceos02 │ ceos                       │ running │ 172.20.20.6       │
│                  │ ceos:4.32.5.1M             │         │ 3fff:172:20:20::6 │
├──────────────────┼────────────────────────────┼─────────┼───────────────────┤
│ clab-ceos-ceos03 │ ceos                       │ running │ 172.20.20.3       │
│                  │ ceos:4.32.5.1M             │         │ 3fff:172:20:20::3 │
├──────────────────┼────────────────────────────┼─────────┼───────────────────┤
│ clab-ceos-sv1    │ linux                      │ running │ 172.20.20.4       │
│                  │ woahbase/alpine-ssh:latest │         │ 3fff:172:20:20::4 │
├──────────────────┼────────────────────────────┼─────────┼───────────────────┤
│ clab-ceos-sv2    │ linux                      │ running │ 172.20.20.5       │
│                  │ woahbase/alpine-ssh:latest │         │ 3fff:172:20:20::5 │
╰──────────────────┴────────────────────────────┴─────────┴───────────────────╯

正常性確認


では、正常性確認してみます。
Ansibleで一網打尽にしたい作業ですが、Ansibleの登場は次回です。

少し本題からは逸れますが、sshコマンドで接続機器に直接コマンドを実行する方法を紹介します。
どういうことかというと、sshで機器にloginした後に接続先のshellで対話的にコマンドを実行するのではなく、1行のコマンド(1liner)で対象機器に接続し、さらに接続先のOS上でコマンドも実行してその結果を取得します。
(そんなの常識でしょ!という方すみません。意外にも知られていないという認識を私は持っています。)

# helpを表示
$ ssh

# output
usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface] [-b bind_address]
           [-c cipher_spec] [-D [bind_address:]port] [-E log_file]
           [-e escape_char] [-F configfile] [-I pkcs11] [-i identity_file]
           [-J destination] [-L address] [-l login_name] [-m mac_spec]
           [-O ctl_cmd] [-o option] [-P tag] [-p port] [-R address]
           [-S ctl_path] [-W host:port] [-w local_tun[:remote_tun]]
           destination [command [argument ...]]   <= ここです
       ssh [-Q query_option]

つまり、こういうことが可能です

$ ssh alpine@clab-ceos-sv1 'pwd && hostname'

# output
Warning: Permanently added 'clab-ceos-sv1' (ED25519) to the list of known hosts.
alpine@clab-ceos-sv1's password: 
/home/alpine  <= pwdの出力
sv1  <= hostnameの出力

SSHしてpasswordを打つのも手間なので、sshpassをinstallします。

$ sudo apt-get install -y ssh-pass
# sshpassは -p オプションでpasswordを渡すことができます
$ sshpass -p password ssh alpine@clab-ceos-sv1 'pwd && hostname'

# promptによるpassword入力を省略できました。
Warning: Permanently added 'clab-ceos-sv1' (ED25519) to the list of known hosts.
/home/alpine
sv1

linuxサーバでは"&&"でコマンドをつなぎましたが、ceosではrunコマンドの後に複数コマンドをセミコロンでつないで実行できます。

# enableで昇格してからshow vrrp briefを1linerで実行します。
$ sshpass -p admin ssh admin@clab-ceos-ceos01 run 'enable; show vrrp brief'

# output
Warning: Permanently added 'clab-ceos-ceos01' (ED25519) to the list of known hosts.
>enable
#show vrrp brief
Interface VRF        ID  Ver Pri Time  State  Last Transition     VR IP Addresses 
--------- ---------- --- --- --- ----- ------ ------------------- ---------------
Vl10      default    10  2   110 3570  Master 02:22:15 ago        10.0.10.1       
Vl20      default    20  2   110 3570  Master 02:22:15 ago        10.0.20.1   

以上、Ansibleが利用できないような環境でも、コマンド実行の省力化はそこそこできます、という紹介でした。

それでは、1linerでどんどん正常性確認をしていきます。
長いので流し読みで結構です!

# ceos01

$ sshpass -p admin ssh admin@clab-ceos-ceos01 run 'enable; show interfaces status; show vlan; show ip interface brief; show vrrp brief'

# output
Warning: Permanently added 'clab-ceos-ceos01' (ED25519) to the list of known hosts.
>enable
#show interfaces status
Port       Name   Status       Vlan     Duplex Speed  Type            Flags Encapsulation
Et1               connected    trunk    full   1G     EbraTestPhyPort                   
Ma0               connected    routed   a-full a-1G   10/100/1000                       

#show vlan
VLAN  Name                             Status    Ports
----- -------------------------------- --------- -------------------------------
1     default                          active    
10    VLAN0010                         active    Cpu, Et1
20    VLAN0020                         active    Cpu, Et1

#show ip interface brief
                                                                              Address
Interface         IP Address           Status       Protocol           MTU    Owner  
----------------- -------------------- ------------ -------------- ---------- -------
Management0       172.20.20.5/24       up           up                1500           
Vlan10            10.0.10.2/24         up           up                1500           
Vlan20            10.0.20.2/24         up           up                1500           

#show vrrp brief
Interface VRF        ID  Ver Pri Time  State  Last Transition     VR IP Addresses 
--------- ---------- --- --- --- ----- ------ ------------------- ---------------
Vl10      default    10  2   110 3570  Master 01:03:21 ago        10.0.10.1       
Vl20      default    20  2   110 3570  Master 01:03:21 ago        10.0.20.1       
Connection to clab-ceos-ceos01 closed.
# ceos02

$ sshpass -p admin ssh -t admin@clab-ceos-ceos02 run 'enable; show interfaces status; show vlan; show ip interface brief; show vrrp brief'
Warning: Permanently added 'clab-ceos-ceos02' (ED25519) to the list of known hosts.
>enable
#show interfaces status
Port       Name   Status       Vlan     Duplex Speed  Type            Flags Encapsulation
Et1               connected    trunk    full   1G     EbraTestPhyPort                   
Ma0               connected    routed   a-full a-1G   10/100/1000                       

#show vlan
VLAN  Name                             Status    Ports
----- -------------------------------- --------- -------------------------------
1     default                          active    
10    VLAN0010                         active    Cpu, Et1
20    VLAN0020                         active    Cpu, Et1

#show ip interface brief
                                                                              Address
Interface         IP Address           Status       Protocol           MTU    Owner  
----------------- -------------------- ------------ -------------- ---------- -------
Management0       172.20.20.2/24       up           up                1500           
Vlan10            10.0.10.3/24         up           up                1500           
Vlan20            10.0.20.3/24         up           up                1500           

#show vrrp brief
Interface VRF        ID  Ver Pri Time  State  Last Transition     VR IP Addresses 
--------- ---------- --- --- --- ----- ------ ------------------- ---------------
Vl10      default    10  2   100 3600  Backup 01:04:30 ago        10.0.10.1       
Vl20      default    20  2   100 3600  Backup 01:04:30 ago        10.0.20.1       
# ceos03

$ sshpass -p admin ssh -t admin@clab-ceos-ceos03 run 'enable; show interfaces status; show vlan'
Warning: Permanently added 'clab-ceos-ceos03' (ED25519) to the list of known hosts.
>enable
#show interfaces status
Port       Name   Status       Vlan     Duplex Speed  Type            Flags Encapsulation
Et1               connected    trunk    full   1G     EbraTestPhyPort                   
Et2               connected    trunk    full   1G     EbraTestPhyPort                   
Et3               connected    10       full   1G     EbraTestPhyPort                   
Et4               connected    20       full   1G     EbraTestPhyPort                   
Ma0               connected    routed   a-full a-1G   10/100/1000                       

#show vlan
VLAN  Name                             Status    Ports
----- -------------------------------- --------- -------------------------------
1     default                          active    
10    VLAN0010                         active    Et1, Et2, Et3
20    VLAN0020                         active    Et1, Et2, Et4

Connection to clab-ceos-ceos03 closed.
# sv1

$ sshpass -p password ssh alpine@clab-ceos-sv1 'echo \# ip route && ip route && echo \# ping && ping -c 3 10.0.20.254'
Warning: Permanently added 'clab-ceos-sv1' (ED25519) to the list of known hosts.
# ip route
default via 172.20.20.1 dev eth0 
10.0.10.0/24 dev eth1 scope link  src 10.0.10.254 
10.0.20.0/24 via 10.0.10.1 dev eth1 
172.20.20.0/24 dev eth0 scope link  src 172.20.20.4 
# ping
PING 10.0.20.254 (10.0.20.254): 56 data bytes
64 bytes from 10.0.20.254: seq=0 ttl=42 time=4.507 ms
64 bytes from 10.0.20.254: seq=1 ttl=42 time=4.214 ms
64 bytes from 10.0.20.254: seq=2 ttl=42 time=7.245 ms

--- 10.0.20.254 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 4.214/5.322/7.245 ms
# sv2

$ sshpass -p password ssh alpine@clab-ceos-sv2 'echo \# ip route && ip route && echo \# ping && ping -c 3 10.0.10.254'
Warning: Permanently added 'clab-ceos-sv2' (ED25519) to the list of known hosts.
# ip route
default via 172.20.20.1 dev eth0 
10.0.10.0/24 via 10.0.20.1 dev eth1 
10.0.20.0/24 dev eth1 scope link  src 10.0.20.254 
172.20.20.0/24 dev eth0 scope link  src 172.20.20.3 
# ping
PING 10.0.10.254 (10.0.10.254): 56 data bytes
64 bytes from 10.0.10.254: seq=0 ttl=42 time=8.693 ms
64 bytes from 10.0.10.254: seq=1 ttl=42 time=2.710 ms
64 bytes from 10.0.10.254: seq=2 ttl=42 time=3.097 ms

--- 10.0.10.254 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 2.710/4.833/8.693 ms
  • 使用している全てのportとinterface vlanがupしている。

  • ceosではvlanがアサイン通りである。

  • VRRPの状態は想定通り、ceos01がMaster, ceos02がBackupである。

  • 両方のserverでpingが返ってきてる。

ということで、正常性確認OKとしたいところですが、ネットワークエンジニアなら当然機器にconfigが正常に読み込まれているかも確認しますよね。
長いので他のコマンドとは分けて取得しました。
show startup-configとdiff startup-config running-configを実行し、
startup-configが無事読み込まれ、running-configと差分がない(=コマンド結果の出力がない)ことを確認します。

# ceos01

$ sshpass -p admin ssh -t admin@clab-ceos-ceos01 run 'enable; show startup-config; diff startup-config running-config'
Warning: Permanently added 'clab-ceos-ceos01' (ED25519) to the list of known hosts.
>enable
#show startup-config
! Command: show startup-config
! Startup-config last modified at Wed May 28 03:16:59 2025 by root
! device: ceos01 (cEOSLab, EOS-4.32.5.1M-41664474.43251M (engineering build))
!
no aaa root
!
username admin privilege 15 role network-admin secret sha512 $6$oUR9/lNktvPZkT.v$XuXwDgvWST3iaBssSX6SmfJQl9LwGO08R265WDEgKcgj3Dl/vHXhHeuBaD3VMphhsNwP07cISNW.AMf69WhGD1
!
no service interface inactive port-id allocation disabled
!
transceiver qsfp default-mode 4x10G
!
service routing protocols model multi-agent
!
hostname ceos01
!
spanning-tree mode mstp
!
system l1
   unsupported speed action error
   unsupported error-correction action error
!
vlan 10,20
!
interface Ethernet1
   switchport trunk allowed vlan 10,20
   switchport mode trunk
!
interface Management0
   ip address 172.20.20.5/24
   ipv6 address 3fff:172:20:20::5/64
!
interface Vlan10
   ip address 10.0.10.2/24
   vrrp 10 priority-level 110
   vrrp 10 ipv4 10.0.10.1
!
interface Vlan20
   ip address 10.0.20.2/24
   vrrp 20 priority-level 110
   vrrp 20 ipv4 10.0.20.1
!
ip routing
!
ip route 0.0.0.0/0 172.20.20.1
!
router multicast
   ipv4
      software-forwarding kernel
   !
   ipv6
      software-forwarding kernel
!
end
#diff startup-config running-config
Connection to clab-ceos-ceos01 closed.

# ceos02

$ sshpass -p admin ssh -t admin@clab-ceos-ceos02 run 'enable; show startup-config; diff startup-config running-config'
Warning: Permanently added 'clab-ceos-ceos02' (ED25519) to the list of known hosts.
>enable
#show startup-config
! Command: show startup-config
! Startup-config last modified at Wed May 28 03:16:56 2025 by root
! device: ceos02 (cEOSLab, EOS-4.32.5.1M-41664474.43251M (engineering build))
!
no aaa root
!
username admin privilege 15 role network-admin secret sha512 $6$9hR2vhfQPLF2qI0c$xxORVwBORp.G0cGAnnpbRDabAcBxRlpcsrdk9WbJorXtDclwv/uu.Eqbm0akGUI8zmmKvWBuF8e3u.ydHYHZ2.
!
no service interface inactive port-id allocation disabled
!
transceiver qsfp default-mode 4x10G
!
service routing protocols model multi-agent
!
hostname ceos02
!
spanning-tree mode mstp
!
system l1
   unsupported speed action error
   unsupported error-correction action error
!
vlan 10,20
!
interface Ethernet1
   switchport trunk allowed vlan 10,20
   switchport mode trunk
!
interface Management0
   ip address 172.20.20.3/24
   ipv6 address 3fff:172:20:20::3/64
!
interface Vlan10
   ip address 10.0.10.3/24
   vrrp 10 ipv4 10.0.10.1
!
interface Vlan20
   ip address 10.0.20.3/24
   vrrp 20 ipv4 10.0.20.1
!
ip routing
!
ip route 0.0.0.0/0 172.20.20.1
!
router multicast
   ipv4
      software-forwarding kernel
   !
   ipv6
      software-forwarding kernel
!
end
#diff startup-config running-config
Connection to clab-ceos-ceos02 closed.

# ceos03

$ sshpass -p admin ssh -t admin@clab-ceos-ceos03 run 'enable; show startup-config; diff startup-config running-config'
Warning: Permanently added 'clab-ceos-ceos03' (ED25519) to the list of known hosts.
>enable
#show startup-config
! Command: show startup-config
! Startup-config last modified at Wed May 28 03:16:59 2025 by root
! device: ceos03 (cEOSLab, EOS-4.32.5.1M-41664474.43251M (engineering build))
!
no aaa root
!
username admin privilege 15 role network-admin secret sha512 $6$owHyImW9A7YWzg0j$fbZmpuDAC.y06Oo/1UOOqsB0rBhl/tZsGMd/ujKYgfJjWf9qqTT2trEmXjPbCqkdBQkGcnvUpOaY/L/LmZQzG1
!
no service interface inactive port-id allocation disabled
!
transceiver qsfp default-mode 4x10G
!
service routing protocols model multi-agent
!
hostname ceos03
!
spanning-tree mode mstp
!
system l1
   unsupported speed action error
   unsupported error-correction action error
!
vlan 10,20
!
interface Ethernet1
   switchport trunk allowed vlan 10,20
   switchport mode trunk
!
interface Ethernet2
   switchport trunk allowed vlan 10,20
   switchport mode trunk
!
interface Ethernet3
   switchport access vlan 10
!
interface Ethernet4
   switchport access vlan 20
!
interface Management0
   ip address 172.20.20.6/24
   ipv6 address 3fff:172:20:20::6/64
!
ip routing
!
ip route 0.0.0.0/0 172.20.20.1
!
router multicast
   ipv4
      software-forwarding kernel
   !
   ipv6
      software-forwarding kernel
!
end
#diff startup-config running-config
Connection to clab-ceos-ceos03 closed.
containerlab@containerlab:~$ 

作成したstartup-configは無事読み込まれていました。
今回はここまでとします。

まとめ&次回予告


今回はcontainerlab上に、現実に存在しそうなネットワークを構築しました。
ネットワーク構成図(再掲)

次回はいよいよ、Ansibleでネットワーク機器を操作してみます。

お楽しみに!


執筆者プロフィール:小野 志峰
元々はネットワークエンジニアですが、性格がせっかちなことと凡ミスがとにかく多いので、 自動化に救済を求めAnsibleをよく使う人になりました。
SHIFTには2024年11月に入社。
好きなport番号はTCP443です。
仕事以外の趣味は音楽で、バンドをやっており、たくさん曲を作っています。
お酒もよく飲みます。

✉ この記事の執筆者へコメントを届けてみませんか?🖊
「役に立ちそう!」「参考になった!」「思考が整理できた」など
記事を読んだ感想をぜひコメント欄へお寄せください。
次回の執筆テーマの参考にさせていただきます!
ご質問も大歓迎です◎

✅IaC支援サービスのご紹介

SHIFTではTerraformやCDKを使ったクラウドインフラ構築の自動化や、Ansibleを使ったサーバOSの設定自動化や構成管理のご支援も行っております。
ご依頼・ご相談は下記リンクからお願いします。

✅SHIFTへのお問合せはお気軽に

SHIFTについて(コーポレートサイト)
https://www.shiftinc.jp/

SHIFTのサービスについて(サービスサイト)
https://service.shiftinc.jp/

SHIFTの導入事例
https://service.shiftinc.jp/case/

お役立ち資料はこちら
https://service.shiftinc.jp/resources/

SHIFTの採用情報はこちら
https://recruit.shiftinc.jp/career/

PHOTO:UnsplashKrzysztof Kowalik

最後まで読んでくださり、ありがとうございます! よろしければ記事の感想をお聞かせください。