More than 1 year has passed since last update.
RADKit + Python によるネットワーク機器操作の自動化
はじめに
これは、CiscoSystems 合同会社社員有志による AdventCalendar (2024年)の記事の一つです。
本サイトおよび対応するコメントにおいて表明される意見は、投稿者本人の個人的意見であり、シスコの意見ではありません。本サイトの内容は、情報の提供のみを目的として掲載されており、シスコや他の関係者による推奨や表明を目的としたものではありません。各利用者は、本 Web サイトへの掲載により、投稿、リンクその他の方法でアップロードした全ての情報の内容に対して全責任を負い、本 Web サイトの利用に関するあらゆる責任からシスコを免責することに同意したものとします。
やりたいこと
この記事では、CiscoSystems が無料で提供しているトラブルシューティングツールである「 RADKit 」と Python スクリプトを使用して、遠隔から一部操作の自動化を目指します。RADKit の概要は下記記事をご覧ください。仕組みとしては、クラウド上に中間サーバ (RADKit Connector) があり、そちらへ RADKit Service / Client が TLS 接続を確立して、End-to-End でのアクセス経路を作り出すものとなります。サーバ/ストレージディスクが壊れたらサポートへ自動通知するといったサービスが他社ベンダー様にもあるかと思いますが、そのようなサービスと似たような仕組みになります。
この記事では、具体的に下記を実現してみます。
・RADKit を使って自宅からインターネット越しにミッドタウン東京 (CiscoSystems 合同会社の東京本社ビル) 内のラボにある Catalyst 8000v へリモートアクセスする。
・その上で、以下操作を行う Python スクリプトを作成し、一部操作の自動化を実装してみる。
- show tech の自動取得
- IOSd/IOS-XE 各プロセスの CPU / メモリ使用率のリアルタイムモニタリング
- インターフェースのリアルタイムモニタリング
ではやっていきましょう!
全体図
本記事の全体図は以下の通りとなります。
(RADKit Client の脇に置かれているのは、、、まさか酒・・??)
■ 機器リスト
・RADKit Client : Windows 11
・RADKit Service / Clients : Ubuntu 24.04.01
・Routers : Catalyst 8000v 17.12.4
Catalyst 8000v (以降 c8kv と表記) 間は BGP で経路交換をしています。(BGP を使っている理由は特にありません。使った方がなんとなくネットワークエンジニアっぽく見えるかなと)
また非現実的と理解していますが、RADKit Service (以降 service と表記) は c8kv のルーティングトラフィックが流れるインターフェース越しにアクセスする構成としています。(RADKit 利用における制限等によるものではありません。シンプルに mgmt 用ネットワークの作成をサボっただけ・・)
私の自宅に RADKit Client (以降 client と表記) がインストールされた端末があり、192.168.100.0 のネットワークに service が動作するサーバが設置されています。私の自宅のインターネットから service が動作するサーバを介して、各 c8kv へリモートアクセスする構成です。
段階をおって 1 つずつ環境を作成していきます。
手順
client / service の作り方は下記マニュアルをベースにしています。
1. RADKit Client のインストール
まずは client のインストールを行います。
client / service ともに以下のリンクからソフトウェアをダウンロードできます。
現時点の Latest である 1.7.5 の Windows 用インストールソフトウェア「cisco_radkit_1.7.5_win64_signed.exe」をダウンロードして実行します。client のインストールは非常に簡単で、EXE ファイルをダブルクリックし、ウィザードに従ってインストールを進めることで完了します。
インストールが完了すると、「RADKit Network Console」というアプリケーションが端末内に表示されるようになります。
2. RADKit Service のインストール
client と同様に service のインストールを行います。
インストール対象サーバは Ubuntu のため、Linux Installer を使ったインストール、または Python pip を使用したインストールのいずれかが選択できます。
ここでは、Python pip を使った方法でインストールします。
まずは Python 仮想環境の作成から。(pip は既にインストール済の前提です)
続いて、ソフトウェアダウンロードサイトから「 cisco_radkit_1.7.5_pip_linux_x86.tgz 」をダウンロードしてサーバへ SCP などでアップロードし、作成済の Python 仮想環境上へ pip を使って service をインストールします。
service のインストールが完了したら、service の管理ユーザー (superadmin) を作成します。
その後、service を起動し、インストール処理は完了です。
0.28.0 の httpx がインストールされている場合、service の起動に失敗してしまいます。別アプリケーションを対象とした話題ですが、以下が参考になります。
https://github.com/geekan/MetaGPT/issues/1617
起動できない問題が発生した場合、以下コマンドによって httpx のバージョンをダウングレードすることによって、回避することが可能です。
(radkit) radkit@radkit:~$ pip install httpx==0.27.2
3. RADKit Service へのルータ登録
service の起動完了後、service の管理画面へアクセスし、c8kv へリモートアクセスするための設定を行います。Web ブラウザで「 https://:8081 」へアクセスし、service の管理画面へ先ほど作成した superadmin でログインします。
ログイン後、メニューの connectivity をクリックし、Enroll with SSO をクリックします。
👁 service-connectivity-sso.jpg
CCO に登録したメールアドレスを入力して Submit します。
👁 service-connectivity-sso-submit.jpg
RADKit Cloud へアクセスすることの承認画面が Web ブラウザ上に表示されるので、accept をクリックします。
👁 service-connectivity-accept.jpg
accept すると、下記のような画面が表示されます。これは閉じていただいて OK です。
👁 service-connectivity-accept-done.jpg
その後 SSO ログイン処理が走りますので、「 CLICK HERE 」リンクをクリックします。
👁 service-connectivity-clickhere.jpg
その後しばらく経つと、Enroll 処理が完了しますので、Close をクリックします。
👁 service-connectivity-ssodone.jpg
Enroll 処理が完了すると、画面上部に Service ID が表示されるようになります。
client からのアクセス時に必要となるので、こちらの ID は控えておいてください。
次に Role Based Access Control (以降 RBAC と表記) の設定を行います。
これは、Remote User がアクセス可能となる Device を Label を使って制限する機能となります。まずは RABC の有効化を行います。
その後、「 + Add Label 」をクリックして任意の Label を作成します。
次に Remote User の登録を行います。
メニューの Remote Users から「 + Add User 」をクリックし、CCO に登録したメールアドレスを入力後、各設定箇所をスクリーンショット通りクリックして「 Add & close」をクリックします。
最後にルータの登録を行います。
メニューの Devices から「 + Add Device 」をクリックし、スクリーンショットの通り、ルータ名 / デバイスタイプ / (service から見た)接続先 IP アドレス / Lable / 接続方式とクレデンシャルを設定して「 Add & close」をクリックします。(スクリーンショットには c8kv-1 のものしかありませんが、実際には c8kv-2 も同様に登録を行っています)
4. 接続確認
service へのルータ登録完了後、client からリモートアクセスできるか試してみます。まず、RADKit Network Console を立ち上げ、ログイン処理を行います。
ログイン後、Service ID 宛に接続し、登録したルータが Inventory に表示されるか確認します。
ルータへリモートログインできるか確認します。
show version コマンドも実行できるので、正常にリモートログインできているようです。
ようやくリモートログインできる環境が整いました。
では、ネットワーク機器操作の自動化実装に入ります!
5. Python スクリプトの準備
client での処理を Python で自動化するためには、 Windows 11 の端末にあらかじめ Python がインストールされていることを前提としています。また、Windows 11 の端末に pip を使って RADKit Client がインストールされていることが前提となります。(インストールファイル名は「cisco_radkit_1.7.5_pip_win.tgz」となります)
まずはテストを兼ねて以下のサンプルスクリプトを実行してみます。
これは、入力された email と service ID を使って service へアクセスして inventory を表示し、inventory 内の指定した機器に対して任意のコマンドを実行するスクリプトとなります。
実際に Windows 11 のコマンドプロンプトから実行した結果は下記の通りです。
では、上記のサンプルスクリプトをカスタマイズして、c8kv に対して以下のような処理を行うスクリプトを作成してみたいと思います。
- スクリプトを起動すると、まず email / service ID の入力を求める。
- 入力後、以下のメニューを出力する。
・show tech の自動取得
・IOSd/IOS-XE 各プロセスの CPU / メモリ使用率のリアルタイムモニタリング
・インターフェースのリアルタイムモニタリング
・何もせずに Exit - メニューを選んだタイミングで service へ接続して inventory を表示し、どのルータに対して処理を行うかの入力を求める。
- 指定したルータに対して指定した処理の実行を行い、終了する。
出来上がったスクリプトは以下となります。
それでは実行してみましょう!!!
上記スクリプトでは、別途 questionary 等の機能も pip でインストールしています。
6. スクリプトの実行
完成したスクリプトは「automation.py」という名称で保存し、実行します。
実行するとメールアドレスと Service ID の入力が求められるので、事前に入力します。
1) show tech の自動取得
まず show tech の自動取得を実行してみます。
メニューから Collect show tech を選択すると、Inventory に登録されている機器が一覧表示されます。対象デバイスとして「 c8kv-1 」を入力すると、約 1 分後に show tech ファイルを作成した旨のメッセージが出力されます。
👁 automation-collect-show-tech1.jpg
👁 automation-collect-show-tech2.jpg
カレントディレクトリを再度確認すると、ログファイルが生成されていることが分かります。ログファイルの中身を見ると、show tech の実行結果が記録されています。無事に show tech 結果が自動取得されました。
👁 automation-collect-show-tech3.jpg
👁 automation-collect-show-tech4.jpg
2) IOSd/IOS-XE 各プロセスの CPU / メモリ使用率のリアルタイムモニタリング
次に IOSd/IOS-XE 各プロセスの CPU / メモリ使用率のリアルタイムモニタリングを実行してみます。メニューから CPU/Memory Monitor を選択し、対象デバイスとして「 c8kv-1 」を入力すると、約 15 秒間隔で IOSd/IOS-XE 各プロセスの CPU / メモリ使用率の Top 5 がリアルタイムに表示されました。なお、情報の更新間隔はお使いのネットワーク速度や指定デバイスの応答速度によって変動します。
途中で処理を停止させたい場合は、Ctrl + C にて強制終了させてください。
3) インターフェースのリアルタイムモニタリング
最後にインターフェースのリアルタイムモニタリングを実行してみます。
メニューから Interface Monitor を選択し、対象デバイスとして「 c8kv-1 」を入力すると、約 10 秒間隔でインターフェースの統計情報がリアルタイムに表示されました。なお、情報の更新間隔はお使いのネットワーク速度や指定デバイスの応答速度によって変動します。(link ステータスの後ろのカンマを replace で消すの忘れてた・・スクリプト上には修正反映済なのでご安心を)
途中で処理を停止させたい場合は、Ctrl + C にて強制終了させてください。
上記の結果だけですと少し分かりにくいので、Client1 から iperf を使って Client2 に対するトラフィックを印加してみます。
本スクリプトの Interface Monitor は、定期的に show interface コマンドを発行し、その実行結果から必要情報を抽出・加工して表示させます。そのため、トラフィックレートなどは 5 分平均のものとなりますが、トラフィック印加後にしばらくモニタすると、トラフィックレートやパケット数などの向上が見られ、正しくモニタリングできていることが分かります。
まとめ
今回はサンプル程度となりますが、RADKit と Python を併用することで遠隔からネットワーク機器の操作を自動化することの片鱗が見られたかと思います。
RADKit は無料で利用できますので、Python によるスクリプト開発が得意な方であれば、ネットワーク機器の遠隔運用などのサービスを開発することもできる のではないでしょうか。
優雅にお酒を飲みながら自動化スクリプトを使ってサクッとトラブルシュートする、というのも夢の話ではないかもしれません!!(これが言いたくてネットワーク構成図にお酒の絵を描いてたのね・・)
遊びの延長だと思って、是非 RADKit を活用してみてください。
Register as a new user and use Qiita more conveniently
- You get articles that match your needs
- You can efficiently read back useful information
- You can use dark theme
