LGTM

Looks Good To Me

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 <デバイス名>

ログインする例 (IOS 系)

パスワードを自動入力しつつ telnet でログインしています.よく見れば,ログインと同時にenable になっていることがわかると思います.

上はQuagga の例ですが,IOS でも同じ動きです.

複数デバイスにコマンド実行する例 (Junos)

複数のJunos に対し,show version を実行します.Junos にはjlogin を使います.

jlogin -c "show version" <デバイス名1> <デバイス名2>

複数デバイスにコマンド実行する例 (Junos)

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 <コマンドファイル> <デバイス名>

複数コマンドを実行する例 (IOS-XR)

単純に逐次実行するだけなので,失敗時に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 という設定ファイルに書いておかないといけません.

  • ログイン方法 (ssh or telnet)
  • 接続先ポート
  • ユーザー名
  • ログインパスワード / enable シークレット
  • ...

などを書いておきます.ログインする際 「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 がコケる.OSXfirewall など注意
  • ソースパッケージからビルドしてもよい.なぜか./configure でxlogin が生成される.「./bin/*login だけ$PATH のどこかにコピー」とかよくやる

~/.cloginrc をやめる

ファイルに認証情報を書くのは セキュリティ上いまいちなので,私はvault に保管しています. 完全ではありませんが,他者からアクセスする機会を大幅に減らせますし,認証情報へのアクセスログが取れます.ずいぶんマシ.

やりかたは別のエントリー を参照してください.

まとめ

xlogin の使い方とヒントについて説明しました.

ログインするとき ssh / telnet がわりに使うのはもちろんですが,自動でなにかするコードを書くときにも重宝しています. そのコードには「なにかする」ことだけを記述し,認証とコマンド実行をxlogin に切り出せば 少ない手数で見通しよくなりますし,認証レイヤーを共通化できます.

NETCONF を使いたくても,サポートしていないデバイスがあったりで xlogin + CLI パーサー を選ぶ局面はまだまだありそうです.残念ですけどね.