てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] 「Ansible 実践ガイド 第3版」執筆中にあげた issue、出会った issue

book.impress.co.jp

はじめに

こちらの記事でお伝えしましたが、この度「Ansible 実践ガイド 第3版」の「5-3 ネットワーク機器の構成管理」を執筆させていただきました。

この記事では、裏話的な、執筆中に GitHub にあげた issue や、出会った issue をご紹介します。


■ junos_user モジュール の encrypted_password に関する WARNING

「5-3-3 ネットワーク期設定変更の実装」で登場する Playbook で junos_user モジュールを利用しています。Junos の機器に対して、ユーザーを追加や削除するモジュールです。

Ansible 2.8.3 で動作確認をしていた時に、以下の WARNING が表示されることに気が付きました。

 [WARNING]: Module did not set no_log for encrypted_password

encrypted_password オプションは、パスワードを設定するオプションであるのに対して、no_log というログに表示させないための内部の設定がされていない、という旨の WARNINGです。本書の Playbook では encrypted_password オプションは利用していませんが、それでも表示されるのが気になったため、以下の issue をあげておきました。

github.com

その後、ありがたいことに、修正してくださった方のPRが develstable-2.9stable-2.8 ブランチにマージされました。2.8 系については、 Ansible 2.8.6 で修正されました。

  • リリースノート

https://github.com/ansible/ansible/blob/stable-2.8/changelogs/CHANGELOG-v2.8.rst#bugfixes

junos_user - Add no_log=True to junos_user encrypted_password (https://github.com/ansible/ansible/pull/62184)


■ debugger で task_vars が更新できなかった

「7-4-4 Playbook Debugger」では、Playbook の実行を途中でとめて、変数の値を確認、変更などできる、Playbook Debugger の使い方を紹介しています。

Ansible 2.7.0rc4 で動作確認をしていた時に、 task_vars コマンドでタスクの変数を更新しても、実際の動作に反映されない現象に出会いました。どこかのバージョンでこうなってしまったようです。以下の issue をあげておきました。

github.com

最終的には、 task_vars を変更したら、debugger 上の update_task という新しいコマンドを実行する、という手順で対応していただきました。 github.com

Ansible 2.8.0 で修正されました。changelog には見当たりませんが、Playbook Debugger のページには、u(pdate_task)New in version 2.8. と記載されています。

書籍内でも update_task を紹介しています。


■ network_cli の接続タイミングの仕様変更(Ansible 2.9)

この件が一番悩ましかったです。Ansible 2.9 で予定されている仕様変更です。 本書は Ansible 2.8 前提ですし、執筆時リリース Ansible 2.9 は未リリースなので、問題ないといえば問題ないのですが、この点だけはどうしても気になりました。(全部気にしていると、そもそも Ansible 2.8 の本ではなくなる)

この仕様変更が何に影響しそうだったかというと「5-3-1 ネットワークモジュールの特徴」内の「接続確認の方法」です。ここは、インベントリを作って、変数定義を作ったところで ansible コマンドで接続確認してみましょう、というところです。

当初は、 ping モジュールの組み合わせを利用していました。Ansible 2.8 までは、network_cli コネクションプラグインでは、ping モジュールを使うタイミングで、実際にネットワーク機器に接続していました。つまり、ping モジュールのようにネットワーク機器へ接続不要なモジュールでも、接続しにいきます。この性質を利用して接続確認の手順としていました。(ややこしい話ですが、サーバー相手に ping モジュール使うのとは事情が異なります)

ところが、何気なく issue を眺めていると偶然以下のコメントを発見しました。

github.com

Ansible 2.9 では、実際に接続が必要になるまで開始しない。逆に、 ios_command モジュールのように、ネットワーク機器にコマンドを実行するために接続が必要なモジュールが必要なタイミングで開始するということです。

回りくどい説明になってしまいましたが、結果としては、「Ansible 2.9 では network_cliping モジュールで必ず OK になってしまい、接続確認したことにならない」ということになります。

結局は ios_command モジュールを利用する例に差し替えました。一連の執筆作業のかなり終盤での修正でした。編集の方には感謝感謝です。

なお、本件については、2019/11/20 開催のAnsiblejpネットワーク部 2019.11の発表でも触れる予定です。


■ iosxr_* モジュールとコネクションプラグイン

(ちょっと忘れかけています) Ansible 2.8 でも、ioxrs_* モジュールは、モジュールによって network_cli や netconf コネクションプラグインに対応していました。どちらも使えるモジュールについては、「でればあっちを使ってね」といった旨の WARNING が表示されました。そのことも書こうと思っていたのですが、Ansible 2.9 で修正される気配があったので言及はさけました(どのPRかは失念)。 なお、Ansible 2.9 では、IOS XR モジュールを使ううえで役立つ、プロットフォーム個別のガイドが公式ドキュメント上に作成されました。

docs.ansible.com


おわりに

Ansible 実践ガイド 第3版」執筆中に GitHub にあげた issue や、出会った issue をご紹介しました。 日々変わっていくOSSの情報を紙媒体に落とし込むことの難しさを感じました。日頃から issue や PR を眺める習慣が多少あったので、それで救われたことがあったのはとかったです。一方で、メンテナンスしている方がには頭が下がります。