🐡
【Ansible】対話型コマンドの自動化(ttlモジュール)でシリアル接続しよう
はじめに
- こんにちは
- Ansinble で Serial接続 (シリアル接続) に対する需要としては主に古いルータにサーバからアクセス、というパターンが多いでしょう
- そうなるとネットワーク装置用の Ansible-connection がない可能性は非常に高いです
- 一方で teraterm は大変有益なツールで teraterm macro は自動化には大変有用なのですが、Windows上で動くので、Linuxから Serial 接続するものの自動化には向いていません
- ならば作ればよいのではなだろうか。我々は技術者なので
- ということで、 Ansible に ttl マクロ相当のコレクションを作成して LinuxのSerial接続を自動化しようというのが、この記事の趣旨となります
【注意】
本記事は、Ansibleの概念やplaybookの実行方法といった「Ansibleの基本」については紹介しておりませんのでご注意ください。
本記事を理解するには少なくとも以下の知識が必要です
- ansible ―― サーバー構成管理・デプロイ・運用タスクを自動化するためのオープンソースツール。Red Hat が開発、IaC(Infrastructure as Code)の代表格のひとつ
- ansible-galaxy ―― Ansible のコレクションを開発し pip3のように開発/ダウンロードできるようにしたコミュニティハブ
- teratermマクロ ―― Tera Term に付属するスクリプト言語で、端末操作を自動化するための仕組み
- 対話型コマンド ―― コマンド実行後にさらにコマンド入力が求められるようなものを指します。色々ありますが、例えば下記のようなものです
- sudoコマンド(コマンド実行後にパスワード入力を求められる)
- sshコマンド(パスワード入力を求められる)
- ttlコレクション ―― 後述
ttlコレクションとは
- teratermマクロはwindowsでしか動かないので、teratermマクロのヘルプを見ながら Pythonにできるかぎり移植したansible-galaxyのコレクションです
- 実装しているのは SSH2, serial, telnet への接続で、CLI部分となります。yes/noボックスなどのGUIには対応していません(というかリモート側のGUIとか開けません)
どうやって評価したの?
- serial 接続をするには当たり前ですが、接続するシリアルポートが必要です
- すると serial接続を実装したものが本当に動くのか確認しようがない、なんてことになりかねません
- 再現性のあるテストをするには仮想の serial 接続ができるようにする必要があります
- ここでは
socatコマンドを使いました - 以降の説明では /dev/pts/3 を想定した評価になります
$ socat -d -d PTY,raw,echo=0 PTY,raw,echo=0
2025/12/27 09:32:13 socat[44299] N PTY is /dev/pts/3
2025/12/27 09:32:13 socat[44299] N PTY is /dev/pts/4
2025/12/27 09:32:13 socat[44299] N starting data transfer loop with FDs [5,5] and [7,7]
どうやってインストールするの?
こちらでダウンロードできます
$ ansible-galaxy collection install tand0.ttl
使い方(ファイル名指定)
単純に ttl ファイルを呼ぶだけであれば ansible-playbook 側は以下のように指定します
- hosts: localhost
become: False
collections:
- tand0.ttl
tasks:
- name: pyttl filename.ttl
ttl:
filename: filename.ttl
register: ttl_output
- name: debug-stdout filename.ttl
debug:
var: ttl_output.stdout_lines
- ttl ファイルの中身は以下になります
- Windowsの場合には
/C=オプションには数字を入れてCOM0,COM1, …… のように表しますが、 Linuxではそれでは指定できないので/dev/配下を指定します - 物理の serial ポートであれば
/C=/dev/ttyS0のような感じになるでしょう - 実際のポート番号とかは `ls /dev/tty*' などで指定すればよいでしょう
- 単純に
pwdを打っているだけですが、teratermマクロに詳しければ好きなように書き換えられると思います
timeout = 30
command = "/C=/dev/pts/3"
connect command
command = "pwd"
sendln command
wait command
wait "$"
使い方(直接記載)
直接記載する場合は以下のようになるでしょう
- hosts: localhost
become: False
collections:
- tand0.ttl
tasks:
- name: pyttl filename.ttl
ttl:
cmd: |
timeout = 30
command = "/C=/dev/pts/3"
connect command
command = "pwd"
sendln command
wait command
wait "$"
register: ttl_output
- name: debug-stdout filename.ttl
debug:
var: ttl_output.stdout_lines
ttlコレクションのパラメータ
- ttlコレクションのパラメータは以下の通りです
- 細かい指定をしたいときに参考にしてください
| パラメータ | 内容 | 選択肢(デフォルト値) |
|---|---|---|
| dir | コマンド実行前に移動するディレクトリ先 | path(None) |
| cmd | 実行するTTLのテキスト。filenameと同時に指定された場合 cmdが先に実行されます | str(None) |
| filename | TTLマクロのファイル名 | str(None) |
| creates | ファイルがあった場合はスキップする | path(None) |
| removes | ファイルがない場合はスキップする | path(None) |
| ignore_result | False のとき、result値が0の場合はエラーになる | bool(True) |
| param | TTLマクロに渡す引数 | list(None) |
最後に
- いかがでしたでしょうか。対話型のコマンドは色々な種類があると思うのでttlコレクションをうまく使って自動化してみましょう!
Discussion