netconf / restconf 時代にもxlogin 使いまくってる話
NetOpsCoding Advent Calendar 2015 18日目のエントリーです. ハードウェア製品を使ったネットワーキングの話.
さまざまなコンポーネントについて YANG Model の標準化が進み,NETCONF 使える気運が高まっています.さらにRESTCONF も待っていて,ハードウェアで高速にルーティングしつつ運用を自動化できそうな予感がしています.
私は,条件がそろえばNETCONF を使います.XML といえど エラーや出力が構造化されていて きちんと取れるのはうれしい.
一方で 日常のネットワーク運用はCLI に頼っていて,判断をはさみつつ手続き (= コマンド) を変えます.このような用途にはNETCONF / RESTCONF はたぶん向きません.大がかりすぎです.
今回は,自動化できないときでも便利な xlogin を紹介します.
( ようやく,これ自動化の話じゃないわ と気づきました… 気にせず行きます すみません )
xlogin ?
rancid に同梱されている clogin, jlogin, flogin, ... のことをまとめて xlogin と呼んでいます.これらはrancid のためのサポートツールで,各種デバイスにログインするためのexpect スクリプトセットです.
ssh / telnet を薄くwrap するだけの単純なexpect ですが,めちゃ便利なので, いまはネットワークデバイスにログインするとき ssh / telnet を呼ぶことはほとんどありません.たぶんrancid 本体より便利です.
つかいかた
ログインする例 (IOS 系)
xlogin はデバイス種別ごとに実行ファイルが分かれており,IOS 系にはclogin を使います.
clogin <デバイス名>
パスワードを自動入力しつつ telnet でログインしています.よく見れば,ログインと同時にenable
になっていることがわかると思います.
上はQuagga の例ですが,IOS でも同じ動きです.
複数デバイスにコマンド実行する例 (Junos)
複数のJunos に対し,show version
を実行します.Junos にはjlogin を使います.
jlogin -c "show version" <デバイス名1> <デバイス名2>
2台のJunos に順にssh ログインし,show version
を実行し,ログアウトします.結果は標準出力されるので,grep
に渡したり,ファイルにリダイレクトしたり,| vi -
して開く → 編集 → 保存したりできます.
よく見ると ssh のまえにtelnet を試しているのがわかると思いますが,xlogin はデフォルトでは「telnet / ssh 両方を試してログインできるほうを使う」という動きをします.
初めてssh するデバイスについては,自動でhostkey のfingerprint を~/.ssh/known_hosts
に保存します.fingerprint が違っていることを検出した場合はログインしません.
複数コマンドを実行する例 (IOS-XR)
IOS-XR にログインし,interface description を変更します.
! ./cmd show interfaces description configure interface Gi0/0/0/0 description interface1 commit exit exit show interfaces description exit
上のような一連のコマンド群を実行する必要がありますが,ファイルに書いておいてxlogin に渡すだけ.
clogin -x <コマンドファイル> <デバイス名>
単純に逐次実行するだけなので,失敗時にrollback しない点に注意してください
- デバイス固有のコメント行をいれておくと便利
- 引数をふやせば,複数デバイスに対して実行できる
jlogin -c "show version; show chassis hardware" router1
のようにコマンドラインからも渡せる- vty にコピー&ペーストしたときのバッファ溢れが気になる時など,
vi cmd; clogin -x cmd <デバイス名>
すれば安心.プロンプトが返ってきたら1行実行,また1行実行…という動きをする
以上,xlogin の使用例をならべてみました.
clogin, jlogin, ... を使い分けるのは 少々めんどうですが,便利そうじゃないですか?
対応デバイス
xlogin は対応デバイスが多くてスゴい.めんどくさいプロンプト処理をやってくれてます.
xlogin | Vendor |
---|---|
alogin | Alteon WebOS switch login |
anlogin | Arbor Networks login |
avologin | Avocent login |
blogin | Bay Networks(Nortel) login |
clogin | Cisco login |
complogin | Compass login |
dllogin | D-Link login |
elogin | ADC EZT3 login |
flogin | foundry login |
fnlogin | fortinet login |
hlogin | hp login |
htlogin | Hitachi router login |
jlogin | juniper login |
mrvlogin | MRV optical switch login |
mtlogin | MikroTik router login |
nlogin | netscreen login |
nslogin | Netscaler login |
panlogin | Palo Alto Networks login (based on alogin) |
rivlogin | Riverstone (and Enterasys SSR) login |
rscmd | Riverstone Networks Automated login |
tlogin | Netopis login |
wlogin | Cisco Wireless Lan Controller login |
xilogin | Xirrus login |
残念なのは,github などにレポジトリがなくてソーシャルコーディングできないこと. ここにないデバイスをサポートしても,本家にマージしてもらうのがつらい.
認証情報
認証情報の持たせかたについても触れておきましょう.
認証情報は,あらかじめ~/.cloginrc
という設定ファイルに書いておかないといけません.
などを書いておきます.ログインする際 「xlogin に渡したデバイス名 を上から順に探し,最初にマッチした設定を使う」という動きをします. サーチドメインをつけた名前や,A レコードを引いたあとのIP アドレスではないことに注意です.デバイス名にはワイルドカードが使えます.
# ~/.cloginrc add method router4 {telnet:2605} add password router4 {zebra} {zebra} # default add user * {koji} add password * {login_passwd} {enable_secret}
~/.cloginrc
が他者に読まれそうなパーミッションであれば,xlogin 実行時に警告します.
設定方法の詳細はrancid web サイト にあります.プロンプトのカスタマイズや enable するかどうかなど,けっこう細かく設定できます.
その他のヒント
インストール
- deb パッケージがあるディストリビューションが多い.Debian, Ubuntu などは
apt-get
一発 - rpm パッケージは (たぶん)ないので,自分でつくらないといけない
- OSX であれば brew にある
ping 127.0.0.1
の応答がないと./configure
がコケる.OSX のfirewall など注意- ソースパッケージからビルドしてもよい.なぜか
./configure
でxlogin が生成される.「./bin/*login
だけ$PATH のどこかにコピー」とかよくやる
~/.cloginrc
をやめる
ファイルに認証情報を書くのは セキュリティ上いまいちなので,私はvault に保管しています. 完全ではありませんが,他者からアクセスする機会を大幅に減らせますし,認証情報へのアクセスログが取れます.ずいぶんマシ.
やりかたは別のエントリー を参照してください.
まとめ
xlogin の使い方とヒントについて説明しました.
ログインするとき ssh / telnet がわりに使うのはもちろんですが,自動でなにかするコードを書くときにも重宝しています. そのコードには「なにかする」ことだけを記述し,認証とコマンド実行をxlogin に切り出せば 少ない手数で見通しよくなりますし,認証レイヤーを共通化できます.
NETCONF を使いたくても,サポートしていないデバイスがあったりで xlogin + CLI パーサー を選ぶ局面はまだまだありそうです.残念ですけどね.