catch-img

pyATS/Genieによるネットワーク構築作業の負荷軽減


目次[非表示]

  1. 1.はじめに
  2. 2.ネットワークエンジニアの些細な(?)悩み
  3. 3.作業ミス回避のために陥る悪循環
  4. 4.今も昔も変わらない手動オペレーション
  5. 5.悪循環を抜け出したい!
  6. 6.pyATSとは?
  7. 7.Genieとは?
  8. 8.Robot Frameworkとは?
  9. 9.pyATS / Genie / Robot Frameworkの準備
  10. 10.pyATS/Genie with Robot Frameworkを動かしてみる
  11. 11.pyATS/Genie with Robot Frameworkの利点
  12. 12.おわりに
    1. 12.1.参考URL
    2. 12.2.DevNet関連記事


はじめに

みなさんこんにちは。セールスエンジニアリング部の小堀と申します。
NOPセールスエンジニアリング部ではネットワークエンジニアのAPIやプログラマビリティへの対応力強化を注力テーマの一つとしています。今回は「CiscoルータやCatalystスイッチは設定できるけどプログラムは苦手」「ネットワーク構築作業を効率化したい」というネットワークエンジニアに最適なpyATSというツールをご紹介したいと思います。


ネットワークエンジニアの些細な(?)悩み

改めての自己紹介になりますが、私は前部署で"設計構築"のネットワークエンジニアをやっておりました。主にエンタープライズのお客様向けにCiscoSystems社CiscoルータやCatalystスイッチ、Aironet無線LANなどを設計構築していました。

※ネットワークエンジニアは大雑把に分けると「お客様の要望をもとにネットワーク構成を設計・構築」することが主業務の"設計構築"のエンジニアと、「構築されたネットワークを安定稼働させる」ことが主業務の"運用"のエンジニアに分かれます

その"設計構築"のネットワークエンジニアとしてたくさんのネットワーク構築の仕事をしていると、ある種の仕事を担当することがあります。例えば、

  • 数十~数百台のL2スイッチの起動状態やリンクエラー発生の有無をチェックする
  • 数十~数百台の既存ルータ機器にSNMPサーバのIPアドレスを追加登録する
  • スイッチ間での冗長プロトコル(LACP、VRRPなど)が設計通りに動作するか確認する

というような、「手順は単純だけど数が多い」タイプの作業です。

こういった作業の場合、あらかじめ作成した作業手順に従って設定を追加したりステータスを確認するのですが、数が多いため人為的な作業ミスが発生しやすくなります。例えば、

  • 間違って機器A用のコンフィグを機器Bに設定してしまった
  • 設定を投入し忘れてしまった
  • ファイルを上書きしてしまったためステータス情報を保存し損ねた

というような作業ミスです。


作業ミス回避のために陥る悪循環

こういった作業ミスに対しての防止策として、

  • 作業手順書を誰が見ても間違えないように作り直す
  • チェックシートを作り、抜け・漏れの発生を防止する
  • 2名一組で作業にあたり、ペアで手順を確認しながら作業を行う
  • 事後ファイルのダブルチェックを行う

というような対策をとることがあります。

こうした流れの中で「本来の作業手順は単純なはずなのに、想定していたよりも膨大な準備が必要になってしまった」という状況が生まれてしまいます。

手間をかけて準備しても当日作業でミスが出て、さらにそのやり直しのためにさらに細かくチェックシートを作り直し、ダブルチェックを何度も繰り返し、集中力のなくなった状態で作った資料でまた作業ミスが出て....という負のスパイラルに陥ってしまいます。


今も昔も変わらない手動オペレーション

この問題の根っこにあるのは「手作業で対応」ということです。

CiscoルータやCatalystスイッチなどはCLIでコマンドを入力して操作する方式が一般的です。これらの製品が世に出てから20年以上立ちますが、昔も今も変わりません。GUIや管理ツールで操作する方法もありますが現場ではCLIで操作するエンジニアのほうが圧倒的に多いと思います。

もちろん今ではNETCONF/YANGでの操作・運用や、Ansibleなどの構成管理ツールなどが利用できるということは知識として把握しているエンジニアも多いと思いますが、日々の多忙な業務の中であえて新しいAnsibleの使い方を勉強をして試行錯誤するよりも、確実に実行できる使い慣れたコマンドラインでの操作を選んでしまうのだと思います。

またお客様の環境は一つ一つ違うため、作業手順やテスト内容などは都度カスタマイズしています。ですので他のお客様や環境で万全だった作業手順やテスト内容であったとしても完全に使いまわすこともできず、経験をもとにブラッシュアップしていくしかないのが現状です。


