てくなべ (tekunabe)

ansible / network / automation / StackStorm

[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 に変更して、改行コードごとに改行された形で標準出力されることをご紹介しました。

[Ansible] 実験的サポートが開始された名前空間機能 Ansible Collections

はじめに

[Ansible] Ansible 2.8 リリース、便利機能や注意点まとめ - てくなべ (tekunabe) でも少し触れたた通り、Ansible 2.8 から Ansible Collections という機能が実験的サポートとして追加されました。

正直、詳細はまだ理解できていないのですが、名前空間の新しい仕組みのようです。まだまだ情報が少ないのですが、公式の情報のリンクをまとめておきます。

Ansible 2.8 の Changelog

ansible/CHANGELOG-v2.8.rst at stable-2.8 · ansible/ansible · GitHub

Experimental support for Ansible Collections and content namespacing - Ansible content can now be packaged in a collection and addressed via namespaces. This allows for easier sharing, distribution, and installation of bundled modules/roles/plugins, and consistent rules for accessing specific content via namespaces.

Ansible 公式ドキュメント

docs.ansible.com 本記事投稿時現在、develバージョン(2.9相当)のドキュメントにしか掲載されていません。

Ansible Galaxy 公式ドキュメント

galaxy.ansible.com

Webinar

www.ansible.com

ブログ

www.ansible.com

In future releases, we plan for content Creators to be able to provide their content in a package format called a Collection. Collections will be able to be “installed” in the appropriate location for execution whether that’s on the Ansible control node or the managed node. The Collection Creator will be able to provide execution details via roles and playbooks in the package itself. The before mentioned changes to Ansible Engine will allow Collections to be one way to detach content from the official Ansible Engine software delivery process.

ネットワーク機器のコンフィグの固有情報を「匿名化」するツール netconan

はじめに

ネットワーク機器のコンフィグファイルをどこかに提示する際、パスワードや IP アドレス、SNMP コミュニティ名などの固有情報をマスクしたり、変更したりする機会はないでしょうか。 netconan はそれを自動で変換してくれるツールです。

github.com

インストール

pip ですぐにインストールできます。

pip install netconan

使い方

オプションで、コンフィグファイル名や、匿名化の詳細を指定します。

  • -i オプションで対象のコンフィグファイル(またはディレクトリ)
  • -o オプションで出力先のファイル名(またはディレクトリ)
  • IPアドレスを匿名化する場合は、-a または --anonymize-ips オプションを指定します
  • -w オプションで「この単語があったら匿名化して」という指定もできます

詳細は、README を参照してください。

以下、ヘルプを転記します。

$ netconan --help
usage: netconan [-h] [-a] [-c CONFIG] [-d DUMP_IP_MAP] -i INPUT
                [-l {DEBUG,INFO,WARNING,ERROR,CRITICAL}] [-n AS_NUMBERS] -o
                OUTPUT [-p] [-r RESERVED_WORDS] [-s SALT] [-u]
                [-w SENSITIVE_WORDS] [--preserve-prefixes PRESERVE_PREFIXES]

Args that can start with '--' can also be set in a config file (specified via
-c). If an arg is specified in more than one place, then command line values
override config file values which override defaults. Config file syntax
allows: key=value, flag=true, stuff=[a,b,c] (for more details, see here
https://goo.gl/R74nmi).

optional arguments:
  -h, --help            show this help message and exit
  -a, --anonymize-ips   Anonymize IP addresses
  -c CONFIG, --config CONFIG
                        Netconan configuration file with defaults for these
                        CLI parameters
  -d DUMP_IP_MAP, --dump-ip-map DUMP_IP_MAP
                        Dump IP address anonymization map to specified file
  -i INPUT, --input INPUT
                        Input file or directory containing files to anonymize
  -l {DEBUG,INFO,WARNING,ERROR,CRITICAL}, --log-level {DEBUG,INFO,WARNING,ERROR,CRITICAL}
                        Determines what level of logs to display
  -n AS_NUMBERS, --as-numbers AS_NUMBERS
                        List of comma separated AS numbers to anonymize
  -o OUTPUT, --output OUTPUT
                        Output file or directory where anonymized files are
                        placed
  -p, --anonymize-passwords
                        Anonymize password and snmp community lines
  -r RESERVED_WORDS, --reserved-words RESERVED_WORDS
                        List of comma separated words that should not be
                        anonymized
  -s SALT, --salt SALT  Salt for IP and sensitive keyword anonymization
  -u, --undo            Undo reversible anonymization (must specify salt)
  -w SENSITIVE_WORDS, --sensitive-words SENSITIVE_WORDS
                        List of comma separated keywords to anonymize
  --preserve-prefixes PRESERVE_PREFIXES
                        List of comma separated IPv4 prefixes to preserve

対応ベンダー

残念ながら一覧になっているドキュメントが見当たりませんでした。 例示されているのは Cisco です。試せてもいませんが、過去の issue などを見ると他に、Juniper、Arista について言及するものはありました。

まとめ

ネットワークコンフィグファイルを「匿名化」するツール netconan をご紹介しました。 この手の作業は意外と手間で、漏れも発生しがちなので、本ツールの活用を検討してみてはいかがでしょうか。

DevLOVE X、やらかした(いい意味で)

■ DevLOVE X とは

f:id:akira6592:20190629211239j:plain

2019/06/22 - 23 に、DevLOVE X を開催しました。 devlove.doorkeeper.jp devlove.wixsite.com

DevLOVE X は、DevLOVEという開発(Develop)を愛する人たちのコミュニティの10周年を記念したイベントです。ことの始まりは2008年6月21日。つまり実際は丸11年だったりもします。

2days、60を超えるセッション、5トラックという規模感です。

資料まとめ

まとめありがとうございます。

DevLOVE Xのスライドまとめ #devlovex - 名前考えるの苦手

devlovex を含むはてブ

はてブありがとうございます。

本文 「devlovex」 を検索 - はてなブックマーク

toggeter

まとめありがとうございます。

devlovexに関連する86件のまとめ - Togetter


■ スタッフをやってきました

このイベントのスタッフとして数ヶ月間関わってきました。当日はルームDという部屋の司会を2日間担当しました。twitterの反応を見ながら1日目と2日目のやり方を少し変えたりしました。

続々と揃う登壇者の面々、集まる参加者。そして当日の熱気。 もちろんここまででも充実感に満たされたのですが、その後もぞわぞわした感触に見舞われました。


■ 続々と集まる参加、登壇報告ブログ

その感触は、イベント後に続々とアップされる参加報告によるものでした。やらかしたぞ、これは、と。登壇者によるすばらしいセッションの数々と、参加者によるアウトプットという行動に感謝です。ブログ書くのは初めてという方もいらっしゃって、そんな機会を作れたことをとてもうれしく思います。

ここでは感謝の意味を込めて、私が見つけられた範囲で、参加や登壇、スタッフ報告のブログをまとめます。

ykmc09.hateblo.jp shinyorke.hatenablog.com poohsunny.hatenablog.com iwakiri.hatenablog.com takaking22.com note.mu hub.attractor.co.jp daiksy.hatenablog.jp blog.samuraikatamaris.red note.mu run-around.hatenablog.com keinumata.hatenablog.com www.tsuyok.work note.mu medium.com www.yohhatu.com sun0range.com makow.hatenablog.com shinkufencer.hateblo.jp shinkufencer.hateblo.jp tenten0213.hatenablog.com sun0range.com shacho.beproud.jp arclamp.hatenablog.com hmatsu47.hatenablog.com hmatsu47.hatenablog.com kobase16.hatenablog.com note.mu note.mu note.mu sadayoshi-tada.hatenablog.com note.mu note.mu medium.com note.mu note.mu note.mu

■ さいごに

登壇者みなさま、スポンサー各社さま、会場提供&当日スタッフしていただいたナビタイムジャパンさま、そしてご参加いただいたみなさま、ありがとうございました!

スタッフのみなさんもおつかれさまでした!!

[Ansible] ネットワークプラットフォームのバージョンとサポートの関係

はじめに

Ansible は、Ansible 2.8 現在 50以上のネットワークプラットフォームに対応しています。

プラットフォームごとに、どのバージョンでテスト、サポートされているかの情報が、探すのにやや手間取ってしまうので、こちらにリンクまとめておきます。

Ansible Network Team でメンテナンスされているネットワークモジュール

docs.ansible.com

Ansible のバージョンとネットワークプラットフォームのバージョンのマトリックス

access.redhat.com

その他 参考

www.redhat.com

[Ansible] 小ネタ: Playbook は JSON で書ける

はじめに

※あくまで小ネタの話なので実運用で利用するのはおすすめしません。

YAML は JSON のほぼスーパーセットなのであれば、JSON で Playbook を書けるのでは?と思ったことがあったので試してみました。

Playbook

$ cat test.yml 
[
  {
    "gather_facts": false, 
    "connection": "local", 
    "tasks": [
      {
        "debug": {
          "msg": "hello!"
        }
      }
    ], 
    "hosts": "localhost"
  }
]
  • (参考) 上記 Playbook を通常通り YAML で書いた場合
- hosts: localhost
  gather_facts: false
  connection: local
  
  tasks:
    - debug:
        msg: "hello!"

YAML から JSON への変換を試すには、このようなサービスを利用するとお手軽です。

実行

$ ansible-playbook -i localhost, test.yml 

PLAY [localhost] ******************************************************************************

TASK [debug] **********************************************************************************
ok: [localhost] => {
    "msg": "hello!"
}

PLAY RECAP ************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0   

できました。(Ansible 2.7)

Playbook のリストやディクショナリの関係がよく分からなくなったりした場合、JSONで書いたり眺めたりすると良い練習になるかも知れません。

補足

Ansible では YAML 1.1 を扱いますが、YAML 1.2 の仕様には

The primary objective of this revision is to bring YAML into compliance with JSON as an official subset.

という記載があります。

[Ansible] エラー「paramiko is not installed: No module named 'paramiko'」の原因と対策

■ エラーの原因と対策

Ansible コントールノードに paramiko (PythonSSHクライアント実装ライブラリ)がインストールされていない環境で、Ansible を実行すると、以下のようなエラーが表示されて異常終了してしまいます。

fatal: [iosao1]: FAILED! => {"msg": "paramiko is not installed: No module named 'paramiko'"}

対策としては、paramiko をインストールします。

pip install paramiko


■ 補足

Ansible 2.8 以降でネットワークモジュール利用時に注意

Ansible 2.7 台までは、 paramiko も一緒にインストールされる構成でしたが、Ansible 2.8 から一緒にインストールされない構成になりました。

2.8 からのドキュメントにも関連の記述が追記されました。

In order to use the paramiko connection plugin or modules that require paramiko, install the required module

paramiko was included in Ansible’s requirements.txt prior to 2.8.

これでも、例えばサーバーに対して ssh コネクションプラグインで接続する場合は問題ありません。paramiko を利用しないためです。 一方で、ネットワークモジュールとセットで利用する network_cli コネクションプラグインで接続する場合は、内部で paramiko を利用するため paramiko がないと前述のようなエラーになってしまいます。

例えば以下のような Playbook です。

- hosts: iosal
  gather_facts: no
  connection: network_cli

  tasks:
    - name: show version
      ios_command:
        commands:
          - show version

2.7 からのアップデートの場合は paramiko が残る

Ansible 2.7 までのバージョンから 2.8 にアップデートすると、paramiko は残ります。 そのため、「Ansible 2.8 の環境なのに、paramiko がないエラーが出る環境と出ない環境がある」という現象が起こりえます。

  • Ansible 2.7.10 から pip install -U ansible して 2.8.0 にアップデートした場合
$ pip list
Package      Version
------------ -------
ansible      2.8.0  
asn1crypto   0.24.0 
bcrypt       3.1.6  
cffi         1.12.3 
cryptography 2.6.1  
Jinja2       2.10.1 
MarkupSafe   1.1.1  
paramiko     2.4.2    <--
pip          10.0.1 
pyasn1       0.4.5  
pycparser    2.19   
PyNaCl       1.3.0  
PyYAML       5.1    
setuptools   39.0.1 
six          1.12.0 
  • Ansible 2.8 を新規インストールした場合の pip list
$ pip list
Package      Version
------------ -------
ansible      2.8.0  
asn1crypto   0.24.0 
cffi         1.12.3 
cryptography 2.6.1  
Jinja2       2.10.1 
MarkupSafe   1.1.1  
pip          10.0.1 
pycparser    2.19   
PyYAML       5.1    
setuptools   39.0.1 
six          1.12.0 

ncclient インストールで一緒に paramiko もインストールされる

Junos モジュールなどではnetconf コネクションプラグインで接続します。そのため、NETCONF 接続 Python ライブラリである ncclient を別途インストールします。 この際、paramiko も一緒にインストールされる構成になっています。