てくなべ (tekunabe)

ansible / network / automation

[Ansible] ネットワーク機器に接続する条件はバージョンやコネクションブラグインによって異なる

はじめに

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 か、netconfping モジュールの組み合わせで接続確認ができます。 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_clinetconfhttpapi いずれのでも、実際にネットワーク機器に接続する必要があるまで接続しない仕様でした。