悪循環を抜け出したい!

前述のような作業ミスが起こりやすいのも、それをケアするための準備負荷が高くなってしまうのも、「使いまわしの出来ない手順」を「手動で行っているため」とも言えます。私自身もこのような悪循環を何度も経験して、逆に「使いまわせる手順」を「自動」で行うことができれば、精度の高い作業と省力化 の両方ができるのではないか?もっと簡単で確実に省力化できる手段はないか?という悩みをずっと持っていました。

そんな漠然とした悩みですが、偶然にも解決策となりうるツールを見つけました。それが今回ご紹介する pyATS です。


pyATSとは?

自動化、AutomationといったキーワードでDevNetのサイトを眺めていた時にたまたま目に入りそこから詳しく調べてみました。pyATS は"パイエーティーエス”と読みます。「Pythonで書かれた Automated Test System」の略で、Ciscoの開発部門のテスト工程で使われていたフレームワークだそうです。それがオープンソースとなり2017年から一般に公開されています。
pyATSはpythonでコードを書くことにより以下のようなテストの実行・結果レポートを行ってくれる、というものです。

  1. 対象機器に接続
  2. 何らかの設定パラメータを投入
  3. ログを採取
  4. ログの比較・レポート
  5. 対象機器からの切断

これをすべて手動でやろうとすると、Telnet/SSHでCisco機器に接続して、conf tで設定コマンドを投入して、showコマンドでステータスを取得して、Diffツールで比較して.....という多くの手間をかけることになります。これをまとめて自動で行ってくれるということであれば大幅な作業の省力化が期待できます。

Genieとは?

さらに pyATSには Genieというライブラリがあります。
GenieとはpyATSの機能ライブラリで「pyATSをより簡単便利に使えるようにするコマンド群」です。例えば、

  • parse...特定のshowコマンドの結果を構造化して保存する
  • learn...関連するshowコマンド全部取得してparseする
  • diff....learnで取得した2つのsnapshotファイルを比較して差分をレポートする

というようなことが可能です。genie learn でOSPFを指定した場合、

  • show ip ospf interface
  • show ip ospf neighbor detail
  • show ip ospf database summary
  • show ip ospf database network 

など、OSPFに関係あるコマンドの結果を一通り採取して、さらにそれをJSON形式に直してくれます。しかも IOS・IOS-XEだけでなく、NX-OSの機器に対しても自動的に解釈してNX-OSのコマンドに直して結果を採取することが可能です。

Robot Frameworkとは?

さらにさらに、pyATS/Genieは Robot Frameworkで動作させることができます。
Robot Frameworkもテスト自動化のフレームワークですが、Ciscoに限らず汎用的なものです。
特定の手順に限られますが、プログラムの中身はほとんど定型文で記述することができ、対象の機器や実施したいpyATS/Genieコマンドをキーワードで指定するだけでプログラムを作成することができます。

しかもHTMLファイルでレポートを生成することもできるようで、それも構築作業時には役立つに違いありません。(以下の図はRobot Framework ユーザガイド で例として挙げられている図表を引用しました)


pyATSではpythonでコードを書かなければいけない、というところがプログラム言語に疎い私としては高いハードルでしたが、GenieやRobot Frameworkを介在させることで自分でも使えるのでは..? と感じるようになりました。


pyATS / Genie / Robot Frameworkの準備

ということで実際に試してみました。テストシナリオは以下の通りです。

  1. 作業前のログを採取する
  2. 特定のポートをshutdownする
  3. 作業後のログを採取する
  4. 作業前後のログを比較する

対象は弊社検証環境にあるCatalyst9200 1台です。同じく検証環境にあるCentOSに Python、pyATS、genieライブラリ、Robot framework をインストールしてあります。


その他に用意するものは、対象機器Catalyst9200のIPアドレスやログインクレデンシャルを記載したtestbedと呼ばれるYAML形式のファイルと、Robotファイルと呼ばれる「どんな処理をするか」が記載されたファイルです。

testbedファイルは以下のようなフォーマットで記述します(sampletb.yml)。

# ===============================================
# sampletb.yml
# ===============================================
devices:
  C9200L-3:
    connections:
      cli:
        ip: 10.1.1.1
        protocol: ssh
    credentials:
      default:
        password: HOGEHOGE
        username: nop
      enable:
        password: HOGEHOGE
    os: iosxe
    type: iosxe

作業前のログを採取するためのRobotファイル(before.robot)と、作業後のログを採取するためのRobotファイル(after.robot)を作成します。

