CiscoルーターからSSH経由で構成ファイルをプルして解析するスクリプトを作成しようとしています。これにより、事前定義された標準を満たしていることを確認できます(たとえば、パスワードを「Cisco」にしないでください)。
ルーターへの接続とプログラムによるコマンドの実行は簡単です。私が遭遇する障壁は、show running config
を実行すると、グローバル構成設定と特定のインターフェイスの設定が返されることです。
私の目標は、インターフェースの設定をグローバル設定とは異なる方法で処理することでした。たとえば、無効になっているインターフェイスの不適切な設定は無視できます。
グローバル設定を取得するための個別のコマンドとインターフェイス定義を取得するための個別のコマンド(例:show global settings
およびshow interface settings
タイプのコマンド)はありますか?あるいは、解析を容易にするこの情報を取得するためのより良い方法はありますか?
または、解析を容易にするこの情報を取得できるより良い方法はありますか?
IOS configsの階層のレイヤーのため、ルーター/スイッチ構成の解析は非常に複雑です。可能な場合は、解析に特化したツールを使用してください。そのようなツールの1つは ciscoconfparse (ドキュメントは here )です 注1。 ciscoconfparse 一連の単体テストがあり、ツールのバージョン間で解析の一貫性が保たれていることを確認します。
設定が正確な形式であると仮定してCiscoが使用IOS show running-config
またはshow startup-config
、 ciscoconfparse インターフェイスレベルの設定を自動的に検出します。これは、インターフェイスとグローバル設定の標準化を自動化できることを意味します...これは スイッチインターフェイス設定の監査の例です ドキュメントにあります。 ciscoconfparse たくさんあります。その機能の;ドキュメントを読むのに時間をかける必要があります.
また、多くの特定の値の解析を行う特殊なメソッドもいくつかあります。これらのメソッドは現在ベータ版であり、ソースコードでは のみ表示されます ...たとえば、スイッチ構成がc6509.conf
として保存されているとします。
!
interface GigabitEthernet2/8
ip address 192.0.2.1 255.255.255.252
mtu 9000
carrier-delay msec 50
!
スクリプトまたは pythonインタプリタ )を使用して、ネイティブpython表現...でIPアドレスとcarrier-delay
を取得できます。
[mpenning@tsunami ~]$ python
Python 2.7.3 (default, Jan 2 2013, 13:56:14)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> from ciscoconfparse import CiscoConfParse
>>> config = CiscoConfParse('c6509.conf', factory=True)
>>>
>>> intfs = config.find_objects('interface GigabitEthernet2/8', exactmatch=True)
>>> intfs
[<IOSIntfLine # 1 'GigabitEthernet2/8' info: '192.0.2.1/30'>]
>>>
>>> intfs[0].ip_addr
'192.0.2.1'
>>>
>>> intfs[0].has_manual_carrierdelay
True
>>>
>>> intfs[0].manual_carrierdelay
0.05
>>>
>>> intfs[0].manual_mtu
9000
>>>
ベータ機能が必要な場合は、上記のようにfactory=True
を使用して構成を解析する必要があります...
私の目標は、グローバル設定とは異なる方法でインターフェイスの設定を処理することでした。たとえば、無効になっているインターフェイスの不適切な設定は無視できます。
グローバル設定を取得するための個別のコマンドとインターフェイス定義を取得するための個別のコマンドがありますか(たとえば、show globalsettingsとshowinterface settings type ofコマンド)?
IOSを使用すると、個々のインターフェイスレベルの構成を表示できますが、数百のインターフェイスが存在する可能性がある場合は非常に面倒です...すべてのインターフェイスに対してこのコマンドを実行するとします...
CORE01.PUB.DAL02#sh runn int gi1/2
Building configuration...
Current configuration : 242 bytes
!
interface GigabitEthernet1/2
description Link to Edge01.pub.dal02
ip address 192.0.2.46 255.255.255.252
ip ospf network point-to-point
media-type rj45
end
CORE01.PUB.DAL02#
実行しているイメージに応じて、Cisco IOSは他のいくつかのグローバル構成セクションを許可します...これは12.4を実行しているルーターからのものです...
Edge01.PUB.DEN#sh running-config ?
brief configuration without certificate data
class-map Show class-map information
full full configuration
interface Show interface configuration
linenum Display line numbers in output
map-class Show map class information
policy-map Show policy-map information
view View options
| Output modifiers
<cr>
Edge01.PUB.DEN#
IOS正規表現をCLIから使用して、グローバル構成の一部を取得することもできます...たとえば...
Edge01.PUB.DEN#show runn | include ^enable
enable secret 5 $1$mOmQ$sORLRqZQZ/cr7KSyrXUPZ.
Edge01.PUB.DEN#
参考までに、これは「Cisco」の有効化パスワードのMD5ハッシュであり、本番環境で見つかった場合にフラグを立てます。
インターフェイス定義がいつ終了するかを定義する良い方法はありますか?すべてのインターフェイス行が1つのスペースでインデントされているようですが、それが構成全体で標準であるかどうかはわかりません
はい、シスコIOSは、子がインターフェイス設定ステートメント、IP拡張ACL回線などであるかどうかに関係なく、常に余分なスペースで子設定要素をインデントします。
End Notes
注1Stack Exchange免責事項 :著者です。
フォーマットにはコンテキストがあるため、コンテキストに応じて解析することを検討してください。そのためには、さらにコードを書く必要があるかもしれません。グローバル状態やインターフェースなどのオブジェクトモデルを構築するコードのモデルの使用を検討してください。
運用上、無効になっているインターフェイスから非準拠の設定を削除することは、誰かがそれらを有効にする場合に備えて良い考えです。