てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] callback plugin を yaml に変更して標準出力の改行を見やすくする

■ はじめに

Ansible には callback plugin という仕組みがあり、結果出力の形式を変更したりすることができます。 yaml に変更すると、改行コードごとに改行された形で標準出力されます。

本記事でも、callback plugin を yaml に変更する方法ど、出力例をご紹介します。

なお、本件は先日メンターとして参加させていただいた、Ansibleもくもく会 (サーバ編 & NW編)2019.07 での質疑応答でのやりとりの中で、参加者からいただいたコメントで気付きを得ました。 (いままで特に yaml に変更する用途が思い浮かびませんでた・・)

  • 動作確認環境: Ansible 2.8.0
  • 対象器機: Cisco DevNet Sandox 上の IOS-XE (とても便利です)


■ callback plugin を yaml に変更する

ansible.cfg環境変数などで変更できます(参考: DEFAULT_STDOUT_CALLBACK)。今回は、ansible.cfg で変更します。

[defaults]
stdout_callback = yaml

なお、ansible-playbook コマンドではなく、ansible コマンドでこの設定変更を有効にするためには、さらに bin_ansible_callbacks = True も必要です。


■ 出力例

Playbook

今回は、 ios_command モジュールを利用して、show version コマンドを実行し、出力結果の stdout を出力させます。

- hosts: ios
  gather_facts: no

  tasks:
    - name: test
      ios_command:
        commands:
          - show version
      register: result

    - name: debug
      debug:
        var: result.stdout

実行

$ ansible-playbook -i inventory ios_test.yml

PLAY [ios] ************************************************************************************************************

TASK [test] ***********************************************************************************************************
ok: [iosal1]

TASK [debug] **********************************************************************************************************
ok: [iosal1] => 
  result.stdout:
  - |-
    Cisco IOS XE Software, Version 16.08.01
    Cisco IOS Software [Fuji], Virtual XE Software (X86_64_LINUX_IOSD-UNIVERSALK9-M), Version 16.8.1, RELEASE SOFTWARE (fc3)
    Technical Support: http://www.cisco.com/techsupport
    Copyright (c) 1986-2018 by Cisco Systems, Inc.
    Compiled Tue 27-Mar-18 13:32 by mcpre
  
(...略...)

    3 Gigabit Ethernet interfaces
    32768K bytes of non-volatile configuration memory.
    16370384K bytes of physical memory.
    7774207K bytes of virtual hard disk at bootflash:.
    0K bytes of WebUI ODM Files at webui:.
  
    Configuration register is 0x2102

PLAY RECAP ************************************************************************************************************
iosal1                     : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

このように、改行コードが解釈された形で表示されます。

なお、

  result.stdout:
  - |-

|YAML で複数行の値を示す Syntax です。

参考(デフォルトの場合)

参考までに、デフォルトの場合の出力結果を抜粋して掲載します。

ok: [iosal1] => {
    "result.stdout": [
        "Cisco IOS XE Software, Version 16.08.01\nCisco IOS Software [Fuji], Virtual XE Software (X86_64_LINUX_IOSD-UNIVERSALK9-M), Version 16.8.1, RELEASE SOFTWARE (fc3)\nTechnical Support: http://www.cisco.com/techsupport\nCopyright (c) 1986-2018 by Cisco Systems, Inc.\nCompiled Tue 27-Mar-18 13:32 by mcpre\(...略...)3 Gigabit Ethernet interfaces\n32768K bytes of non-volatile configuration memory.\n16370384K bytes of physical memory.\n7774207K bytes of virtual hard disk at bootflash:.\n0K bytes of WebUI ODM Files at webui:.\n\nConfiguration register is 0x2102"
    ]
}

このように、改行コード \n はそのまま表示されます。

デフォルトの場合でも、stdout ではなく、stdout_lines を表示するようにすると、1行1リストアイテムとして表示されるので見やすいです。ただしクォーテーションが入ります。

ok: [iosal1] => {
    "result.stdout_lines": [
        [
            "Cisco IOS XE Software, Version 16.08.01", 
            "Cisco IOS Software [Fuji], Virtual XE Software (X86_64_LINUX_IOSD-UNIVERSALK9-M), Version 16.8.1, RELEASE SOFTWARE (fc3)", 
            "Technical Support: http://www.cisco.com/techsupport", 
            "Copyright (c) 1986-2018 by Cisco Systems, Inc.", 
            "Compiled Tue 27-Mar-18 13:32 by mcpre", 

(...略...)

            "3 Gigabit Ethernet interfaces", 
            "32768K bytes of non-volatile configuration memory.", 
            "16370384K bytes of physical memory.", 
            "7774207K bytes of virtual hard disk at bootflash:.", 
            "0K bytes of WebUI ODM Files at webui:.", 
            "", 
            "Configuration register is 0x2102"
        ]
    ]
}


■ まとめ

callback pluginyaml に変更して、改行コードごとに改行された形で標準出力されることをご紹介しました。

[2023/04/20]

この記事の4年後に、似たような記事をまた書いてしまったのでリンクを掲載します。以下の記事では、コレクションに移行後なので community.general.yaml という表記になっています。

tekunabe.hatenablog.jp