# ===============================================
# before.robot
# ===============================================
# Take Initial snapshot of the operational state of the device
# and save the output to a file

*** Settings ***
# Importing test libraries, resource files and variable files.
Library        genie.libs.robot.GenieRobot
Library        pyats.robot.pyATSRobot

*** Variables ***
# Define the pyATS testbed file to use for this run
${testbed}     sampletb.yml

*** Test Cases ***
# Creating test cases from available keywords.

Connect
  # Initializes the pyATS/Genie Testbed
  use genie testbed "${testbed}"

  # Connect to both device
  connect to device "C9200L-3"

NTP Verification
 Verify NTP is synchronized on device "C9200L-3"

Profile the devices
    Profile the system for "config;interface;vrf;vlan" on devices "C9200L-3" as "./before.log"

after.robotには「作業援護のログを比較する」ための命令文が含まれています(Compare snapshot)。それ以外のパートはbefore.robotとほぼ同じです。

# =============================================== 
# after.robot 
# ===============================================
# Take Initial snapshot of the operational state of the device
# and save the output to a file

*** Settings ***
# Importing test libraries, resource files and variable files.
Library        genie.libs.robot.GenieRobot
Library        pyats.robot.pyATSRobot

*** Variables ***
# Define the pyATS testbed file to use for this run
${testbed}     sampletb.yml

*** Test Cases ***
# Creating test cases from available keywords.

Connect
    # Initializes the pyATS/Genie Testbed
    use genie testbed "${testbed}"

    # Connect to both device
    connect to device "C9200L-3"

NTP Veridation
    Verify NTP is synchronized on device "C9200L-3"

Profile the devices
    Profile the system for "config;interface;vrf;vlan" on devices "C9200L-3" as "./after"

Compare snapshots
    Compare profile "./before" with "./after" on devices "C9200L-3"


pyATS/Genie with Robot Frameworkを動かしてみる

まず before.robot を動かします。この処理では"C9200L-3"という機器にアクセスし、NTPがシンクロされているかの確認を行った後、 config関連、interface関連、vrf関連、vlan関連の情報を採取し -outputdir で指定したディレクトリにアウトプットを格納する、という動きをします。

$ robot --outputdir beforedir before.robot

Enterキーを押してコマンドを走らせると画面上に以下のような出力があり、robotファイルのTestcaseセクションで定義した順に実行結果(PASS)が表示され、指定したディレクトリに3つのアウトプットが生成されていることがわかります。

==============================================================================
before
==============================================================================
[ WARN ] Could not load the Datafile correctly
Connect                                                               | PASS |
------------------------------------------------------------------------------
NTP Verification                                                      | PASS |
------------------------------------------------------------------------------
Profile the devices                                                   | PASS |
------------------------------------------------------------------------------
before                                                                | PASS |
3 critical tests, 3 passed, 0 failed
3 tests total, 3 passed, 0 failed
==============================================================================
Output:  /home/nop/work01/beforedir/output.xml
Log:     /home/nop/work01/beforedir/log.html
Report:  /home/nop/work01/beforedir/report.html

ここで生成されたreport.htmlをwebブラウザで見てみると、以下のように緑色の画面が表示されます。robotファイルのTestcaseセクションで定義した内容をクリックすると詳細情報を見ることもできます。


次に検証機のCatalyst9200LのGigabit Ethernet1/0/5をシャットダウンしてみます。これによってどのような結果アウトプットが得られるのか見てみましょう。


ポートをシャットダウンした後、after.robotを動かします。

$ robot --outputdir afterdir after.robot

before.robotを動かしたときとちょっと異なる画面が表示されました。Compare snapshotsの項で実行結果がFAILになっています。これはbefore.robotを動かして得られたsnapshotとafter.robotを動かして得られたsnapshotを比較して、差分があったことを示しています。そして差分についての詳細が出力されています。

  • config.... shutdown行が増えている
  • interface...chars_inやchars_out、duplex_modeやoper_statusに違いがある
==============================================================================
after
==============================================================================
[ WARN ] Could not load the Datafile correctly
Connect                                                               | PASS |
------------------------------------------------------------------------------
NTP Verification                                                      | PASS |
------------------------------------------------------------------------------
Profile the devices                                                   | PASS |
------------------------------------------------------------------------------
Compare snapshots                                                     | FAIL |
**********
Comparison between ./before and ./after is different for feature 'config' for device:

'C9200L-3'
interface GigabitEthernet1/0/5
+ shutdown
(snip)
**********
Comparison between ./before and ./after is different for feature 'interface' for device:

'C9200L-3'
info:
 GigabitEthernet1/0/5:
-  accounting:
-   cdp:
-    chars_in: 2533536
-    chars_out: 2471512
-    pkts_in: 5556
-    pkts_out: 5554
-   other:
-    chars_in: 0
-    chars_out: 1798380
-    pkts_in: 0
-    pkts_out: 29973
+  duplex_mode: auto
-  duplex_mode: full
+  enabled: False
-  enabled: True
+  oper_status: down
-  oper_status: up
+  port_speed: auto
-  port_speed: 1000mb/s
(snip)
------------------------------------------------------------------------------
after                                                                 | FAIL |
4 critical tests, 3 passed, 1 failed
4 tests total, 3 passed, 1 failed
==============================================================================
Output:  /home/nop/work01/after/output.xml
Log:     /home/nop/work01/after/log.html
Report:  /home/nop/work01/after/report.html

そしてafter.robotで生成されたreport.htmlをwebブラウザで見てみると、beforeと異なり以下のように赤色背景の画面が表示されます。実行結果にFAILを含んでいるため赤色背景になっています。これによって一目で違いがあることを判断できます。


pyATS/Genie with Robot Frameworkの利点

このpyATS/Genie with Robot Frameworkを使えば、構築作業・テスト作業でのステータス確認、ログ採取 & 比較 を自動化することができます。これによりいくつものメリットが考えられます。

  • 作業員の熟練度に依存せずステータス確認ができる
  • 一定の時間で定型的にログ採取ができる
  • タイムスタンプ付きのログファイルを作業証跡として残すことができ、HTMLファイルで見やすく提供することができる
  • ファイルの上書きや、ログ採取忘れなどの手作業での作業ミスがなくなる


おわりに

今回ご紹介した通り、pyATS/GenieをRobot Frameworkと合わせて動かすことで、pythonやプログラムの知識が乏しくとも自動化・効率化を実現することができます。

冗長テスト時のルーティングの差分や Etherchannelのリンクダウン差分の確認など、「使いまわしのできる手段」としてネットワーク構築時のいろいろなケースで使えるのではないかと思います。もちろんネットワーク運用においても定期的に差分を取りエラーが生じてないか、意図しないリンクダウンが発生していないかなどを確認するためのツールとしても使えると思います。

pyATS/Genieはネットワークエンジニアの中でもまだあまり知られていませんが、ネットワークエンジニアの負荷を減らすことができるツールとして試してみる価値はあると思います。

今回紹介した内容はDevNetのサイトに詳しくまとめられています。pyATSのインストールから丁寧に順を追って解説されているので興味のある方はご一読されることをお勧めいたします。


参考URL

Accelerating your DevOps with pyATS & Genie - Cisco DevNet

Introduction to pyATS  (DevNet Learning Lab)

Cisco Live! DEVWKS-2595: Stateful Network Validation using pyATS/Genie

CCIEおじさん日記 (CiscoのpyATS開発チームで活躍されている日本人社員のブログ)


DevNet関連記事

  Cisco Innovation Challengeにチャレンジ! NOP SE部ではAPIやプログラマビリティへの対応力強化を注力テーマの一つとしています。 その取り組みの一つとして Cisco Innovation Challenge 2020 への参加をいたしました。 そこで我々が作り上げた応募作品をご紹介したいと思います。 ネットワンパートナーズ株式会社ブログサイト
  無線LAN・セキュリティ製品のAPI活用事例のご紹介 弊社セールスエンジニアリング部が取り組んでいるAPIを使った無線LAN製品・セキュリティ製品の便利な使い方のご紹介です。 社内検証などで感じた「もう少しここが使いやすくなっているといいんだけどなぁ..」という部分をAPIで解決してみました。 工夫次第で使い方は広がりそうです! ネットワンパートナーズ株式会社ブログサイト
  これからのネットワークエンジニアに必要な武器とは?NOP DevNet取り組みのご紹介 近年のネットワーク製品の潮流は "APIを活用する" ことが前提になっています。でもそのAPIの仕組みってどうやって身につけているの? Pythonってどうやったら学べる?コンソールケーブルとTeraTermでCisco IOSと格闘しているネットワークエンジニアの皆さん、準備はできていますか? 今回は弊社セールスエンジニアリング部が行っているSE力向上の取り組みをご紹介したいと思います。 ネットワンパートナーズ株式会社ブログサイト




小堀 泰樹(こぼり たいじゅ)

小堀 泰樹(こぼり たいじゅ)

セールスエンジニアリング部所属でアカウントSEを担当しています。2018年にNOPに加わりました。ネットワークエンジニア歴20年。