🐡

【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