ネットワーク検証自動化フレームワーク「RENAT」動かしてみたメモ
概要
皆さん、ネットワーク検証してますか?
検証自体は楽しいんですが、機器の貸し借り、ラックマウント、配線、検証結果報告書の作成などなど……検証にまつわるエトセトラのほうはちょっとめんどくさいですよね。
そんなネットワーク検証のめんどくささを軽減すべく生み出されたネットワーク検証自動化フレームワーク「RENAT」をいじってみました。ほんのちょっとだけ使い方が分かったので、忘れないうちに進捗を記録します。今回はいつにも増して内容の正確性に自信がないので悪しからず。
RENAT(A Robotframework Extension for Network Automated Testing)とは?
ROBOTなるソフトウェアテストフレームワークを、ネットワーク検証に応用したもの。NTTコミュニケーションズの方が開発したようで、私はその存在をNTT Communications Tech Conference #3(2018年)で知りました。
検証
今回やったこと
RENATを使って、vSRX4台で「show version and haiku」コマンドを実行して、ログを確認する。
VagrantでvSRX4台を立ち上げる
vSRX4台はVagrantで用意します。いつも id:akira6592 さん謹製のVagrantfileを拝借しています。
この記事のVagrantfileをそのまま実行するとCentOSのサーバーが立ちますが、私は該当箇所をコメントアウトして、ホストマシン(Ubuntu)からRENATを実行しています(READMEのコマンド例はCentOS)。
ログインユーザーを作成する
公開鍵認証だとちょっとめんどくさかったので、ものぐさして4台全てにパスワード認証のユーザーを作りました。
$ vagrant ssh vsrx1 % cli $ configure # set system login user shino class super-user authentication plain-text-password ※パスワード入力(2回) # show | compare # commit
リポジトリをクローンする
$ git clone https://github.com/bachng2017/RENAT.git
グローバル設定ファイルを編集する
マニュアル曰く、configディレクトリ配下にあるファイルはグローバル設定ファイル(global configuration filesもしくはmaster files)と呼ばれ、全プロジェクト/全テストケースで共通に参照される設定が記されています。今回はそのうちのdevice.yaml、template.yamlおよびauth.yamlを編集していきます。
device.yaml
検証で使用する機器情報を保持するファイルです。以下を追記しました。
# vsrx vsrx1: type: juniper-vagrant-ssh description: vsrx by Vagrant ip: 127.0.0.1 port: 2201 vsrx2: type: juniper-vagrant-ssh description: vsrx by Vagrant ip: 127.0.0.1 port: 2202 vsrx3: type: juniper-vagrant-ssh description: vsrx by Vagrant ip: 127.0.0.1 port: 2203 vsrx4: type: juniper-vagrant-ssh description: vsrx by Vagrant ip: 127.0.0.1 port: 2204
template.yaml
ホストの種別と種別ごとのアクセス方法や認証方法を設定するファイルです。device.yamlで「type」として指定した、「juniper-vagrant-ssh」を定義します。「prompt」はCLIプロンプト、「init」はログイン時に必ず実行するコマンドのリストです。
juniper-vagrant-ssh: access: ssh auth: plain-text profile: vagrant prompt: "@.*(#|>) " init: - set cli idle-timeout 0 - set cli screen-length 0
auth.yaml
ユーザー名やパスワードなどの認証情報を設定するファイルです。template.yamlで「profile」として指定した「vagrant」を定義します。もちろん公開鍵認証も可能ですが、今回はパスワード認証にしました。
auth: plain-text: <snip> vagrant: user: shino pass: P@ssw0rd!
環境変数RENAT_PATHを設定する
テストケース実行時にグローバル設定ファイルの格納場所を知るためなどに必要な環境変数です。sampleディレクトリ内を見てみると、各プロジェクト/ケースディレクトリ(後述)にrcファイルを置いてその中に$RENAT_PATHを書き、sourceで読み込むみたいなことをしているみたいです。
$ export RENAT_PATH="path/to/RENAT"
プロジェクトディレクトリを作る
複数のケースディレクトリをまとめたもの。tools/配下のproject.shを実行すると作られます。プロジェクトディレクトリに作成されるrun.shを実行すると、プロジェクトディレクトリ配下のケースを全て実行するっぽい……が、今回は試してないです。
$ $RENAT_PATH/tools/project.sh プロジェクト名
テストケースディレクトリを作る
個々のテストケースは1つのディレクトリに含まれた複数のファイルで表現されます(後述)。tools/item.shを実行すると作ってくれます。local.yamlを作るかどうか聞かれるのでYesと答えて、「vsrx1,vsrx2,vsrx3,vsrx4」を試験で使うノードに指定します。
$ $RENAT_PATH/tools/item.sh テストケース名
テストケースディレクトリ/config/local.yamlを編集する
こちらはグローバル設定ファイルに対してローカル設定ファイルと言うそうです。「Tag」は操作実行対象のより分けに使えるので、今回はLab Setup(テストケース実行時、最初に行われる処理。プロジェクトディレクトリ/lab.robotを参照)の対象となるようjuniperとinitのタグを付与しました。
$ cat config/local.yaml # -*- coding: utf-8 -*- # $Rev: 203 $ # $Ver: $ # $Date: 2017-04-19 10:14:50 +0900 (Wed, 19 Apr 2017) $ # $Author: $ # router, server setting node: vsrx1: device: vsrx1 snmp-polling: yes follow-remote-log: yes mib: tag: - juniper - init vsrx2: device: vsrx2 snmp-polling: yes follow-remote-log: yes mib: tag: - juniper - init vsrx3: device: vsrx3 snmp-polling: yes follow-remote-log: yes mib: tag: - juniper - init vsrx4: device: vsrx4 snmp-polling: yes follow-remote-log: yes mib: tag: - juniper - init
テストケースディレクトリ内のmain.robotを編集する
デフォルトのmain.robotを見ると、かろうじて「Router.Switchで操作対象の機器を入れ替えてるんだろうな」「Router.Cmdで機器で実行するコマンドを指定するんだろうな」ぐらいのことが分かったので、直感に任せて編集します。
$ cat main.robot # -*- coding: utf-8 -*- # $Date: 2018-03-20 00:33:18 +0900 (Tue, 20 Mar 2018) $ # $Rev: 822 $ # $Ver: $ # $Author: $ # Basic setting *** Setting *** Documentation Get configuration files Metadata Log File [.|${CURDIR}/result] Suite Setup Lab Setup Suite Teardown Lab Teardown # Common setting Resource lab.robot # Variable setting *** Variables *** *** Test Cases *** 01. Get configuration: Router.Switch vsrx1 Router.Cmd show version and haiku 02. Get configuration: Router.Switch vsrx2 Router.Cmd show version and haiku 03. Get configuration: Router.Switch vsrx3 Router.Cmd show version and haiku 04. Get configuration: Router.Switch vsrx4 Router.Cmd show version and haiku
テストケースディレクトリ内のrun.shを実行する
$ ./run.sh Current RENAT path: /home/shino/work/test-renat/RENAT ### Current folder is /home/shino/work/test-renat/RENAT/test/test-project-01/case-01 ### Run only once Run: 001 Current local.yaml: /home/shino/work/test-renat/RENAT/test/test-project-01/case-01/config/local.yaml Loaded extra library `Hypervisor` ============================================================================== case-01 :: Get configuration files ============================================================================== RENAT Ver:: RENAT 0.1.14 ------------------------------------------------------------------------------ README: Write you readme file here ------------------------------------------------------------------------------ 00. Lab Setup ------------------------------------------------------------------------------ 01. Get configuration: | PASS | ------------------------------------------------------------------------------ 02. Get configuration: | PASS | ------------------------------------------------------------------------------ 03. Get configuration: | PASS | ------------------------------------------------------------------------------ 04. Get configuration: | PASS | ------------------------------------------------------------------------------ 99. Lab Teardown ------------------------------------------------------------------------------ case-01 :: Get configuration files | PASS | 4 critical tests, 4 passed, 0 failed 4 tests total, 4 passed, 0 failed ============================================================================== Output: /home/shino/work/test-renat/RENAT/test/test-project-01/case-01/result/output.xml Log: /home/shino/work/test-renat/RENAT/test/test-project-01/case-01/result/log.html Report: /home/shino/work/test-renat/RENAT/test/test-project-01/case-01/result/report.html
HTMLのレポートを見る
ログに出力されている通り、デフォルトではテストケースディレクトリ/result/report.htmlとして保存されます。
素晴らしい……ExcelやPowerPointでの報告書作成とは近いうちにお別れだ……。
感想
自動テストの素晴らしさはいわずもがなですが、なんと言ってもレポートがいいです。
その他、まだまだ試したいことがたくさんあります:
- 機器ベンダーごとのライブラリの使用、作成(Router.Cmdでのコマンド直打ちだけじゃない)
- テスターやL1スイッチを使ったテスト(ケーブリングが不要になる!?)
- プロジェクトレベルでの一括テスト実行
- run.shを見るとrobotユーザーのsqliteで実行管理をしているようで、READMEに則って検証していきたい
日本語情報が少ない中で、こんな時間までよくがんばった。