• Ansible CVPモジュールを使って、簡単なネットワーク自動化メニューを作ってみる

 
 
Print Friendly, PDF & Email

本記事では、アリスタジャパンの検証用ラボで、我々アリスタのSEが実際に活用している設定変更の自動化の仕組みを紹介します。この仕組みでは、CVPのプログラマビリティとAnsibleを活用しています。
自動化ポータルと言っても様々なシステムがあると思いますが、ここでご紹介するのは、社内ラボでのエンジニア向けのコマンドベースのメニューを用意し、物理的には決まった配線の状態で、複数あるシナリオのコンフィグを自動で各機器にセットアップするポータルを構築します。

構成とシナリオ

今回検証用ラボの構成は用意するシナリオとして、以下を考えます。

・EVPN-VXLAN-MLAG (VXLAN MLAGを使ったEVPN)
・EVPN-Act-Act(EVPN Active-Active Multihoming)
・BGP-Unnumbered(RFC5549 IPv6 Link-local addressを使ったルーティング)
・EVPN-MPLS-SR(MPLS SRを使った構成)
・TapAgg(TapAggでの構成)
・FlexRoute(Internetフルルートのピアリング)
・Base(最低限の設定だけを入れたデフォルトの構成)
・SSHで各機器へのログイン

自動化メニューの概要

上記のシナリオの切り替えを簡単に行います。以下のような流れで作成します。
1. 予め各シナリオに沿った各機器のコンフィグを準備
2. 各機器のコンフィグをConfigletとして、CVPへ登録
3. 各シナリオへの変更は、CVP上のConfigletを付け替える(Ansibleで行う)
4. メニューは、シェルスクリプトでSelect文を使い、各シナリオを選択

1. 予め各シナリオに沿った各機器のコンフィグを準備

シナリオに合わせて、各機器分作成します。今回物理構成や配線は変更しないので、このコンフィグ作成は手動で行います。コンフィグ自動生成は、特に今回は取りあげません。

2. 各機器のコンフィグをConfigletとして、CVPへ登録

各機器で最低限の設定だけを入れたコンフィグをBaseとして登録しておきます。各シナリオで使うコンフィグは、このBaseを含まない個別設定としてConfigletへ登録します。各シナリオに対し、各機器分のConfigletを準備します。

R5のBaseサンプル

daemon TerminAttr
   exec /usr/bin/TerminAttr -ingestgrpcurl=192.168.100.98:9910 -cvcompression=gzip -ingestauth=key,telemetry -smashexcludes=ale,flexCounter,hardware,kni,pulse,strata -ingestexclude=/Sysdb/cell/1/agent,/Sysdb/cell/2/agent -ingestvrf=default -taillogs -disableaaa
   no shutdown
daemon ocprometheus
   exec /mnt/flash/ocprometheus -config /mnt/flash/ocprometheus-7060.yml -addr localhost:6042
   no shutdown
hostname R5
interface Ethernet1/1,5/1
   speed forced 40gfull
interface Management1
   ip address 192.168.100.15/24

R5のEVPN-MLAGのサンプル

banner login
EVPN-MLAG
EOF
service routing protocols model multi-agent 
vlan 10,50
vlan 4094
trunk group MLAGPEER
vrf instance vrf50
interface Recirc-Channel17
   no switchport
   switchport recirculation features vxlan
interface Ethernet30/1
   traffic-loopback source system device mac
   channel-group recirculation 17
!
...

 

3. 各シナリオの変更は、CVP上のConfigletをAnsibleで付け替える

今回のケースでは、様々な設定が入った状態であっても、メニューで選択し、意図したコンフィグへ置き換えることを行います。CVPのChange-Controlオペレーションは、最終形を指定するだけの宣言的な手法であり、現状の設定と意図したコンフィグの差分だけが機器にアップデートされます。また、その差分についても、実際に削除されたコマンドと追加したコマンドがChange-Controlのログとして残されます。

