はじめに
Ansible では、ネットワークモジュール向けに主に以下の専用コネクションプラグインが用意されています(組み合わせはこちら)。
Ansible のバージョンや、利用するコネクションプラグインによって、ネットワーク機器に接続する条件が異なります。
例えば、file
モジュールはネットワーク機器に接続する必要はありませんが、実際の動作としては、接続する場合としない場合があります。
こちらの PR によって、Ansible 2.8 と 2.9 で挙動に差分が入りました。
この挙動の差分によって何が気になるかというと、
- Ansible をバージョンアップしたら、接続エラーが出るタイミングが変わった
- コネクションプラグインを変更したら、接続エラーが出るタイミングが変わった
といった場合に、原因に気づきにくいのではないかという点です。公式ドキュメントや CHANGELOG を確認しても、情報が見つかりません。
この記事では、Ansible 2.8 系と 2.9 系でそれぞれ実際に確認した確認した結果をまとめます。
- 確認環境
- Ansible 2.8.6、2.9.0
確認用 Playbook
以下の Playbook で確認します。
1つめの file
モジュールのタスクは、本来はネットワーク機器に接続する必要はありません。
2つめの *_command
モジュールのタスクは、接続する必要があります。
- hosts: all gather_facts: no tasks: - name: create directory file: state: directory path: logs run_once: yes - name: show version ios_command: # 対象OSに合わせて変える commands: - show version register: result
この Playbook を、意図的に誤った認証情報で実行します。
これにより、もし file
モジュールのタスクで、
- エラーになったら、ネットワーク機器に接続しようとしている
- エラーにならなかったら、ネットワーク機器に接続しない
ということが分かります。(もちろん他にも確認方法はあると思います)
確認結果
利用するコネクションプラグインやバージョンの組み合わせと、本来接続不要なモジュールでも接続するかどうかは、以下の結果になりました。
コネクションプラグイン | Ansible 2.8 | Ansible 2.9 | 確認した ansible_network_os |
---|---|---|---|
network_cli |
接続する | 接続しない | ios |
netconf |
接続する | 接続しない | junos |
httpapi |
接続しない | 接続しない | eos |
ping モジュールとの組み合わせは要注意
ネットワーク機器相手としては少しトリッキーですが、Ansible 2.8 までで network_cli
か、netconf
と ping
モジュールの組み合わせで接続確認ができます。
Ansible 2.9 で同様のことをすると、必ず "ping": "pong"
(成功) になってしまい、接続確認になりません。
内部的には、Ansible コントロールノード自身への ping モジュールの実行が成功したら OK という扱いになるためです。この点は注意が必要です。
なお、公式ドキュメントの「Network Debug and Troubleshooting Guide」では切り分けための接続確認として、ping モジュールではなく、eos_command
モジュール(ここでは Arista EOS向けの解説)を利用して、?
コマンドを実行する方法を掲載しています。この方法であれば、Ansible 2.8 でも 2.9 でも正しく接続確認できます。
まとめ
Ansible のバージョンや、利用するコネクションプラグインによって、ネットワーク機器に接続するタイミングが異なることを確認しました。
Ansible 2.9 では、network_cli
、netconf
、httpapi
いずれのでも、実際にネットワーク機器に接続する必要があるまで接続しない仕様でした。