『紙の手順書』でルータ設定を半自動化してみた with 二次元バーコードリーダ

この記事は、[NetOpsCoding Advent Calendar 2016](http://qiita.com/advent-calendar/2016/netopscoding)の2016年12月2日の記事です。

> **御礼** ： 本記事は[JANOG39ミーティングのライトニングトーク](https://www.janog.gr.jp/meeting/janog39/lt_vote)に応募したネタです。投票頂いた皆様ありがとうございました。

本記事はTwitterに以前投稿した動画について紹介します。下記のTwitterの動画の通り、二次元バーコードを印刷した紙の手順書を、二次元バーコードリーダで読み取り、シスコルータの設定変更します。
<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"><p lang="ja" dir="ltr">紙の手順書にQRコードをつけて、2次元バーコードリーダーで読み取り、ルータを設定してみました‼️ <a href="https://t.co/BHU337b1BV">pic.twitter.com/BHU337b1BV</a></p>&mdash; kooshin (@kooshin) <a href="https://twitter.com/kooshin/status/795952697396473856">2016年11月8日</a></blockquote>



## はじめに
ネットワークエンジニアがルータを設定する際は、テキスト形式やExcel方眼紙など、様々な形式で手順書を作ると思います。電子データであれば、パソコン上でコピー＆ペーストして、ルータのCLIから設定投入できます。しかしながら、手順書を紙に印刷すると、コピー＆ペーストができなくなり、手打ちする必要があります。

USBメモリなどデータ記録媒体の持ち込み制限が厳しいデータセンタでは、紙でしか手順書を持ち込めない場合があるかもしれません。また、持ち込みできたとしても、事前の申請など様々な手続きする必要があるかもしれません。そんな中でも『紙の手順書』であれば楽々持ち込みでき、作業品質や作業効率がアップするかもしれません。

そこで、あえて手順書を紙に印刷して『紙の手順書』でルータ設定を半自動化してみました。ルータ設定に利用するものは『二次元バーコードリーダー』と『二次元バーコードを印刷した紙の手順書』です。

バーコードリーダを使うことで、専門的な知識が不要になり、ネットワークエンジニア以外でも、ルータ設定ができるようになるかもしれません。


## 仕組み
『紙の手順書』に二次元バーコード（[QRコード](http://www.qrcode.com/)）を印刷し、それを二次元バーコードリーダで読み取ることで、ルータ設定を半自動化します。

『紙の手順書』を作成するために、ルータに投入する設定を事前にYAMLで記述します。手順書作成用のWebアプリを用いて手順書形式に変換します。Webブラウザで二次元バーコード付きの手順書を表示し、紙に印刷し、『紙の手順書』が完成します。

ルータ設定を半自動化するために、ルータにTELNETが可能なパソコンに二次元バーコードリーダを接続した環境を準備します。パソコン上のターミナルを起動し、『紙の手順書』を二次元バーコードリーダで読み取ることで、二次元バーコードに埋め込まれたコマンドが実行されます。



## 二次元バーコードリーダ
二次元バーコードリーダは秋葉原の中古ショップで購入した[デンソーウェーブ社製 AT10Q-SM](https://www.denso-wave.com/ja/adcd/product/qrcode/scanner/at10q-at10q-sb.html)を使用します。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">あっという間に10月も今日で終わりですね～♪お買い忘れ等ございませんか？本日も特価商品多数ご用意してお待ちしております(^^)/ <a href="https://twitter.com/hashtag/PC?src=hash">#PC</a> <a href="https://twitter.com/hashtag/PC%E3%82%B3%E3%83%B3%E3%83%95%E3%83%AB?src=hash">#PCコンフル</a> <a href="https://twitter.com/hashtag/%E7%A7%8B%E8%91%89%E5%8E%9F?src=hash">#秋葉原</a> <a href="https://twitter.com/hashtag/YAMAHA?src=hash">#YAMAHA</a> <a href="https://twitter.com/hashtag/VPN?src=hash">#VPN</a> <a href="https://twitter.com/hashtag/%E3%83%90%E3%83%BC%E3%82%B3%E3%83%BC%E3%83%89%E3%83%AA%E3%83%BC%E3%83%80%E3%83%BC?src=hash">#バーコードリーダー</a> <a href="https://twitter.com/hashtag/NIC?src=hash">#NIC</a> <a href="https://t.co/Jg4hiwvFSq">pic.twitter.com/Jg4hiwvFSq</a></p>&mdash; 中古PCショップ☆PCコンフル秋葉原店 (@PCcomfullAKB) <a href="https://twitter.com/PCcomfullAKB/status/792964261102297088">2016年10月31日</a></blockquote>

二次元バーコードリーダは、ハンディ型のコードリーダで、USBケーブルでパソコンと接続します。USB接続が可能なバーコードリーダは、USBキーボードとして動作するモードがあります。読み取ったばーコードの内容をメモ帳やExcelなどに直接出力できます。今回はこの機能を利用します。このため、二次元バーコードリーダに関する知識や開発は不要です。
![f1eac9fc0e3538d4ecac2ad355589290.png](https://qiita-image-store.s3.amazonaws.com/0/12026/88a42863-bdd8-2ba7-a92a-642c332221ea.png)



## 『紙の手順書』の生成
『紙の手順書』を生成するために、簡単なWebアプリをRubyで実装しました。ルータのコマンドを二次元バーコードに埋め込んだ手順書を作成します。



### 環境
試作した環境は下記のとおりです。Ruby/Sinatraで手順書作成用のWebアプリで実装しました。二次元バーコードの生成には``barby``ライブラリを使用しています。

- Ubuntu 16.04
- Ruby 2.3.0
- Webフレームワーク
    - Sinatra 1.4.7
    - slim 3.0.7
- 二次元バーコード生成
    - barby 0.6.4
    - rqrcode 0.10.1
- 手順書パラメータ
    - YAML


### プログラム
ソースコードはgithub上で公開しています。
https://github.com/kooshin/barcode-generator

手順書作成Webアプリは、3種類のファイルから構成された簡単なWebアプリです。

```txt
tejuns.yaml  - 手順書パラメータ
app.rb       - Webアプリ
views/*      - slimのHTMLテンプレート
```


#### 手順書パラメータ
手順書の内容はYAMLで定義します。今回は手順書の作成に必要な3つのパラメータをYAMLで記述します。

- name：手順書の名前（英数字）
- description：手順書の説明
- commands：二次元バーコードに生成する内容

今回の例では、commandsにルータを設定する際に投入するコマンドを定義します。

```yaml:tejuns.yaml 
- name: tejun1-config
  description: ルータにVRFとIPアドレスを割当
  commands:
    - "telnet 192.168.88.5\ncisco\ncisco"
    - "enable\ncisco\nterminal length 0"
    - "show run vrf VRF1\nshow run int Vlan101"
    - "conf t\n vrf definition VRF1\n  address-family ipv4\n interface Vlan101\n  vrf forwarding VRF1\n  ip address 192.168.1.1 255.255.255.0\n  no shut\nend"
    - "show run vrf VRF1\nshow run int Vlan101"
    - "exit"
```


#### Webアプリ
二次元バーコードの生成は下記の``create_barcode_image``メソッドでPNG画像を生成し、base64エンコーディングしたデータをIMGタグに埋め込みます。Rubyで二次元バーコードを生成する方法については[一次元/二次元バーコードを生成する for Ruby](http://qiita.com/kooshin/items/0afd50fa7c647d23af4a)を参照してください。

```rb:app.rb
  def create_barcode_image(content)
    code = Barby::QrCode.new(content, size: 7)
    code.to_image(xdim: 2).to_data_url
  end
```


Sinatraのルーティングは非常にシンプルで、一覧と表示の2つの画面のみです。

```rb:app.rb
# 手順書を一覧表示
get '/' do
  slim :index
end

# 指定された手順書の二次元バーコードを表示する
get '/:name' do
  @tejun = select_tejun(params[:name])
  slim :tejun
end
```


手順書の一覧を表示するslimテンプレートです。単純にtejuns.yamlの内容を一覧表示をしています。

```rb:views/index.slim 
.page-header
  h1 二次元バーコード手順書一覧

ul.list-group
  - tejuns.each_with_index do |tejun, i|
    a.list-group-item href="/#{tejun['name']}"
      .row
        .col-xs-1
          = i + 1
        .col-xs-3
          = tejun['name']
        .col-xs-8
          = tejun['description']
```


手順書を表示するslimテンプレートです。tejuns.yamlの指定されたコマンド一覧を二次元バーコードで表示します。

```rb:views/tejun.slim 
.page-header
  h1 二次元バーコード手順書ジェネレータ
  h2
    small
      = @tejun['description']

- @tejun['commands'].each do |command|
  .row
    .col-xs-2
      img src="#{create_barcode_image(command)}"
    .col-xs-10
      pre style="margin-top: 10px"
        = command
```



### 実行結果
手順書一覧を表示するトップページです。印刷したい手順書を選択します。
![一覧.png](https://qiita-image-store.s3.amazonaws.com/0/12026/e96fd31d-0a21-82d7-85fe-262f0154102b.png)

手順書を選択すると、二次元バーコード付きの手順書が表示されます。
![表示.png](https://qiita-image-store.s3.amazonaws.com/0/12026/0df191e7-55e1-4f16-b03d-45f56f494b20.png)



## デモ
紙のデモ画面は一番上のTwitterの動画を参照してください。

紙に印刷した手順書を元にして実行する以外にも、パソコンの画面から直接もできます。ただし、ノングレア液晶は二次元バーコードリーダで読み取りできませんでした。つるつるテカテカしたグレア液晶の場合はかろうじて読み取り可能です。下記はMacBookAirの画面で二次元バーコードを表示して、二次元バーコードリーダで読み取りしています。

<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"><p lang="ja" dir="ltr">QRコードにルータのコマンドを埋め込み、2次元バーコードリーダーで読み取るとこで、コマンドの実行を素早く正確にできるようになった‼️ <a href="https://t.co/lFlKjcNX77">pic.twitter.com/lFlKjcNX77</a></p>&mdash; kooshin (@kooshin) <a href="https://twitter.com/kooshin/status/795243905209876480">2016年11月6日</a></blockquote>



## 参考
* [バーコードのしくみ](http://www.keyence.co.jp/barcode/special/codereader/lecture/basic/mechanism/) - 株式会社キーエンス
* [QRコードとは？](http://www.qrcode.com/about/) - コードドットコム（株式会社デンソーウェーブ）

* [github - toretore/barby](https://github.com/toretore/barby) - github
* [Rubyで簡単にQRコード画像を生成する方法](http://qiita.com/ryosy383/items/c753103c93fa177e4466)  - Qiita
* [Ruby ( Rails ) で 文字を追加した QR コードを簡単に生成する方法](http://qiita.com/yutackall/items/d68c8c95aa7aa0a3b542) - Qiita

* [一次元/二次元バーコードを生成する for Ruby](http://qiita.com/kooshin/items/0afd50fa7c647d23af4a) - Qiita