今回の自動化では、Configletの付け替えを行います。現状の割り当てられているConfigletを確認し、不要なConfigletを削除し、意図したConfigletを紐づけるという操作となります。CVPではこうした操作をREST APIで行うことができますが、これら処理をPythonなどで確認、削除、追加を行うには煩雑となる為、Ansible Arista CVPモジュールを活用することにします。Ansible Arista CVPモジュールでは、Configletの付け替えに関し、さらに抽象化が高く、宣言的に指定するだけで目的の設定へ変更できます。

Ansible CVPモジュールのインストールは、ansible-galaxyコマンドで簡単に行えます。

$ ansible-galaxy collection install arista.cvp

inventory.ymlへCVPへのアクセス情報などを定義します。


[arista@localhost ~]$ cat ansible.cfg 
[defaults]
host_key_checking = False
inventory =./inventory.yml
ansible_httpapi_validate_certs = False
...

[arista@localhost ~]$ cat inventory.yml 
---
all:
  children:
    CVP:
      hosts:
        CloudVision:
          ansible_httpapi_host: {cvpのIP}
          ansible_host: {cvpのip}
          ansible_user: {cvpのユーザ}
          ansible_password: {cvpのパスワード}
          ansible_connection: httpapi
          ansible_httpapi_use_ssl: True
          ansible_httpapi_validate_certs: False
          ansible_network_os: eos
          ansible_httpapi_port: 443
 

各シナリオにConfigletを設定し、各デバイスへ適用するAnsibleプレイブックを準備します。各シナリオで指定するConfigletが異なるので、devices_inventory変数の中で指定することにします。Ansible CVPモジュールの詳細はこちらをご覧ください。

[arista@localhost ~]$ cat lab.yml
---
  - name: Setup {{ play_name }} config
    hosts: CloudVision
    connection: local
    gather_facts: no

  tasks:
    - name: "Gather CVP facts {{inventory_hostname}}"
      arista.cvp.cv_facts:
      facts:
        - devices
        - configlets
      register: CVP_FACTS

  - name: "Configure devices on {{inventory_hostname}}"
    arista.cvp.cv_device:
      devices: "{{devices_inventory}}"
      cvp_facts: '{{CVP_FACTS.ansible_facts}}'
    register: CVP_DEVICES_RESULTS

  - name: 'Execute pending tasks and wait for completion for 60 seconds'
    arista.cvp.cv_task:
      tasks: "{{CVP_DEVICES_RESULTS.data.tasks}}"
      wait: 60

EVPN-MLAG用のdevices_inventory変数は、以下のように機器毎に使用するConfigletを定義することができます。

[arista@localhost ~]$ cat evpn-mlag.yml
play_name: EVPN_MLAG
devices_inventory:
  R1:
    name: R1
    parentContainerName: lab
    configlets:
      - R1-Base
      - EVPN-MLAG-R1
  R2:
    name: R2
    parentContainerName: lab
    configlets:
      - R2-Base
      - EVPN-MLAG-R2
  R3:
    name: R3
    parentContainerName: lab
    configlets:
      - R3-Base
      - EVPN-MLAG-R3
  R4:
    name: R4
    parentContainerName: lab
    configlets:
      - R4-Base
      - EVPN-MLAG-R4
  R5:
    name: R5
    parentContainerName: lab
    configlets:
      - R5-Base
      - EVPN-MLAG-R5
  R6:
    name: R6
    parentContainerName: lab
    configlets:
      - R6-Base
      - EVPN-MLAG-R6
  HOST1:
    name: HOST1
    parentContainerName: lab
    configlets:
      - HOST1-Base
      - EVPN-MLAG-HOST1
  HOST2:
    name: HOST2
    parentContainerName: lab
    configlets:
      - HOST2-Base
      - EVPN-MLAG-HOST2

4. メニューはシェルスクリプトでSelect文を用いて、各シナリオを選択

本システムはエンジニア向けなので、ポータルのメニューとしてはSSHログインからテキストベースとします。LinuxのBashでselect文を使い、構成します。Select分では、Ansibleの変数を指定するだけの単純な書式とすることができます。

