CLIベースのNW自動化バッドノウハウのあれこれ(補足)
CLIベースのNW自動化バッドノウハウのあれこれ について、思いの外反響があったのでみんな似たようなところで苦労してるんだろうなーと勝手に思っています。で、実際いろいろ作ってたときの記録などなどを元に少しバッドノウハウ系の話をさらってみました。やっていたもの自体は会社でのあれこれの話とかも入って出せないのですが。もう 5 年以上前の話になるので、最近の環境ではそんなに当てはまらない話があるかもしれませんが、もともと、かつてこういうところで困ったから今どういう動きがあるのか、というのを見てもらえればいいやと思っているので問題ないでしょう。
とつぶやいてみたりしたらいくつかリプライもらったのでその辺も含めてまとめておきます。ログイン/ログアウト処理関連
ssh strictHostKeyChecking
- expect で ssh セッションを張る場合、始めてアクセスするホストの鍵確認応答でこけるというのはみんなやったことがあるのでは…。
- まあテスト時とかはともかく、認証周りの運用とかはまじめに考えないとだめです。
ssh -o strictHostKeyChecking=no
ログインリトライ
- ログイン処理のリトライ(ユーザ名あるいはパスワードが正しくないときに、数回ログインを繰り返す)処理を入れるかどうか。
- 1回でうまくログインできないケースがあったんだと思われるけど状況詳細不明です。
- ちゃんとリトライカウント入れておかないとループします…
ログイン後の強制プロンプト出力のためのリターン入力
ログインした時にプロンプトが出るマシンと、そうでないマシンがあるから無駄にEnter1回入れるってのは、まさにバッドノウハウ感ある。
- やりますよね。コマンドのエントリポイントが返ってこないと先に進まないんですよ…。
- シリアルコンソールサーバを使って、工場出荷状態の機材に管理用の IP を振るところから自動化するというのをやったことがあるんですが、リモートログイン時とシリアル利用時にプロンプトの出方が違うというのもあります。
- あと、初期状態だと初期設定ウィザードとかに入る機材がそれなりにあるので、そこをキャンセルした上で設定コマンド流し込むとか作ってた。
- ちょっとまえの F5 は、環境変数
TERM
の値を見て、知らないやつだとエラー返すというのがありました…(v9だったか?)。テスト用に Cygwin 上でスクリプト書いて実行したらTERM=cygwin
だとエラー出されるので環境変数設定し直してるコードが出てきた。 - F5 さんはこの辺いろいろ変わったという話もあり…最近のは触ったことないんですがどうでしょうね。
@stereocat v10 までは bigpipe(bp) / TMSH が使えたけど、v11 からは TMSH だけになってしまって…。REST 対応も不完全だから、一時的に TMSH 自動化を強いられるという地獄。
ログアウト処理
- save, exit, logout 等の処理を行う際に yes/no のような確認応答をする必要があるというのは前回にも書いたとおり。
- 問題は、ログインしたい時点で、CLI上、どのモードになってるかなんですよね。たとえば Cisco の機材で、いくつかコマンドをなげていて、特権モードで interface 設定していた状態 Router(config-if)# だったとしたら、いったんそのモードを抜けてからログアウトコマンドを打たないとちゃんとログアウトしてくれないわけです。いくつか対応策はあります。たとえばこんな感じ。
- 投げ込むコマンドを記述する段階でログアウトまで意識したコマンドを記述しておく。
- コード書く処理としては簡単ですが、コマンドシーケンス作る段階で間違えて exit 多いと処理中断したり少ないとうまくログアウトしなかったり、チェックが難しいです。
- 投げ込むコマンドを記述する段階でログアウトまで意識したコマンドを記述しておく。
configure terminal interface gi0/1 ip addr... no shut exit <= config-if 抜ける exit <= config 抜ける exit <= enable 抜ける exit <= ログアウト
-
- セッションが切れるまで exit を繰り返し送るといった処理にしておく
- モード抜けて、最終的にログアウトする段階で yes/no が入ったりするのでそこがどうなるか。
- セッションが切れるまで exit を繰り返し送るといった処理にしておく
- モード遷移とかも管理するのかとかね…。
- エラー有無を無視して end, exit, exit をまとめて流すようにしておくとかもあるかもしれない。
コマンド処理
文字列処理のあれこれ
- 前も書きましたが、パラメタ化すると ASCII 文字以外を書いてくる人がいます。
- パラメタの埋め込み
@stereocat あと input/output 入れた値が残るのか、省略されて残るのか、それとも省略なしに変換されるのか、大文字小文字どっちに寄るのか・・・ IPv4 でも同じことがあります。10進なので軽微ですが。 192.168.0.1→192.168.000.001
2014-10-26 14:00:34 via Tween to @stereocat
@stereocat 物凄い細かいところだと、長い文字列を受け付けるのに勝手に32文字で切るとかありますね。config 流し込んだ後、vlan name におかしいところが・・・ decimal の range には強いが、string の length はいい加減なイメージ
2014-10-26 14:06:15 via Tween to @stereocat
@stereocat 数字は誤って受け付けると ASIC が処理できないからしっかり見る、文字列は大半がコメントだから適当。せいぜいオブジェクト化されてて、マッチするかどうかでしょ って扱い。
2014-10-26 14:07:37 via Tween to @stereocat
- description や remark とかにいろいろ tag 的な情報埋め込んでるところも見たことがあるので…
@stereocat description とか Web UI 的に考えると、サニタイズされてなくて怖い。(´ω`;)
2014-10-26 14:10:46 via Tween to @stereocat
コマンド別エラー処理
- show コマンドなどの出力にプロンプト相当の文字列が含まれるケース…みたいな話を前回したんですが、show log とかやったら、コマンド入力時に引っかけることにしていたエラーメッセージ (たとえば "Command Not Found" みたいなメッセージ) がそのまま出てきて引っかかって処理中断とかね…
- 仕方がないので、このコマンドに対しては、次のプロンプトが出るまでエラーは無視する、といった処理いれるわけです。
ループ回避
- これは処理系依存の話があるかもしれないですが…。perl-Expect だと、イベントに対してコールバックを設定しておく形になるのでそれを想定してください。
- 上記の、あるコマンドに対するエラー無視とか、何かを無視して先に進むようなケースはリスクがあります。
- たとえば、コマンド出力にプロンプト相当の文字列があるので無視して先に進む、みたいなのを考えるとわかりやすいと思います。下手すると無限にプロンプト待ちになります。
- 特権モード移行も、多くのネットワーク機器は特権モードになるとプロンプトが変わるんですが、あるデバイスでは、特権ユーザではいると最初から特権モード状態だったりして、特権モードコマンドの前後でプロンプトが変化しないことがあります。で、これはプロンプトマッチの順序を間違えると、やっぱり無限ループする。(モード前後でプロンプトが変化しない場合、特権モードのプロンプトを待ち続ける。)
- ということで、無限(プロンプト待ち)ループを回避するために、一つのコマンドに対してのイベントループカウンタとかをいれて一定以上ループが回っている場合は強制終了させる、といった回避策を入れたりしてました。
そのほかいろいろ
上書き処理のあれこれ
@stereocat 「ごっそり消して再設定する」状況が今一つ掴めないんですが、ファイルを指定してコンフィグを読み込ませると、古いコンフィグをいったん全部消す動きをするということですか?
2014-10-26 14:35:22 via Janetter to @stereocat
@team_eririn 前のを消さずに単純に上書きしちゃうと、前のconfigと新しく入れたconfigがマージされるとかがあるので…
2014-10-26 14:36:38 via Janetter to @team_eririn
こういう感じで、
conf term no ip access-list HOGE ip access-list HOGE permit ip ... ... deny ip ... ...
いったん消して再設定するようなコマンドを tftp で流し込むとかはよくやります。前提(初期状態)をそろえた上でコマンド生成してやったりする(前の状態に依存せずに処理を作る)方がやりやすいので。インタフェースとかも、いったん初期状態にしてから再設定とか。
conf term default interface gi0/1 int gi0/1 ip addr ... end
これをやらない場合、前のコマンドとかぶるところは上書きされるし、かぶらないところはマージされるし…。
とはいえ、上の ACL 設定変更だって、こういういったんクリアして入れ直しという処理ではなくて、古い ACL を残しておいて、新しい ACL に切り替えた後、何か問題があったらすぐ戻せるようにしておきたい、みたいな話をされたこともあるし…(そうなると現在のコンフィグから処理を組み立てないといけないのでだいぶややこしくなる)。
まあ、あとはケースバイケースなんですが、
BGPみたいにセッション維持した上で情報交換しているもの、再設定で(場合によっては大量の)アドバタイズや何らかの再計算が発生しうるものの自動化は難しい。サービスレベルとかにもよるとおもうけど。
複雑度の高い操作を自動化するべきかどうか、という話もあり。操作の重要度(オペミスのリスク)、複雑さ(実装上バグるリスク)、繰り返しの回数、デバイスの台数、作業ウィンドウ、実行させたい人(権限)、…
おわり
自分達で使っている機器ごとのモジュールとか作っている会社は多いみたいだけど、オープンにするのも難しくて、各社で秘伝のタレ化してるんだろーな
対象メーカがどの程度存在するか分かんないけど、機種名出していく方がバッドノウハウの対象が明確になる気がする。まぁ名前出す出せないはあると思うけど、あくまでネットのドキュメントに書いてある程度の一般論的に。
対象機器が増えたときの絶望感。。。 | CLIベースのNW自動化バッドノウハウのあれこれ - # cat /var/log/stereocat | tail -n3 (id:stereocat / @stereocat) URL