peco+zsh+cloginで多数のルータへのログインを捗らせてみた

[peco](https://github.com/peco/peco)（インタラクティブにフィルタリングするツール）を活用して、ルータリストから目的のルータを検索して選択し、コンフィグ管理ツール[rancid](http://www.shrubbery.net/rancid/)のシスコルータ自動ログインスクリプト[clogin](http://www.shrubbery.net/rancid/man/clogin.1.html)を用いて、CUI/CLIでルータへのログインを捗らせてみました。

デモ画面：「nt-tky-rt1a」ルータを検索して自動ログイン
![clogin1-compressor.gif](https://qiita-image-store.s3.amazonaws.com/0/12026/e19eaa46-fd34-d97d-d6a8-7c1f2d5249f7.gif)

# はじめに
大量のルータがある場合、CUIでホスト名やIPアドレスを入力してログインすることは結構大変です。ホスト名やIPアドレスの補完が効けばどんなに楽かと常々思っていました。

とある勉強会でコマンド実行履歴から絞り込んでコマンドを実行しているデモを見て同じ仕組みを実現したいと考えました。調べた見たところ[peco](https://github.com/peco/peco)+zshで簡単なシェルスクリプトを記述するだけで、同じようなことができることが判明したため、作成してみました。

今回はCUI/CLIベースのツール（peco + zsh + clogin）を組み合わせて、ルータへのログインを捗らせてみました。
![clogin.007.png](https://qiita-image-store.s3.amazonaws.com/0/12026/98ae67a0-7612-7623-bb11-64fe246fad89.png)

## peco
[peco](https://github.com/peco/peco)はインタラクティブにフィルタリングするツールです。複数行のテキストを与えると、リスト形式で表示し、矢印キーで選択したり、文字列から検索など、自由にできます。

今回は事前に作成したCSV形式のルータリストからルータを絞り込んで、目的のルータにログインする仕組みを実現しました。

## clogin（rancid）
コンフィグ管理ツール[rancid](http://www.shrubbery.net/rancid/)には、シスコルータへの自動ログインスクリプト[clogin](http://www.shrubbery.net/rancid/man/clogin.1.html)が付属しています。
スクリプトの中にはexpectでルータにユーザ名、パスワードを送り、自動的にログインするスクリプトです。

## 仕組み
![clogin.010.png](https://qiita-image-store.s3.amazonaws.com/0/12026/14b56f0c-0a38-9028-f409-f811450eaac0.png)


# 環境
必要なものはzsh（Zシェル）と[peco](https://github.com/peco/peco)と[rancid](http://www.shrubbery.net/rancid/)です。
簡単なシェルスクリプトを作成して、CSV形式で保存したルータリストからインタラクティブに選択し、cloginコマンドでルータにログインできるようにします。

今回は下記の環境で構築しました。

* Ubuntu 16.04 LTS Server
* zsh 5.1.1
* peco v0.3.6
* rancid 3.3.0

## インストール
Ubuntuでは標準でzshとrancidがインストールされないため、aptコマンドでインストールします。合わせてログインシェルをzshに変更します。

pecoのバイナリ版が[peco/releases](https://github.com/peco/peco/releases)からダウンロードできるため、最新版のv0.3.6をダウンロードします。

```bash
- zshをインストール
$ sudo apt install zsh

- rancidをインストール
$ sudo apt install rancid

- ログインシェルをzshに変更
$ sudo chsh -s /usr/bin/zsh

- pecoをダウンロードし~/binに保存
$ wget https://github.com/peco/peco/releases/download/v0.3.6/peco_linux_amd64.tar.gz
$ mkdir ~/bin
$ cp peco_linux_amd64/peco ~/bin/
```

## 設定
設定に必要なファイル

* ~/routers.csv　ルータ一覧ファイル
* ~/.zshrc　ルータ検索関数とショートカットキーの登録

### routers.csv
ルータ一覧をExcelなどで作成し、CSVとして保存します。
今回はホスト名、機種名、実行するログインコマンドの順で記載しました。

```csv
# 形式：ホスト名、機種名、ログインコマンド
jt-hkd-rt1a,asr1000,clogin 172.16.1.54
jt-hkd-rt1b,c4000  ,clogin 172.16.1.164
jt-hkd-sw1 ,cat4900,clogin 172.16.1.93
〜略〜
nt-oky-sw5 ,cat4900,telnet 172.16.233.121
```

ルータ一覧のCSVフォーマット

* 第1カラム：ホスト名
* 第2カラム：機種名
* 第3カラム：ログイン用のコマンド

### zshrc
今回はzsh用のzshrcを下記のように定義しました。ポイントの下部の``func peco-select-routers()``周辺です。``bindkey '^xr' peco-select-routers``の定義によって、``Ctrl-X + R``キーを押した時に、``peco-select-routers()``関数が実行されます。``peco-select-routers()``関数はルータ一覧ファイルをpecoに渡してインタラクティブに検索できるようにします。

```zsh:~/.zshrc
# cloginは/usr/lib/rancid/binに保存され、標準ではPATHが通っていない
# $HOME/binと/usr/lib/rancid/binをPATHに追加
export PATH="$HOME/bin:/usr/lib/rancid/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"

# ルータの検索関数を定義
function peco-select-routers() {
  BUFFER=$(cat $HOME/routers.csv | \        # CSV読み込み
           sed -e 's/,/,\t/g' | \           # 見やすくするための前処理
           peco --query "$LBUFFER" | \      # peco実行し、フィルタリング
           awk 'BEGIN{FS=",\t"}{print $3}') # 第3カラム目のログインコマンドを抽出
  CURSOR=$#BUFFER
  zle clear-screen
}
# ショートカットキーの定義Ctrl-X + rを押すと、ルータの検索関数を実行
zle -N peco-select-routers
bindkey '^xr' peco-select-routers  # Ctrl-x + r
```

### 処理内容
インタラクティブに検索を可能にしているのは下記のコマンドの組み合わせです。各コマンドをパイプで渡して最終的に実行するコマンドを抽出します。

処理内容

1. ルータ一覧をcatコマンドでパイプに出力
2. 区切り文字のカンマにTABを追加して見やすくする
3. pecoでインタラクティブにフィルタリング
4. 選択された行から実行するコマンドをawkで抽出（第3カラム）

```zsh
  BUFFER=$(cat $HOME/routers.csv | \
           sed -e 's/,/,\t/g' | \
           peco --query "$LBUFFER" | \
           awk 'BEGIN{FS=",\t"}{print $3}')
```

# さいごに
比較的簡単なスクリプトを記載することで、ルータのログインが捗ります。今回はCSVファイルでルータリストを作成しました。
ルータのコンフィグやbindなどのDNSのゾーン情報を読み込むことで同じようなこともできます。

実際の現場で利用し、普段のログインが非常に捗るようになりました。是非皆さんもご活用してみてください。

# 参考文献

* [pecoる](http://qiita.com/tmsanrinsha/items/72cebab6cd448704e366) - Qiita
* [zshでpecoと連携するためのanyframeというプラグインを作った](http://qiita.com/mollifier/items/81b18c012d7841ab33c3) - Qiita
* [[Mac] zsh+oh-my-zsh環境にpecoを導入＆初期設定を行う](http://vdeep.net/mac-peco) - vdeep
* [RANCID+ViewVCでコンフィグ管理](http://d.hatena.ne.jp/stereocat/20111204/1322982683) - # cat /var/log/stereocat | tail -n3
* [【RANCID】NW機器コンフィグ差分管理ツールをインストール](https://genchan.net/server/2753) - GOISBLOG