てくなべ (tekunabe)

ansible / network automation / 学習メモ

[TTP] スペース含めて値を取得する

はじめに

ネットワーク機器の show コマンドのパーサーとして TextFSM や TTP (Template Text Parser) を使い分けています。

個人的には TTP が直感的に使える一方で、ちょっとしたことでつまずくことがあります。

例えば今回紹介する、スペースを含めて値を取得する場合です。

何も考えずにやると・・

例えば以下のコンフィグがある場合、

interface GigabitEthernet0/0
 description kingyo ugui oikawa
 negotiation auto

なんとなくで、以下のテンプレートにすると

<group name="interfaces">
interface {{ interface }}
 description {{ description }}
</group>

以下の結果になります。description が拾えてません。マッチしていないためです。

[
    {
        "interfaces": {
            "interface": "GigabitEthernet0/0"
        }
    }
]

description kingyo のような値であれば単純なテンプレートで取得できるのですが。

| re(".+") を添える

re を使って、スペースでもマッチする正規表現を指定します。

<group name="interfaces">
interface {{ interface }}
 description {{ description | re(".+") }}
</group>

これで、スペース含めて取得できます。

[
    {
        "interfaces": {
            "description": "kingyo ugui oikawa",
            "interface": "GigabitEthernet0/0"
        }
    }
]

公式ドキュメントの例 の例を参考にしました。

(おまけ) ignore(".+") だと

<group name="interfaces">
interface {{ interface }}
 description {{ description }} {{ ignore(".+") }}
</group>

だと、以下のように、スペースで区切られた値の最初のところだけしか取得できません。

[
    {
        "interfaces": {
            "description": "kingyo",
            "interface": "GigabitEthernet0/0"
        }
    }
]

参考

zaki-hmkc.hatenablog.com