Teratermマクロのフレームワークを作った

宣伝するならQiitaがいいかなと思っての初投稿です。

まず最初に、今は2019年なわけですよ。新年号令和に変わって早半年ですよ。そんな時代にも関わらずTeratermマクロ？ そのフレームワーク？ と思いながら記事を開いてくれた人がいらっしゃったらありがとうございます。投稿日間違えてません。タイムリープもしてませんよ。

## 導入 〜この記事の対象者

インフラエンジニアで、なおかつ作業用端末にteratermやExcel程度しか入っていない残念な人達を対象とした記事です。

前提として弊社の業務内容を軽く説明すると、他の会社にお邪魔してネットワーク機器やサーバの構築をしてくるエンジニアが会社を支えるIT企業です。違う言い方をすると、SES事業を主幹としたIT企業です。

出向先でのSESの業務内容は色々ありますが、割とありがち（だと思っている）のは、Excelで設計書や構築手順書を書いて、teratermを操作して構築作業を行うというものではないでしょうか。

そういう現場に行くたびに思うんですが、「設定前の状態を目視で確認して、設定を変更して、設定後の状態を再度確認する」みたいな構築手順です。これ、僕がエンジニアになってから何年も変わらず同じなんですが、そろそろ別のやり方に変わったりしないものですかね。

ここ10年ほどで、モバイル端末の殆どはガラケーからスマホへ変わっていき、通信量は増大し、技術の進歩についていくための様々な業務効率化ユーティリティが登場し、AIやRPAが流行ったり。。。とIT業界は大きく変わってきているように思います。

その中で、相変わらずインフラ構築は「設定の目視確認」ですよ。これ、どうにかしたいなぁと思う今日このごろです。

Ansibleとかいいですよね。yaml書くだけで作業の一連の流れが自動化できる。でもAnsible動かすためのPython/Linux環境がない。現場で渡される端末はWindows7にteratermが入っているだけ。。。この流れ、まだしばらく変わらないんだろうなぁと日頃から思っています。

じゃあ今の環境でどうにか改善する方法がないだろうか。幸いにもWindows用ターミナルクライアントのデファクトスタンダードたりえるteratermにはできることが比較的多い独自のマクロ機能がついている。

これを活用しない手はない！

というわけで、業務の合間を縫ってteratermマクロをもうちょっと使いやすくするためのフレームワークを作りました。長々とした導入で申し訳ありませんが、そういうことです。

## Teratermマクロフレームワーク「Teracotta」の紹介

ソースは以下

[Teracotta - GitHub.com](https://github.com/guskma/teracotta)

ちょっと凝ったteratermマクロ。ということでテラコッタと命名しました。本来テラコッタとは、イタリアの粘土細工である terra cotta のことを指します。

README.mdにも書きましたが、Teracottaでできることをこちらにも掲載します。


* **機器リスト、コマンドリストを読み込むための標準機能**
よく一般的に書かれているTeratermマクロでは、コマンドリストと機器リストを読み込んでそれぞれの機器にコマンドを流すのをしてると思います。Teracottaでは、機器リストを**インベントリ**、コマンドリストを**シナリオ**と呼んで標準機能としています。

* **INI形式で書くシナリオ**
機器への接続(telnet/ssh/console) から、ログ取得、コマンド実行などを自動化するためにTeratermマクロを書く必要はありません。INI形式で書くことのできるシナリオには、対応するTeracottaAPI名を書くだけで操作の自動化をすることができます。

* **CSV形式で書くインベントリ**
どの機器に入って操作するかはインベントリにCSV形式で記述します。インベントリには、ログインするために必要なIPアドレスやログイン名/パスワードだけでなく、各機器に固有の設定などを記述することにより確認作業や設定作業を自動化することもできます。

* **抽象化を目指して設計しているAPI群**
シナリオを通して呼び出すAPIは、機器によって操作方法が異なることを想定した抽象化ができるように設計してあります。そのためため、ベンダー毎にいちいちコマンドを覚え直す必要はありません。どんな機器であっても、ログインするときはログインと指定してあげるだけで済みます。

* **Teratermマクロに不足していた関数を補完**
Teratermマクロには存在しないリッチなマクロ関数を用意しています。例えばIPv4を判定するための機能やプロンプトを取得するための機能など。かゆいところに手が届きます。

* **マクロ作成で陥りがちな不具合への対応**
Teratermマクロを動かす際に陥りがちな不具合を解決しています。表示に時間のかかるコマンドを打ったら最後まで表示されずに画面が閉じてしまった！ みたいな経験はありませんか？ `waitほにゃらら` なteratermマクロの内部処理の違いがわかれば解決できることは多いです。

* **独自APIを拡張**
Teracottaはマクロでできるいろいろなことをリッチにはしていますが、それでも出来ないことは多いです。対応機器も今のところほとんどありません。なので足りない部分は独自で用意できるような仕組みにしてあります。ユーザAPIを自作することにより、今まで書いていたTeratermマクロと同程度の労力で (あるいはログイン処理などを意識しない分より省エネルギーに) 新たなマクロを書くことが出来ます。

とまぁこんな感じで、基本的にはteratermマクロでは不足していた機能を用意しているのが主です。

例えばCSVやINIの読み込み、IPv4アドレスの判定、プロンプトそのものを抽出する機能などは地味にほしいと思っていた人がいたんじゃないでしょうか？ (いてほしい)(少なくとも僕は欲しかった)

あと、インベントリだったり抽象化だったり、Ansibleを結構意識しています。ホントはこんなもの作らなくてもすでに自動化に便利なツールが存在するんだからそっち使えばいいんですよ。でも使えない環境が多いんだから仕方ないじゃないですか！

## ぜひともTeracottaを使ってみてください

TeracottaはTeratermマクロを効率的に使うためのフレームワークです。

GitHubでTeratermマクロを調べたところ、こういったまともな知見が集まったコードがなかったので、おそらく初の試みなんじゃないでしょうか。
~~※そもそもTeratermマクロにそこまで本気で取り組む必要がない~~
作業PCがWindows、Excel、Teratermという固定観念に囚われている現場が多いうちは何らかの使いみちが必ずあると僕は考えています。

なので、ぜひとも業務PCに落としてアレコレ弄ってみてください。
おそらく最初は使い方がわからなくて戸惑うかもしれません。慣れれば絶対にTeracotta無しでは生きていけない身体になっているはずです。

そして、もし機能に不満が出てきた場合はご意見をいただけると嬉しいです。

Twitterもやってますが、普段はActivityPubを漂っています。マストドン、Pleroma、Misskeyなどをやっている方はそちらからどうぞ(詳しくはプロフィールから)

もちろん、GitHubの方でIssue書いてくれたりプルリク出してくれたりしてくれても結構です。というかソッチのほうで貢献してくれるととてつもなく喜んで踊りだしてしまいます。

長々となりましたが以上です。どうぞTeracottaをよろしくおねがいします。