Junosデバイス管理時のAnsible接続エラーのトラブルシューティング
以下のセクションでは、Ansible を使用して Junos デバイスを管理する際に発生する可能性のある接続エラーについて説明します。また、各エラーの考えられる原因と解決策についても説明します。
接続の失敗、不明なコマンド、またはインタープリターが見つかりませんエラーのトラブルシューティング
問題点
説明
juniper.deviceコレクションからjuniper.deviceモジュールまたはjunipernetworks.junosモジュールを実行すると、Ansible制御ノードは、接続の失敗、不明なコマンド、またはPythonインタープリターを見つけることができないというエラーを生成します。次に例を示します。
UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ", "unreachable": true}
または
unknown command: /bin/sh\r\n
または
[ERROR]: Task failed: Action failed: The module interpreter '/home/user/projects/Ansible/.venv/bin/python' was not found.
原因
これらのエラーは、Ansible制御ノードがモジュールをローカルで実行しない場合に発生することがあります。
通常、AnsibleにはマネージドノードにPythonが必要です。Ansible制御ノードは、モジュールをノードに送信し、そこで実行されてから削除されます。 juniper.device モジュールはJunos XML APIとNETCONFを使用してデバイスとインターフェイスするため、管理対象デバイスにPythonは必要ありません。そのため、Junosデバイス上で操作を実行するには、PythonがインストールされているAnsible制御ノードでモジュールをローカルに実行する必要があります。AnsibleがJunosデバイス上で直接モジュールを実行しようとすると、エラーが発生します。
ソリューション
Ansible 制御ノードにモジュールをローカルで実行するように指示するには、モジュールセットに適切な接続パラメーターを定義する必要があります。パラメーターは、インベントリファイル、ホスト変数ファイル、グループ変数ファイル、プレイブック、コマンドライン引数など、さまざまな場所で定義できます。接続タイプは、選択したモジュールセットによって異なり、場合によっては個々のモジュールによって異なります。詳細については、次を参照してください。
不明なホストエラーのトラブルシューティング
問題点
説明
juniper.deviceコレクションからjuniper.deviceモジュールまたはjunipernetworks.junosモジュールを実行すると、不明なホスト、ホストパターン、またはアドレスに関するエラーがAnsible制御ノードによって生成されます。
"msg": "Unable to make a PyEZ connection: ConnectUnknownHostError(dc1a.example.net)"
または
[WARNING]: Could not match supplied host pattern, ignoring: name
または
"msg": "[Errno -5] No address associated with hostname"
原因
これらのエラーは、Ansibleインベントリファイルでホストが定義されていないか、Ansible制御ノードがホスト名を解決できない場合に発生します。
Ansibleモジュールを直接またはプレイブックから実行する場合、モジュール引数またはプレイブックで参照されるホストはすべて、Ansibleインベントリファイルで定義する必要があります。インベントリ ファイルのデフォルトの場所は /etc/ansible/hosts です。Ansible制御ノードは、インベントリファイルで定義するホストのホスト名を解決できる必要があります。
ソリューション
Ansibleインベントリファイルを更新して欠落しているホストを含め、DNS解決が正しく機能していることを確認します。
Ansibleインベントリファイルの詳細については、 Understanding the Ansible Inventory File When Managing Junos Devices 、および https://www.ansible.com/ にあるAnsible公式ドキュメントを参照してください。
接続拒否エラーとソケットエラーのトラブルシューティング
問題点
説明
juniper.deviceコレクションからjuniper.deviceモジュールまたはjunipernetworks.junosモジュールを実行すると、Ansible制御ノードがConnectRefusedErrorエラーまたはソケットエラーを生成します。次に例を示します。
"msg": "Unable to make a PyEZ connection: ConnectRefusedError(dc1a.example.net)"
または
"msg": "Could not open socket to 198.51.100.101:830"
原因
これらのエラーの最も可能性の高い原因は、JunosデバイスでNETCONF over SSHが有効になっていないことです。
NETCONFが有効になっているかどうかをすばやくテストするには、Ansibleモジュールを実行しているユーザーアカウントがデバイスとのNETCONFセッションを正常に開始できることを確認します。
user@ansible-cn:~$ ssh user@dc1a.example.net -p 830 -s netconf
ユーザーがデフォルトのNETCONFポート(830)またはデバイス上のNETCONF用に特別に設定されたポートのいずれかでデバイスとのNETCONFセッションを正常に確立できれば、NETCONFは有効になります。それ以外の場合は、デバイスでNETCONF over SSHを有効にする必要があります。
ソリューション
JunosデバイスでNETCONF-over-SSHサービスを有効にします。
[edit] user@host# set system services netconf ssh user@host# commit
ホストネットワークOSエラーのトラブルシューティング
問題点
説明
juniper.deviceコレクション(juniper.device.junos_*モジュールからjunipernetworks.junosモジュールを実行すると、Ansible制御ノードがhost network osエラーを生成します。次に例を示します。
[ERROR]: Task failed: Unable to automatically determine host network os. Please manually configure ansible_network_os value for this host
原因
juniper.device.junos_*モジュールでは、Junos OSを実行しているターゲットホストまたはJunos OS Evolvedを実行しているターゲットホストに対して、juniper.device.junosとしてAnsibleネットワークOSを指定する必要があります。
ソリューション
ansible_network_os変数を、環境に適した場所とファイル形式に必要な構文で定義します。例えば、インベントリ・ファイル、ホスト変数ファイル、グループ変数ファイルで変数を定義できます。
次のサンプル INI 形式のインベントリ ファイルでは、junos インベントリ グループのホストに対して Ansible ネットワーク OS をjuniper.device.junosとして定義しています。
[junos] router1.example.com router2.example.com router3.example.com [junos:vars] ansible_network_os=juniper.device.junos ansible_connection=ansible.netcommon.netconf