Junosデバイス管理時のAnsible認証エラーのトラブルシューティング
以下のセクションでは、Ansible を使用して Junos OS を実行しているデバイスと Junos OS Evolved を実行しているデバイスを管理するときに発生する可能性のある認証エラーについて概説します。また、各エラーの考えられる原因と解決策についても説明します。
認証エラーのトラブルシューティング
問題点
説明
juniper.deviceコレクション内のjuniper.deviceモジュールまたはjunipernetworks.junosモジュールの実行中に、Ansible制御ノードは、失敗した認証に対してConnectAuthErrorエラーまたはAuthenticationExceptionエラーを生成します。次に例を示します。
"msg": "Unable to make a PyEZ connection: ConnectAuthError(dc1a.example.net)"
または
"msg": "AuthenticationException('Authentication failed.')"
原因
Junosデバイスは、以下の理由でユーザー認証に失敗する可能性があります。
-
ユーザーは Junos デバイスにアカウントを持っていません。
-
ユーザーは、Junosデバイスでテキストベースのパスワードが設定されたアカウントを持っていますが、モジュールの実行時に間違ったパスワードがユーザーに表示されるか、パスワードが指定されていません。
-
ユーザーは、SSHキーが設定されたJunosデバイス上のアカウントを持っていますが、デバイスまたは制御ノードのいずれからもSSHキーにアクセスできません。
ソリューション
モジュールを実行するユーザーが、すべてのターゲット Junos デバイスで Junos OS ログイン アカウントを持っていることを確認します。アカウントには、SSHパブリック/プライベートキーペアまたはテキストベースのパスワードが設定されている必要があります。アカウントがSSHキーを使用する場合は、ユーザーがキーにアクセスできることを確認します。
属性conn_typeエラーのトラブルシューティング
問題点
説明
juniper.deviceモジュールの実行中に、Ansible制御ノードは以下のエラーを生成します。
AttributeError: 'JuniperJunosModule' object has no attribute 'conn_type'
原因
古い非推奨の Juniper.junos モジュールでは、接続と認証パラメーターを定義するための provider ディクショナリの使用がサポートされていましたが、 juniper.device モジュールは provider ディクショナリの使用をサポートしていません。 provider ディクショナリを参照すると、モジュールによって前述のエラーが生成されます。
ソリューション
juniper.deviceモジュール(juniper.device.junos_*モジュールを除く)の場合、プレイブックのプレイで接続パラメーターと認証パラメーターを指定する場合は、Ansible接続に適した場所にパラメーターを定義する必要があります。
-
永続接続(
connection: juniper.device.pyez)の場合は、vars:セクションでパラメーターを定義します。 -
ローカル接続(
connection: local)の場合、パラメーターをvars:セクションの下またはトップレベルのモジュール引数として定義します。
次のプレイブックでは、永続的な接続を使用し、プレイブックの vars セクションで認証パラメーターを定義します。
---
- name: Get device facts
hosts: dc1
connection: juniper.device.pyez
gather_facts: no
vars_prompt:
- name: "DEVICE_PASSWORD"
prompt: "Device password"
private: yes
vars:
passwd: "{{ DEVICE_PASSWORD }}"
tasks:
- name: Get device facts
juniper.device.facts:
savedir: "{{ playbook_dir }}"
次のプレイブックでは、ローカル接続を使用し、認証パラメーターをモジュール引数として定義します。
---
- name: Get device facts
hosts: dc1
connection: local
gather_facts: no
vars_prompt:
- name: "DEVICE_PASSWORD"
prompt: "Device password"
private: yes
tasks:
- name: Get device facts
juniper.device.facts:
passwd: "{{ DEVICE_PASSWORD }}"
savedir: "{{ playbook_dir }}"