[arista@localhost ~]$ cat menu.sh
#!/bin/bash
echo " Please select number (1-9):"
#1) EVPN-MLAG
#2) EVPN-Act-Act
#3) BGP-unnumbered
#4) EVPN-MPLS-SR
#5) TapAgg
#6) FlexRoute
#7) ssh
#8) Base
#9) exit
select VAR in EVPN-MLAG EVPN-Act-Act BGP-unnumbered EVPN-MPLS-SR TapAgg FlexRoute ssh Base exit
do
case $VAR in
  "EVPN-MLAG" ) ansible-playbook -e @evpn-mlag.yml lab.yml;;
  "EVPN-Act-Act" ) ansible-playbook -e @evpn-act.yml lab.yml;;
  "BGP-unnumbered" ) ansible-playbook -e @bgp-unnumbered.yml lab.yml;;
  "EVPN-MPLS-SR" ) ansible-playbook -e @mpls-sr.yml lab.yml;;
  "TapAgg" ) ansible-playbook -e @tapagg.yml lab.yml;;
  "FlexRoute" ) ansible-playbook -e @flexroute.yml lab.yml;;
  "ssh" ) ./ssh-menu.sh;;
  "Base" ) ansible-playbook -e @base.yml lab.yml;;
  "exit" ) break ;;
* ) echo "Your select is $REPLY."
esac
done

SSHアクセスのメニューも作っておきます。

[arista@localhost ~]$ cat ssh-menu.sh
#!/bin/bash
echo "Please select number (1-9):"
echo "R1=7050QX-32S, R2=7280CR2K, R3/R4=7060CX, R5/R6=7060CX2,HOST1=7280SE,HOST2=7160,R7=7150S"
select VAR in R1 R2 R3 R4 R5 R6 R7 HOST1 HOST2 exit
do
if [ "$VAR" = "exit" ]; then
  break
fi
ssh admin@$VAR
done

メニュースクリプトを.bashrcで定義しておき、ログイン時にメニューを表示できるようにします。

[arista@localhost ~]$ cat .bashrc
# .bashrc
...
# User specific aliases and functions
./menu.sh

実際にSSHでログインしてみると、メニューが表示されます。’1’を入力すると、自動的に全機器にEVPN-MLAGが設定されます。

~ $ ssh arista@192.168.100.111
arista@192.168.100.111's password:

Please select number (1-9):
1) EVPN-MLAG 4) EVPN-MPLS-SR 7) ssh
2) EVPN-Act-Act 5) TapAgg 8) Base
3) BGP-unnumbered 6) FlexRoute 9) exit
#?1

PLAY [Setup EVPN-MLAG config] **************************************************************
TASK [Gather CVP facts CloudVision] **************************************************************
ok: [CloudVision]

TASK [Configure devices on CloudVision] ***************************************************************
ok: [CloudVision]

TASK [Execute pending tasks and wait for completion for 60 seconds] *******************************************
ok: [CloudVision]

PLAY RECAP ****************************************************************
CloudVision : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
#? 9
[arista@localhost ~]$

最後に

「検証ラボのネットワーク設定を、検証内容に応じて変更する」といった、決まった作業を繰り返し行う場合には、CVPのAPIを用いた自動化が有効です。さらに、Ansibleモジュールを利用することで、面倒なワークフローをシンプルに記述することができます。今回ご紹介した仕組みを取り入れることで、アリスタジャパンの検証ラボでは、例えばEVPN VXLANの検証環境を、わずか1分たらずで、MPLS SRの検証環境へと設定変更をすることができます。みなさまの日々のネットワーク運用においても、決まった作業を繰り返し行うようなところから、自動化の導入を検討されてみてはいかがでしょうか。

参照

Ansible CVPモジュール:https://github.com/aristanetworks/ansible-cvp

 

 

Follow

Get every new post on this blog delivered to your Inbox.

Join other followers: