Categories: Cisco DNA

Open IOS-XE のプログラマビリティ

Cisco DNA(Digital Network Architecture)で発表した「The Network. Intuitive.」では、Cisco Catalyst 9000 シリーズに加え、ネットワーク コントローラやデータ分析プラットフォームなど、ソフトウェア面が強調されました。その他にも、あまり国内では取り上げられていませんが、Cisco IOS-XE そのものの実装も大きくリフレッシュされ、内部的にも洗練され、Open IOS-XE として新たに発表されています。

内部アーキテクチャについては、こちらのブログで詳しく解説されていますので、ぜひご覧ください。従来の操作感を保ったまま、内部データベースや機能群の分離を行い、コンテナによるアプリケーション ホスティングなどを段階的に実現しました。その他にも、YANG データモデルが本格的に実装され、いよいよ Netconf をはじめとした外部からの API オペレーションが通常の LAN でも可能になります。また、SMU(Software Maintenance Update)とよばれるパッチによる部分的なソフトウェア変更が可能になりました。これらは、いずれも通信事業者向けの大規模ルータ(IOS-XR など)では従来から一般的だったものが、企業向け LAN スイッチにまで拡張され、より一般的になってきたと言えます。これらのアーキテクチャを採用した IOS-XE バージョン 16 以降を Open IOS-XE と新たにネーミングし、30 年の歴史を持つ IOS の大きなリニューアルとして発表されています。

Catalyst スイッチで動く Linux コンテナとシェル、Python

実は、Catalyst 9000 シリーズ以外にも、Catalyst 3850 や 3650 といった既存の L3 スイッチの IOS-XE16.5.1a にて、ゲストシェル(Bash)や Python スクリプティングがサポートされています。一部の方にとっては、非常に興味深い新機能だと思いますので、本投稿で紹介致します!

Cisco IOS XE Everest 16.5.1aのリリースノート
Guest Shell—A secure LXC container that is an embedded Linux environment and enables you to develop and run Linux and custom Python applications for automated control and management of Cisco switches. Guest Shell is bundled with the software image (cat3k_caa-guestshell..SPA.pkg)and can be installed using the guestshell enable command.

Linux コンテナ上でゲストシェルが動作し、その中でカスタム Python スクリプトを動作させ、スイッチの運用管理や自動化に使えます。

The Python scripting capability gives programmatic access to YANG data models and the device’s command-line interface (CLI) to perform various tasks such as Zero Touch Provisioning (ZTP) and Embedded Event Manager (EEM) actions.

Python スクリプトからは、内部的に YANG データモデルへのアクセスと CLI アクセスの両方がサポートされます。Python スクリプトの活用方法は、手動や CRON タイマーといったサーバと同様の一般的な利用方法に加え、ZTP(ゼロタッチ プロビジョニング)というブート ストラッピング機能を使って、配信サーバからスクリプトを自動配布できます。これにより、スイッチ装置内で初期設定の自動化や、従来から Cisco IOS でサポートしていた EEM(Embedded Event Manager)を記述するイベント/アクション定義用スクリプトとしても使えるようになりました。

On-box プログラマビリティと背景

データセンター スイッチや通信事業者向けのスイッチおよびルータでは従来から様々な自動化のための手法がサポートされていますが、企業 LAN 向けのスイッチやルータでも一気に自動化やプログラマビリティが身近になるでしょう。

一般的に NMS やツール類(Ansible など)での外部からの装置アクセスを Off-box プログラミングとよぶのに対し、ルータやスイッチ装置内部に配置したコードを使った自動化を On-box プログラミングとよびます。これらは相互補完的であり、ネットワーク リーチャビリティがなくなった装置内部でのログ取得を証跡用途に残したり、装置内部のロジックで経路を切り替えたりといった用途で、古くから On-box(装置に閉じた動作)も多く使われてきました。(古くはサイレントクラッシュ前のコアダンプ自動取得用途など…)

On-box プログラミングは標準手法というよりも装置やメーカー依存になりやすく、オープンコミュニティでは(オープンなツールに比べて)議論されにくいトピックでもあります。しかしながら、実際にはトラブル時のワークアラウンドにも多用され、事例にもなりにくい(公開されない)一方で、人気のあるトピックとなっています。実際、私自身も、これらの機能を使って、多くの国内のお客様対応をさせていただいています。

Catalyst 3850 での設定と動作確認

実際に Catalyst 3850 を使って、ゲストシェルや Python スクリプトを動作させてみましょう。設定そのものは、ものすごく簡単です。

Cat3850-3#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Cat3850-3(config)#iox
Cat3850-3(config)#exit
Cat3850-3#
Cat3850-3#guestshell enable
Management Interface will be selected if configured
Please wait for completion
guestshell is in RUNNING state

Cat3850-3#

以下の show コマンドでは、LXC(Linux コンテナ)上で GuestShell が動作していることがわかります。

Cat3850-3#show app-hosting detail
State                  : RUNNING
Author                 : Cisco Systems
Application
Type                 : lxc
App id               : guestshell
Name                 : guestshell
Version              : 0.1
Activated profile name : custom
Description          : MontaVista guestshell
Resource reservation
Memory               : 256 MB
Disk                 : 1 MB
CPU                  : 800 units
VCPU                 : 1
Attached devices
Type              Name        Alias
---------------------------------------------
Serial/shell
Serial/aux
Serial/Syslog                 serial2
Serial/Trace                  serial3
Network interfaces
---------------------------------------

ゲストシェルに直接入る前に、Python インタープリタを操作してみましょう。ここでは、あらかじめ組み込まれている CLI モジュールを import することで、スイッチの CLI を Python から実行できることを紹介しています。

※CLI モジュールの詳細は、「Programmability Configuration Guide, Cisco IOS XE Everest 16.5.1a (Catalyst 3850 Switches)」のなかの「Chapter : CLI Python Module」を参照してください。

