はじめに
こちらの記事でお伝えしましたが、この度「Ansible 実践ガイド 第3版」の「5-3 ネットワーク機器の構成管理」を執筆させていただきました。
この記事では、裏話的な、執筆中に GitHub にあげた issue や、出会った issue をご紹介します。
- はじめに
- ■ junos_user モジュール の encrypted_password に関する WARNING
- ■ debugger で task_vars が更新できなかった
- ■ network_cli の接続タイミングの仕様変更(Ansible 2.9)
- ■ iosxr_* モジュールとコネクションプラグイン
- おわりに
■ 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 をあげておきました。
その後、ありがたいことに、修正してくださった方のPRが devel、stable-2.9、stable-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 をあげておきました。
最終的には、 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 を眺めていると偶然以下のコメントを発見しました。
Ansible 2.9 では、実際に接続が必要になるまで開始しない。逆に、 ios_command モジュールのように、ネットワーク機器にコマンドを実行するために接続が必要なモジュールが必要なタイミングで開始するということです。
回りくどい説明になってしまいましたが、結果としては、「Ansible 2.9 では network_cli と ping モジュールで必ず 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 モジュールを使ううえで役立つ、プロットフォーム個別のガイドが公式ドキュメント上に作成されました。
おわりに
「Ansible 実践ガイド 第3版」執筆中に GitHub にあげた issue や、出会った issue をご紹介しました。 日々変わっていくOSSの情報を紙媒体に落とし込むことの難しさを感じました。日頃から issue や PR を眺める習慣が多少あったので、それで救われたことがあったのはとかったです。一方で、メンテナンスしている方がには頭が下がります。