• AnsibleとRead-Onlyで始めるネットワーク自動化

 
 
Print Friendly, PDF & Email

はじめに

ネットワーク自動化を始めるにあたり、ネットワーク機器へ直接変更や更新をかけるのではなく、Showコマンドや設定のバックアップなどから始めるのも良いかもしれません。Ansibleの自動化の例が多く公開されていますが、ここでは公開されている例から、Showコマンドだけを使うREAD-ONLYのネットワーク自動化の一部をご紹介します。

Showコマンドを使うREAD-ONLYな自動化の例として、一般的な設定のバックアップと、物理配線の状態を確認する方法をご紹介します。

設定のバックアップ

通常の運用で行なっているように、show running-configを取得し、ファイルに保存するところまでをAnsibleのPlaybookで行います。

物理配線の状態を確認

接続する配線情報をCSVで記載し、実機のshow lldp neighborsの出力と比較します。

環境の準備

ネットワーク構成

ここでは上の環境で行います。cEOS-labとDocker-topoを使い、5台のリーフ・スパイン構成を作っています。

サーバの環境構築

Githabで公開されているnetdevopsをクローンし、セットアップします。

$ git clone https://github.com/aristanetworks/netdevops-examples.git
# たくさん例がありますが、今回はemea-2020-ansible-cvp-auutomationをベースにします。
$ cd netdevops-examples/demo/emea-2020-ansible-cvp-automation/
$ pip install -r requirements.txt

また、Ansible Arista Validated Design(AVD) Collectrionをインストールします。

$ ansible-galaxy collection install arista.avd

環境に合わせ、inventoryファイル(IPアドレス、ユーザネーム、パスワード)を置き替えます。今回は構成のGroupはDC1_FABRICとします。その他のAnsible環境の設定は、例にある(ansible.cfg)をそのまま使います。

 
 $ vi inventory.yml
---
all:
  children:
    # DC1_Fabric - EVPN Fabric running in home lab
    DC1:
      children:
        DC1_FABRIC:
          hosts:
            Spine-1:
              ansible_host: localhost4.localdomain4
              ansible_httpapi_port: 9003
            Spine-2:
              ansible_host: localhost4
              ansible_httpapi_port: 9004
            Leaf-1:
              ansible_host: localhost.localdomain
              ansible_httpapi_port: 9000
            Leaf-2:
              ansible_host: localhost
              ansible_httpapi_port: 9001
            Leaf-3:
              ansible_host: localhost4.localdomain
              ansible_httpapi_port: 9002
          vars:
            ansible_connection: httpapi
            ansible_network_os: eos
            ansible_user: ansible
            ansible_httpapi_pass: ansible
            ansible_become: true
            ansible_become_method: enable
            ansible_httpapi_use_ssl: true
            ansible_httpapi_validate_certs: false

InventoryファイルのTreeを確認します。

$ ansible-inventory --graph
@all:
  |--@DC1:
  |  |--@DC1_FABRIC:
  |  |  |--Leaf-1
  |  |  |--Leaf-2
  |  |  |--Leaf-3
  |  |  |--Spine-1
  |  |  |--Spine-2
  |--@ungrouped:

設定のバックアップ

各機器のshow running-configをホスト名_running-config.confとして保存するPlaybookを作成します。

# あらかじめ保存用のディレクトリを作っておきます
$ mkdir backup
$ vi dc1-fabric-backup.yml

---
- name: backup
hosts: DC1_FABRIC

tasks:
- name: gather config
eos_command:
commands: "show running-config"
register: backup
- name: save file
copy:
content: "{{ backup.stdout[0]}}"
dest: "./backup/{{ inventory_hostname }}_running-config.conf"

実行すると、各機器名のファイルが作成されます。


期待通り、show running-configが取得できています。

物理配線の状態を確認

物理配線の状態確認を例にあるpost_validationを元に行います。Post Validationの中で、Topologyのテスト項目が入っています。今回はこのTopologyテストだけを取り出し、シンプルな物理配線の状態を確認します。このPost Validationでは、テストフレームワークとしてWARDとNetdiff Pythonモジュールを利用しています。