Cat3850-3#guestshell run python
Python 2.7.11 (default, Feb  3 2017, 19:43:44)
[GCC 4.7.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> a = "Hello!"
>>> print a
Hello!
>>> import cli
>>> cli.clip('show ip int brie | i Vlan1')

Vlan1                  10.71.154.98    YES NVRAM  up                    up
>>>
>>> output=cli.clip('show clock')

*09:47:26.825 UTC Tue Jun 6 2017

>>> print (output)
None
>>> output=cli.cli('show clock')
>>> print (output)

*09:48:21.961 UTC Tue Jun 6 2017

>>>
>>> cli.configure(["interface GigabitEthernet1/0/7", "no shut", "end"])
[ConfigResult(success=True, command='interface GigabitEthernet1/0/7', line=1, output='', notes=None), ConfigResult(success=True, command='no shut', line=2, output='', notes=None), ConfigResult(success=True, command='end', line=3, output='', notes=None)]

ゲストシェルに入って、Linux 環境を確認してみましょう。Catalyst 3850/3650 は MIPS CPU ですが、Catalyst 9300 では x86 に変更されていますので、細かいですが汎用性が高まっているともいえるでしょう。

Cat3850-3#guestshell
[guestshell@guestshell ~]$ uname -a
Linux guestshell 3.10.101.cge-rt110 #1 SMP Sat Mar 11 19:54:31 PST 2017 mips64 GNU/Linux
[guestshell@guestshell ~]$
[
guestshell@guestshell ~]$ cat /proc/version
Linux version 3.10.101.cge-rt110 (nosbuild@nosdistros-bld4) (gcc version 4.7.0 (GCC) ) #1 SMP Sat Mar 11 19:54:31 PST 2017
[guestshell@guestshell ~]$
[guestshell@guestshell ~]$ cd /
[guestshell@guestshell /]$ ls
bin          data         flash        local       proc         tmp
boot         dev          home         lost+found   sbin         usr
bootflash    etc          lib          media        selinux      var
cisco        fix_sshd.sh  lib64        mnt          sys
[guestshell@guestshell /]$ cd ~
[guestshell@guestshell ~]$

※参考までに、Catalyst 9300 では以下のように出力されます。

C9300-24U#guestshell
[guestshell@guestshell ~]$ uname -a
Linux guestshell 4.4.51 #1 SMP Sun Jun 4 17:58:12 PDT 2017 x86_64 x86_64 x86_64 GNU/Linux
[guestshell@guestshell ~]$
[guestshell@guestshell ~]$ cat /proc/version
Linux version 4.4.51 (xelinux@xe-linux-bld2) (gcc version 5.3.0 (GCC) ) #1 SMP Sun Jun 4 17:58:12 PDT 2017
[guestshell@guestshell ~]$
[guestshell@guestshell ~]$ cd /
[guestshell@guestshell /]$ ls
bin        cisco                        dev          flash  lib64       media  proc      run      srv  unfix_sshd.sh
boot       created.2016-05-31.14:23:44  etc          home   local      mnt    root      sbin     sys  usr
bootflash  data                         fix_sshd.sh  lib    lost+found  opt    rr_moved  selinux  tmp  var
[guestshell@guestshell /]$

ゲストシェル上では、通常の Linux コマンドが使えることに加え、/flash に flash: がマウントされています。Vi エディタから flash: 上のファイルを確認・編集したり、新たにファイルを作成することも可能です。

以下の例では、後ほど実行する簡単な EEM Python スクリプトを、ゲストシェル上の vi エディタで作成しています(sho-ver.py)。

[guestshell@guestshell ~]$ pwd
/home/guestshell
[guestshell@guestshell ~]$ pip list
pip (8.1.2)
setuptools (22.0.5)
[guestshell@guestshell ~]$
[guestshell@guestshell ~]$ cd /flash/
[guestshell@guestshell flash]$ ls | grep .bin
cat3k_caa-universalk9.16.05.01a.SPA.bin
[guestshell@guestshell flash]$
[guestshell@guestshell flash]$ vi sho-ver.py
[guestshell@guestshell flash]$ cat sho-ver.py
#!/usr/bin/python

import cli
print cli.execute('show version')
[guestshell@guestshell flash]$
[guestshell@guestshell flash]$ python ./sho-ver.py | grep bin
System image file is "flash:cat3k_caa-universalk9.16.05.01a.SPA.bin"
[guestshell@guestshell flash]$

それでは、IOS でもサポートされていた EEM(Embedded Event Manager)から、先ほど作成した Python スクリプト(show version コマンドを発行するだけの、非常にシンプルなものです)を実行してみます。

EEM の設定自体も簡略化し、イベントとしては NONE(手動で実行するテスト用のイベント)と先ほどの Python スクリプトを紐付けて定義しました。EEM により起動された Python スクリプトから実行されるコマンドを出力する目的で、debug コマンドを設定しています。TEST ポリシーを手動で発行(event manager run TEST)すると、ゲストシェル上でsho-ver.py が自動的に実行されていることがわかります。

この例では、テスト用に NONE イベントを使いましたが、従来からサポートされている EEM のすべてのイベントをトリガーとして使えるため、装置内で発生・検出されるさまざまな条件によって、自動的に Python スクリプトを起動できることがおわかりいただけると思います!

Cat3850-3#sho flash: | i py
9         64 Jun 06 2017 09:59:24.0000000000 +00:00 sho-ver.py
Cat3850-3#Cat3850-3#sh run | sec event manager
event manager applet TEST
event none
action 100 cli command "enable"
action 200 cli command "guestshell run python /bootflash/sho-ver.py"
Cat3850-3#
Cat3850-3#debug event manager action cli
Debug EEM action cli debugging is on
Cat3850-3#
Cat3850-3#event manager run TEST

*Jun  6 10:08:14.106: %HA_EM-6-LOG: TEST : DEBUG(cli_lib) : : CTL : cli_open called.
*Jun  6 10:08:14.108: %HA_EM-6-LOG: TEST : DEBUG(cli_lib) : : OUT : Cat3850-3>
*Jun  6 10:08:14.108: %HA_EM-6-LOG: TEST : DEBUG(cli_lib) : : IN  : Cat3850-3>enable
*Jun  6 10:08:14.220: %HA_EM-6-LOG: TEST : DEBUG(cli_lib) : : OUT : Cat3850-3#
*Jun  6 10:08:14.220: %HA_EM-6-LOG: TEST : DEBUG(cli_lib) : : IN  : Cat3850-3#guestshell run python /bootflash/sho-ver.py
Cat3850-3#
*Jun  6 10:08:18.549: %HA_EM-6-LOG: TEST : DEBUG(cli_lib) : : OUT : Cisco IOS XE Software, Version 16.05.01a
*Jun  6 10:08:18.550: %HA_EM-6-LOG: TEST : DEBUG(cli_lib) : : OUT : Cisco IOS Software [Everest], Catalyst L3 Switch Software (CAT3K_CAA-UNIVERSALK9-M), Version 16.5.1a, RELEASE SOFTWARE (fc2)
*Jun  6 10:08:18.550: %HA_EM-6-LOG: TEST : DEBUG(cli_lib) : : OUT : Technical Support: http://www.cisco.com/techsupport
*Jun  6 10:08:18.550: %HA_EM-6-LOG: TEST : DEBUG(cli_lib) : : OUT : Copyright (c) 1986-2017 by Cisco Systems, Inc.
*Jun  6 10:08:18.550: %HA_EM-6-LOG: TEST : DEBUG(cli_lib) : : OUT : Compiled Tue 30-May-17 00:59 by mcpre
*Jun  6 10:08:18.550: %HA_EM-6-LOG: TEST : DEBUG(cli_lib) : : OUT : Cisco IOS-XE software, Copyright (c) 2005-2017 by cisco Systems, Inc.
*Jun  6 10:08:18.551: %HA_EM-6-LOG: TEST : DEBUG(cli_lib) : : OUT : All rights reserved.  Certain components of Cisco IOS-XE software are
*Jun  6 10:08:18.551: %HA_EM-6-LOG: TEST : DEBUG(cli_lib) : : OUT : licensed under the GNU General Public License ("GPL") Version 2.0.  The
*Jun  6 10:08:18.551: %HA_EM-6-LOG: TEST : DEBUG(cli_lib) : : OUT : software code licensed under GPL Version 2.0 is free software that comes
*Jun  6 10:08:18.551: %HA_EM-6-LOG: TEST : DEBUG(cli_lib) : : OUT : with ABSOLUTELY NO WARRANTY.  You can redistribute and/or modify such
*Jun  6 10:08:18.551: %HA_EM-6-LOG: TEST : DEBUG(cli_lib) : : OUT : GPL code under the terms of GPL Version 2.0.  For more details, see the
*Jun  6 10:08:18.552: %HA_EM-6-LOG: TEST : DEBUG(cli_lib) : : OUT : documentation or "License Notice" file accompanying the IOS-XE software,
*Jun  6 10:08:18.552: %HA_EM-6-LOG: TEST : DEBUG(cli_lib) : : OUT : or the applicable URL provided on the flyer accompanying the IOS-XE
*Jun  6 10:08:18.552: %HA_EM-6-LOG: TEST : DEBUG(cli_lib) : : OUT : software.
*Jun  6 10:08:18.552: %HA_EM-6-LOG: TEST : DEBUG(cli_lib) : : OUT : ROM: IOS-XE ROMMON
*Jun  6 10:08:18.552: %HA_EM-6-LOG: TEST : DEBUG(cli_lib) : : OUT : BOOTLDR: CAT3K_CAA Boot Loader (CAT3K_CAA-HBOOT-M) Version 3.58, RELEASE SOFTWARE (P)
*Jun  6 10:08:18.553: %HA_EM-6-LOG: TEST : DEBUG(cli_lib) : : OUT : Cat3850-3 uptime is 1 day, 15 hours, 57 minutes
*Jun  6 10:08:18.553: %HA_EM-6-LOG: TEST : DEBUG(cli_lib) : : OUT : Uptime for this control processor is 1 day, 16 hours, 0 minutes
*Jun  6 10:08:18.553: %HA_EM-6-LOG: TEST : DEBUG(cli_lib) : : OUT : System returned to ROM by reload
*Jun  6 10:08:18.553: %HA_EM-6-LOG: TEST : DEBUG(cli_lib) : : OUT : System image file is "flash:cat3k_caa-universalk9.16.05.01a.SPA.bin"
*Jun  6 10:08:18.553: %HA_EM-6-LOG: TEST : DEBUG(cli_lib) : : CTL : 20+ lines read from cli, debug output truncated
*Jun  6 10:08:18.554: %HA_EM-6-LOG: TEST : DEBUG(cli_lib) : : CTL : cli_close called.*Jun  6 10:08:18.556:
*Jun  6 10:08:18.556: tty is now going through its death sequence
Cat3850-3#

簡単な動作例を使って、機能の一端をご紹介しました。既に想像力豊かな方は、すぐにでも装置を触り始められるかもしれません。このブログでも、続編で様々な利用の仕方や、関連機能など、順次紹介していきたいと思います。

参考 URL

 

Kazumasa Ikuta

シスコシステムズ合同会社 APJアーキテクチャー プリンシパルアーキテクト。2001 年入社。エリア担当 SE、通信事業者担当 SE、SDN応用技術室を経て、2021年よりアジア太平洋地域アーキテクチャーセントラルグループ所属、プリンシパルアーキテクト。主に企業向けのネットワーク運用管理全般および製品、SDNやネットワークプログラマビリティ関連、Cisco DevNetを担当。提案、構築、運用維持管理における技術サポート、本社開発部門と連携したアジア地域での製品や技術のロールアウトプラン策定と実行、対外的なプレゼンテーションなど、仕事を選ばず幅広く活動中。書籍:Ciscoネットワーク構築教科書[解説編](共著)Ciscoネットワーク構築教科書[設定編](共著)Cisco WAN 実践ケーススタディ(共著)