はじめに
Cisco機器のゲートウェイ冗長化機能にHSRP
がありますが、切り替わりはともかく、切り戻す際にはどのように戻していますか?
各案件、各会社のポリシーなどにより、様々なやり方があるかと思います。
- 自動で主系機器に切り戻す
- 手動で主系機器に切り戻す
- 切り戻しはせず、動いている機器側を使う
私が関わっていた案件では、何かしらの問題が生じて切り替わった場合、原因が判明するまでは切り戻したくない、また極力パケットは同じ経路を通るようにしたいお客様が多かったので、常に優先度が高いルータが選出されるようにするPreempt
設定はせず、問題解決後、手動で主系機器に切り戻す方法をよく行っていました。
ただ、HSRP
には意図的に切り替えを行うオペレーションコマンドが無いため、切り替えるためには、コンフィグレーションモードでインタフェースを落として切り替えたり、一時的にHSRP
のPreempt
設定を加えて切り替えるしかありません。
一時的にでも設定変更するリスクが伴うため、ヒューマンエラーを減らすよう、以前私が使っていたEnbedded Event Manager
(EEM)によるHSRP
の切り戻しを紹介しようと思います。
Enbedded Event Managerとは
Cisco機器で使用できる機能で、カスタムコマンドの作成や特定イベント発生時にログ通知するようなことが行えるものとなります。
サーバで言うところのいわゆるシェルスクリプトによるコマンド実行にイメージが近いと思います。
※Feature Set
によっては使えないものもあったと思うので、もし使う場合は事前に調べてください。
カスタムコマンドの作成
今回は以下の操作を行うコマンドを作成します。
- 指定HSRPグループの設定にPreempt設定を加える
- 5秒待機
- 指定HSRPグループの設定からPreempt設定を削除する
やっていることは手動で行う場合と同様なので、コンフィグレーションモードで一時的に設定変更するのと変わりませんが、カスタムコマンドを作っておけば管理者モードで実行できるのと、作業時のコマンド数が減るのでヒューマンエラーを減らせる利点があります。
また、主系機器への切り戻しを行うコマンドとなるので、本設定を行うのは主系となる機器のみ設定すれば良いです。
※従系機器に入っててもPriority
が低くて切り替わらないので、あっても問題ないですが。
今回は以下構成を想定してカスタムコマンドを作成していきます。
項目 | 設定 |
---|---|
アプレット名 | hsrp10failback |
HSRP適用インタフェース | GigabitEthernet0/1 |
HSRPグループID | 10 |
アプレットの作成
EEM
はアプレット
ごとに定義を設定でき、各アプレットに複数の処理を設定できます。
今回はhsrp10failback
という名前のアプレットを作成して、カスタムコマンド用の設定を加えていきます。
「1.x」と書かれている部分は順番を表す数字となり、今回は0.1ずつ増やしていますが、昇順になっていればいくつでも構いません。
event manager applet hsrp10failback
event none
action 1.0 cli command "enable"
action 1.1 cli command "configure terminal"
action 1.2 cli command "interface GigabitEthernet0/1"
action 1.3 cli command "standby 10 preempt"
action 1.4 wait 5
action 1.5 cli command "no standby 10 preempt"
action 1.6 cli command "end"
尚、コマンド実行時に引数を渡して指定のHSRPグループIDの切り替えを行うといったことは(多分)できないので、複数のHSRPグループが存在する場合は、その分作成しましょう。
エイリアスの作成
EEM
を実行する際にはevent manager run [アプレット名]
の形式で実行する必要がありますが、長いので、エイリアスを設定して[アプレット名]
のみで実行できるようにします。
alias exec hsrp10failback event manager run hsrp10failback
設定出来たら、エイリアスを読み込むために一度ログアウト&ログインしておきましょう。
HSRP切り戻しコマンドの実行
管理者モードで以下コマンドを実行することで一時的にPreempt
設定が行われるので、HSRP
のPriority
が高い機器へ切り戻されます。
hsrp10failback
おわりに
大分昔に使っていたやり方なので、もし今もう一度切り戻しツールを作るとしたらAnsible
などで作ると思いますが、諸々の理由でAnsible
などのツールが使えないという人のために残しておきます。