NETDIFF POST VALIDATION

NetdiffはシンプルなArista Validated Designのテストのフレームワークです。Netdiffでは次のデータソースを用います。
・各スイッチからのshowコマンドなどで取得する実環境の情報
・自動化ツールで生成したり、ユーザの提供する「意図したネットワーク」の情報
Netdiffモジュールでは、上記の「実際のネットワーク情報」と「意図したネットワーク情報」を比較します。
比較した結果をWARDのテストフレームワークで処理します。

まず、この例にあるスクリプトでは、Ward自身/Topology/BGP/CPU/Port-channel/MLAGの6つがテストされていますが、ここではシンプルにWard自身とTopologyだけ残し、他を削除します。

$ vi post_validation/tests/avd_cvp_demo/ward/test_ward_netdiff_for_avd.py

from ward import test, xfail
import netdiff

@test("Verify if Ward is working and can assert True")
def test_can_assert_true():
# before any test verify if PyTest is working and can assert True
assert True

@test("Verify if topology is correct, without servers") # based on 'lldp neighbors'
def test_if_topology_is_correct_without_servers(filename='topology_no_server.yml'):
current_data_aka_left, intended_data_aka_right = netdiff.process.test_data.for_yaml_diff(filename)
assert current_data_aka_left == intended_data_aka_right

また「実際のネットワーク情報」用として取得するデータも、必要な”show lldp neighbors”だけ残し、他を削除します。

$ vi post_validation/ansible/roles/eos_post_fabric_validation/defaults/main.yml 

---
# defaults file for eos_fabric_validation

fabric_validation_commands:
- command: "show lldp neighbors"
output: json

topology_csv_file: ./documentation/{{ fabric_name }}/{{ fabric_name }}-topology.csv
~

準備ができると、データを取得します。データの取得は、この例で提供されているPlaybookをそのまま利用します。

$ cat dc1-fabric-post-validation.yml 
---

- name: Post Validation
hosts: DC1_FABRIC
tasks:
- name: Collect required data to run post validation tests
import_role:
name: eos_post_fabric_validationemea-2020-ansible-cvp-automation

実行してみます。

取得したデータは、以下におかれます。

$ ls post_validation/state_outputs/
duts_state.json duts_state.yaml

次に「意図したネットワーク情報」を準備します。AVDでは、Topology情報もAnsibleで自動生成しますが、ここではTopoloty情報をネットワーク構成に沿ってCSVファイルで直接編集します。

$ vi documentation/DC1_FABRIC/DC1_FABRIC-topology.csv

Node Type,Node,Node Interface,Peer Type,Peer,Peer Interface
spine,Spine-1,Ethernet1,l3leaf,Leaf-1,Ethernet1
spine,Spine-1,Ethernet2,l3leaf,Leaf-2,Ethernet1
spine,Spine-1,Ethernet3,l3leaf,Leaf-3,Ethernet1
spine,Spine-2,Ethernet1,l3leaf,Leaf-1,Ethernet2
spine,Spine-2,Ethernet2,l3leaf,Leaf-2,Ethernet2
spine,Spine-2,Ethernet3,l3leaf,Leaf-3,Ethernet2
l3leaf,Leaf-1,Ethernet1,spine,Spine-1,Ethernet1
l3leaf,Leaf-1,Ethernet2,spine,Spine-2,Ethernet1
l3leaf,Leaf-2,Ethernet1,spine,Spine-1,Ethernet2
l3leaf,Leaf-2,Ethernet2,spine,Spine-2,Ethernet2
l3leaf,Leaf-3,Ethernet1,spine,Spine-1,Ethernet3
l3leaf,Leaf-3,Ethernet2,spine,Spine-2,Ethernet3

テストの実行は、「意図したネットワーク情報」と「実際のネットワーク情報」のデータ処理とWARDでNetdiffを実行します。このテスト実行シェルでも、BGPやMLAGなどの処理について削除しておきます。

$ vi ./post_validation/tests/avd_cvp_demo/run_ward.sh 

