てくなべ (tekunabe)

ansible / network / automation

[Ansible] eos_command モジュールで show コマンドの結果を JSON で取得する

はじめに

Arista EOS のネットワーク機器向けに、主に show コマンドを実行する eos_command というモジュールがあります。

このモジュールでは、コマンドの実行結果を JSON 形式でも取得できます。

簡単なサンプルでご紹介します。

試した限り コネクションプラグインnetwork_cli でのみ有効な技でした。eAPI を利用する httpapi ではエラーとなったのでご注意ください。

(なお、EOS で show hoge | jsonのようにすると JSON で取得できることは、Network Automation Cookbook という本で偶然知りました。)

Playbook

show version を実行して結果を JSON で取得して、表示する Plyabook です。

---
- hosts: eos
  gather_facts: false
  
  tasks:
    - name: showversion
      eos_command: 
        commands:
          - command: show version
            output: json             # ポイント
      register: result_version
    
    - name: debug
      debug:
        msg: "{{ result_version.stdout_lines[0] }}"

commands オプションに commandoutput: json を指定する点がポイントです。

手動で実行する場合の show version | json 相当です。

なので、

        commands:
          - show version
        output: json             # NG

ではないことにご注意ください。

実行結果

このように JSON になります。

TASK [debug] ********************************************************
ok: [eos1] => {
    "msg": {
        "architecture": "i386",
        "bootupTimestamp": 1593489252.0,
        "cEosToolsVersion": "1.1",
        "hardwareRevision": "",
        "internalBuildId": "9d960dea-a6da-424b-b373-2958c07c48c3",
        "internalVersion": "4.21.10M-15347597.42110M",
        "isIntlVersion": false,
        "memFree": 1169184,
        "memTotal": 2039264,
        "mfgName": "",
        "modelName": "cEOSLab",
        "serialNumber": "",
        "systemMacAddress": "02:42:ac:2a:8f:7d",
        "uptime": 19298.83,
        "version": "4.21.10M"
    }
}

JSON は キーをたどると値を絞れます。例えば、version だけ欲しいときは result_version.stdout_lines[0]`result_version.stdout_lines[0].version にすると

TASK [debug] *********
ok: [eos1] => {
    "msg": "4.21.10M"
}

となります。

通常は・・

output: json を指定しない場合は、以下のように通常の show コマンドの実行結果形式になります。

TASK [debug] ****************************************************************
ok: [eos1] => {
    "msg": [
        "cEOSLab",
        "Hardware version:    ",
        "Serial number:       ",
        "System MAC address:  0242.ac2a.8f7d",
        "",
        "Software image version: 4.21.10M",
        "Architecture:           i386",
        "Internal build version: 4.21.10M-15347597.42110M",
        "Internal build ID:      9d960dea-a6da-424b-b373-2958c07c48c3",
        "",
        "cEOS tools version: 1.1",
        "",
        "Uptime:                 0 weeks, 0 days, 5 hours and 23 minutes",
        "Total memory:           2039264 kB",
        "Free memory:            1169228 kB"
    ]
}

おわりに

JSON のように構造化データを OS の機能で取得できるのはとても便利だと思いました。

assert がはかどります。