(各種環境変数などはそのまま利用し、Topology以外のBGP、CPU、MLAG、Port-channelのデータ処理の行を削除します)

######### BUILD INTENDED DATA ############
# build intended topology data
echo "-------- 1. Building Intended Data -----------------"
echo
echo "1.1 Building intended topology."
python3 ${AVD_PYMOD}/intended/topology.py -src=${TOPOLOGY_DOCUMENT} -dst=${INTENDED_DATA_DIR}/topology.yml -sfm csv -dfm yaml --case from_csv_doc
python3 ${AVD_PYMOD}/intended/topology.py -src=${TOPOLOGY_DOCUMENT} -dst=${INTENDED_DATA_DIR}/topology_no_server.yml -sfm csv -dfm yaml --case from_csv_doc_without_servers

######### BUILD CURRENT NETWORK STATE DATA ############
# build current topology data
echo "-------- 2. Building Current Data -----------------"
echo
echo "2.1 Building current topology."
python3 ${AVD_PYMOD}/current/topology.py -src=${DUT_STATE_JSON} -dst=${CURRENT_DATA_DIR}/topology.yml --src_format json --dst_format yaml --case from_dut
python3 ${AVD_PYMOD}/current/topology.py -src=${DUT_STATE_JSON} -dst=${CURRENT_DATA_DIR}/topology_no_server.yml --src_format json --dst_format yaml --case from_dut_no_localhost

######### RUN TESTS ############
export PATH="$( echo $PATH:$POST_VALIDATION_REPOSITORY_DIRECTORY )"
echo "-------- 3. Run Tests -----------------"
echo
echo "3.1 Run Ward tests."
cd ${TESTS_DIRECTORY}/avd_cvp_demo/ward
ward

以上で準備が完了となります。実際に配線の確認を実行してみます。

FAILした時に、どのような結果になるかみてます。差分を検出できるかを確認するために、FAILするように「意図したネットワーク情報」を変更します。

$ vi documentation/DC1_FABRIC/DC1_FABRIC-topology.csv

Node Type,Node,Node Interface,Peer Type,Peer,Peer Interface
spine,Spine-1,Ethernet4,l3leaf,Leaf-1,Ethernet1  ## Spine-1のEt1をEt4へ変更
spine,Spine-1,Ethernet2,l3leaf,Leaf-2,Ethernet1
spine,Spine-1,Ethernet3,l3leaf,Leaf-3,Ethernet1
spine,Spine-2,Ethernet1,l3leaf,Leaf-1,Ethernet2
spine,Spine-2,Ethernet2,l3leaf,Leaf-2,Ethernet2
spine,Spine-2,Ethernet3,l3leaf,Leaf-3,Ethernet2
l3leaf,Leaf-1,Ethernet1,spine,Spine-1,Ethernet4 ## Spine-1のEt1をEt4へ変更
l3leaf,Leaf-1,Ethernet2,spine,Spine-2,Ethernet1
l3leaf,Leaf-2,Ethernet1,spine,Spine-1,Ethernet2
l3leaf,Leaf-2,Ethernet2,spine,Spine-2,Ethernet2
l3leaf,Leaf-3,Ethernet1,spine,Spine-1,Ethernet3
l3leaf,Leaf-3,Ethernet2,spine,Spine-2,Ethernet3

では、再度実行し、差分を検出してみます。

上記のように期待通りFAILEDとなります。差分については、黄色の「実際のネットワーク情報」と赤色の「意図したネットワーク情報」で結果が表示されます。

最後に

ここではシンプルに設定バックアップと配線確認だけを見てみましたが、AVD全体ではEVPNファブリックの各機器設定の自動生成や自動ドキュメント化が含まれ、CVPとの連携とPre Validationや Post ValidationとしてBGP、MLAG、Port-Channelなどのチェックの例も提供されています。
Aristaでは、多くのネットワーク自動化例を公開しています。公開されている例から、シンプルなところからはじめ、段階的に自動化を進めていくことができます。

 

リファレンス

Follow

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

Join other followers: