JunosデバイスでAnsibleモジュールを実行しているユーザーの認証
認証の概要
ジュニパーネットワークスは、Junosデバイスの管理に使用できるAnsibleモジュールを提供しています。ジュニパーネットワークスのモジュールは、Ansible GalaxyでホストされているコレクションとJuniper.junos
ロールを通じてjuniper.device
配布されます。
ジュニパーネットワークスのモジュールでは、SSH、Telnet、またはシリアルコンソール接続を使って、Junosデバイスに直接接続し、管理することができます。このモジュールは、デバイスの CONSOLE
ポートに接続されているコンソール サーバーへの SSH または Telnet 接続を介したデバイスへの接続もサポートしています。リモートデバイスは、接続プロトコルに応じて、パスワードまたはその他の標準SSH認証メカニズムを使用してユーザーを認証できる必要があります。
Ansibleを使用してJunosデバイスを管理する場合、デバイスにアクセスする最も便利な方法は、SSHキーを設定することです。SSHキーにより、リモートデバイスは信頼できるユーザーを識別できます。または、モジュールとプレイブックを実行するときにユーザー名とパスワードを指定することもできます。
SSH接続の場合、ジュニパーネットワークスモジュールは、まずSSH公開キーベースの認証を試行し、次にパスワードベースの認証を試みます。SSHキーが使用されている場合、提供されたパスワードがプライベートSSHキーのロックを解除するためのパスフレーズとして使用されます。パスワードベースの認証を使用する場合、指定されたパスワードがデバイスパスワードとして使用されます。SSH公開キーベースの認証が使用されており、SSHプライベートキーのパスフレーズが空の場合、パスワードは必要ありません。ただし、空のパスフレーズを含むSSHプライベートキーは推奨されません。パスワードベースの認証またはパスワードで保護されたSSHキーのパスワードを取得するには、プレイブックまたはコマンドラインからパスワードの入力を求めるか、パスワードを安全に保存するためのボールトで暗号化されたデータファイルを作成します。
ジュニパーネットワークスモジュールの接続および認証パラメーターは、以下の方法で指定できます。値を明示的に定義しない場合、 ジュニパーネットワークスモジュールのデフォルト値についての説明に従って、デフォルト値が使用される場合があります。パラメーターの値を複数の場所で定義する場合、Ansibleは、公式のAnsibleドキュメントの 「変数の優先順位について 」で説明されているように、変数の優先順位に基づいて値を選択します。
-
Ansible変数:接続および認証パラメータ値は、通常のAnsible変数(インベントリまたはボールトファイル、ホスト変数またはグループ変数で定義された変数など)を使用するか、コマンドラインオプションを使用して指定できます。
-
SSHクライアント設定ファイル—SSH接続の場合、別の設定ファイルを指定するオプションを定義し
ssh_config
ていない限り、ジュニパーネットワークスモジュールは、デフォルトのSSH設定ファイル(存在する場合)を自動的にクエリします。モジュールは、設定をオーバーライドする変数を明示的に定義しない限り、指定された接続のSSH構成ファイル内の関連する設定を使用します。 -
モジュール引数 - および
Juniper.junos
モジュールは、juniper.device
ローカル接続(connection: local
)の接続および認証関連のオプションを最上位モジュール引数として指定できます。さらに、モジュールでは、 Juniper.junos モジュールでプロバイダー パラメーターを定義する方法で説明されているように、Juniper.junos
モジュール引数でのプロバイダー ディクショナリの使用がサポートされています。 -
vars:
section—モジュールはjuniper.device
、ローカルおよび持続接続のvars:セクションで認証パラメーターを定義する方法セクションで説明されている、プレイのvars:
セクションでのローカルおよび持続接続の接続および認証関連のオプションの指定をサポートします。
このドキュメントでは、ジュニパーネットワークスモジュールを使用してJunosデバイスを管理する際の認証のさまざまな側面について説明します。
ジュニパーネットワークスモジュールのデフォルト値について
Junosデバイスを管理するモジュールの接続および認証パラメーターを明示的に定義できます。パラメーターを定義しない場合、モジュールは場合によってはデフォルト値を使用します。 表 1 は、コレクションおよびロール内の juniper.device
モジュールの共通接続パラメーターのデフォルト値と変数の優先順位の概要を示しています Juniper.junos
。個々のモジュールで受け入れられる引数の詳細については、そのモジュールの API リファレンス ドキュメントを参照してください。
パラメーター名 |
パラメーター エイリアス |
形容 |
デフォルト値と変数の優先順位 |
---|---|---|---|
|
|
接続を確立するリモート デバイスのホスト名または IP アドレス。 |
|
|
|
管理対象デバイスでの認証に使用されるユーザーのパスワードまたはSSHキーのパスフレーズ。 |
|
|
– |
SSH クライアント構成ファイルへのパス。 このパラメーターを省略すると、モジュールはデフォルトの場所にある SSH 構成ファイルを使用します (存在する場合)。 |
~/.ssh/config |
|
|
リモートデバイスでの認証に使用されるSSHプライベートキーファイルへのパス。 パスを明示的に指定せず、デフォルト値が見つからない場合、モジュールはユーザーのSSH構成で指定されたSSH秘密鍵ファイルまたはオペレーティングシステム固有のデフォルトを使用します。 |
|
|
|
マネージドノードでの認証に使用されるユーザー名。 |
|
ジュニパーネットワークスのモジュールを実行する場合、接続には必ずこの引数が必要です host
。ただし、ホストのデフォルト {{ inventory_hostname }}
は であるため、明示的に指定する必要はありません。
管理対象のJunosデバイスにアクセスできるユーザーアカウントを使用して、ジュニパーネットワークスモジュールを実行できます。モジュールを実行すると、Junos OSユーザーアカウントのアクセス権限が適用され、Junos OSユーザーアカウントに設定されたクラスによって権限が決まります。ユーザーを指定しない場合、ユーザーは表 1 で説明されているuser
アルゴリズムに従って設定されます。の定義remote_user
に使用される優先順位については、Ansibleのドキュメントを参照してください。これは、次のようなさまざまな方法で定義できます。
-
-u
または--user
コマンドラインオプション -
ANSIBLE_REMOTE_USER
環境変数 -
remote_user
構成設定
varsで認証パラメータを定義する方法:ローカルおよび永続的な接続のセクション
モジュールの接続パラメーターと認証パラメーター juniper.device
は、他の変数 (SSH 構成ファイル、Ansible インベントリ ファイル、コマンド ライン引数、モジュール引数など) で通常行うように定義する以外に、プレイの vars:
セクションで定義できます。このセクションでは vars:
、プレイ内のすべてのモジュールがホストに接続するために使用できる単一の場所で共通の接続パラメータを定義できます。さらに、特定のAnsible接続では、ここで説明するように、プレイ内でパラメーターを定義するときにセクション vars:
を使用する必要があります。
モジュールは juniper.device
、次のAnsible接続タイプをサポートしています。
-
を使用して定義されるローカル接続
connection: local
-
持続接続 (以下を使用して定義されます)
connection: juniper.device.pyez
ローカル接続と持続接続の両方で、Ansibleは制御ノード上でモジュールをローカルに実行します。を使用すると connection: local
、Ansibleは、接続を必要とするプレイ内のタスクごとに、ホストへの個別の接続を確立します。対照的に、 を使用すると、 connection: juniper.device.pyez
Ansibleはホストへの単一の永続的な接続を確立し、プレイ内のすべてのタスクの実行にわたって持続します。
永続的な接続には、ローカル接続の場合と同じ接続および認証パラメーターを使用します。 ジュニパーネットワークスモジュールのデフォルト値について で説明されているデフォルトのパラメーター値は、両方のタイプの接続に適用されます。ただし、持続的接続のプレイ内で接続および認証パラメーターを定義する場合は、接続が 1 つしかないため、各タスクの最上位モジュール引数としてパラメーターを定義するのではなく、セクション内の vars:
パラメーターを定義する必要があり、パラメーターはそのプレイ内のすべてのタスクに適用する必要があります。ローカル接続の場合、パラメーターは vars:
セクションで定義することも、モジュールの引数として定義することもできます。両方の場所でパラメーターを定義すると、モジュールの引数が優先されます。
次のプレイブックは、インベントリグループ内の各ホストで2つの juniper.device
モジュールを実行します。プレイでは、Ansible接続 juniper.device.pyez
を と定義し、プレイ内のすべてのタスクの実行にわたって持続する各ホストへの接続を確立します。永続的な接続の認証パラメーターは、プレイの vars:
セクション内で定義されます。 user
および passwd
値は、 vault-vars.yaml
ボルト ファイルで定義された変数を参照します。
--- - name: Get Device Facts hosts: dc1 connection: juniper.device.pyez gather_facts: no vars: user: "{{ admin_username }}" passwd: "{{ admin_password }}" vars_files: - vault-vars.yaml tasks: - name: Retrieve facts from Junos devices juniper.device.facts: savedir: "{{ playbook_dir }}" - name: Get hardware inventory juniper.device.command: commands: "show chassis hardware" dest_dir: "{{ playbook_dir }}"
Juniper.junosモジュールでプロバイダパラメータを定義する方法
リリース 2.0.0 以降Juniper.junos
、モジュールは、provider
接続および認証関連のパラメータごとに個別の最上位モジュール引数をサポートするだけでなく、Juniper.junos
このパラメータもサポートします。このパラメーターを使用するとprovider
、複数のモジュールの接続パラメーターと認証パラメーターを 1 か所で定義し、それらの値を使用するモジュールに簡単に渡すことができます。さらに、後でパラメーターを更新する必要がある場合は、1 つの場所で更新するだけで済みます。
juniper.device
コレクション モジュールは、このパラメーターprovider
の使用をサポートしていません。
引数はprovider
、デバイスへの接続と認証に必要な接続の詳細を含むディクショナリを受け入れます。引数はhost
接続には常に必要ですが、モジュールが のhost
デフォルト値を使用する場合は、値を明示的に指定する必要はありません。ディクショナリでは、必要に応じて、 user
、 passwd
ssh_private_key_file
、 など、接続に必要な追加のパラメーターを定義できます。個々のモジュールで受け入れられる引数の詳細については、そのモジュールの API リファレンス ドキュメントを参照してください。
次の例では、変数はcredentials
、 、 user
、および passwd
パラメーターを定義するhost
ディクショナリです。
vars: credentials: host: "{{ inventory_hostname }}" user: "{{ ansible_user }}" passwd: "{{ ansible_password }}"
次のサンプル プレイブックでは、個々のモジュール引数を定義する代わりに、単一の provider
引数を使用して接続の詳細をモジュールに juniper_junos_facts
渡します。モジュールを使用する Juniper.junos
タスクを追加すると、モジュールごとに同じディクショナリを参照できます。
--- - name: Get Device Facts hosts: dc1 connection: local gather_facts: no roles: - Juniper.junos vars: credentials: host: "{{ inventory_hostname }}" user: "{{ ansible_user }}" passwd: "{{ ansible_password }}" tasks: - name: Retrieve facts from Junos devices juniper_junos_facts: provider: "{{ credentials }}" savedir: "{{ playbook_dir }}" - name: Print version debug: var: junos.version
SSH キーを使用してユーザーを認証する方法
ジュニパーネットワークス juniper.device
とモジュールでは、 Juniper.junos
SSHキーを使用してJunosデバイスまたはデバイスに接続されているコンソールサーバーに接続できます。SSHキーを使用してユーザーを認証するには、まずAnsible制御ノードでキーを生成してから、モジュールが接続するデバイス(管理対象JunosデバイスまたはJunosデバイスに接続されたコンソールサーバー)でキーを設定します。
SSH キーを生成および設定する
Ansible制御ノードでSSHキーを生成し、リモートデバイスで公開キーを設定するには、次の手順に従います。
AnsibleプレイブックでのSSHキーの使用
SSH キーペアを生成し、リモート デバイスで公開キーを構成したら、キーを使用してデバイスに接続できます。ジュニパーネットワークスは、別の設定ファイルを指定するオプションを定義しssh_config
ていない限り、~/.ssh/configにあるデフォルトのSSH設定ファイルに対して、それが存在する場合は自動的にクエリーを実行します。モジュールは、設定をオーバーライドする変数を明示的に定義しない限り、指定された接続のSSH構成ファイル内の関連する設定を使用します。さらに、モジュールは、デフォルトの場所にある鍵と、SSH 鍵エージェントにアクティブにロードされている鍵を自動的に探します。
SSH キーの特定の設定を定義するには、Ansible プレイブックに適切な引数を含めることができます。引数は、モジュールとAnsible接続のセットに適した場所(たとえば、永続的な接続でモジュールを使用するjuniper.device
プレイのセクション)vars:
で定義します。含める引数は、鍵の場所、鍵が SSH 鍵エージェントにアクティブにロードされているかどうか、鍵がパスワードで保護されているかどうか、およびユーザーの SSH 構成ファイルでそのホストの設定が既に定義されているかどうかによって決まります。
-
ネイティブのSSHキーエージェントにアクティブにロードされているSSHキー、またはデフォルトの場所にあるパスワード保護されていないSSHキーを使用してJunosデバイスに接続する場合、デフォルトと異なる場合を除き、接続または認証関連の引数を定義する必要はありません。
juniper.device.facts: savedir: "{{ playbook_dir }}"
-
デフォルトの場所になく、パスワードで保護されていないSSHキーを使用してJunosデバイスに接続するには、 引数を
ssh_private_key_file
SSHプライベートキーファイルのパスに設定します。例えば:juniper.device.facts: ssh_private_key_file: "/home/user/.ssh/id_rsa_alternate" savedir: "{{ playbook_dir }}"
または、SSH 構成ファイルで定義して、SSH 秘密キーのパスを指定することもできます。環境変数を設定する
ANSIBLE_NET_SSH_KEYFILE
か、--private-key
プレイブックの実行時に OR--key-file
コマンド ライン オプションを定義します。 -
推奨される方法であるパスワードで保護されたSSHキーファイルを使用してJunosデバイスに接続するには、引数で
passwd
SSHキーファイルのパスフレーズを参照するか、通常のAnsible変数またはコマンドラインオプションを使用してパスワードを指定します。環境に適した安全な方法でSSHキーファイルのパスフレーズを取得するのは、ユーザーの責任です。ベスト プラクティスは、プレイブックを呼び出すたびにプロンプトを表示するか、暗号化されていない形式で資格情報を格納するのではなく、暗号化されたコンテナーを使用して変数を格納することをお勧めします。たとえば、次に示すように、コマンドライン オプションを使用して
--ask-pass
プレイブックを実行し、プロンプトが表示されたら SSH キー ファイルのパスフレーズを指定できます。juniper.device.facts: ssh_private_key_file: "/home/user/.ssh/id_rsa_dc" savedir: "{{ playbook_dir }}"
[user@localhost]$ ansible-playbook playbook.yaml --ask-pass SSH password:
SSH キーのパスフレーズにプロンプトまたは暗号化されたボールトファイルを使用する方法の詳細については、「 プレイブックまたはコマンドラインパスワードプロンプトを使用してユーザーを認証する方法 」および「 Ansible Vaultで暗号化されたファイルを使用してユーザーを認証する方法」を参照してください。
SSH キーを使用してコンソール サーバーに接続する方法については、「 コンソール サーバー経由で認証する方法」を参照してください。
プレイブックまたはコマンドラインパスワードプロンプトを使用してユーザーを認証する方法
Ansibleモジュールを実行しているユーザーを認証するには、プレイブックの実行時にユーザーの資格情報の入力を求めます。たとえば、プレイブックで対話型プロンプトを定義したり、または--ask-pass
コマンド ライン オプションを使用して-k
プレイブックを実行してパスワードの入力を求めることができます。SSHキーが使用されている場合、提供されたパスワードがプライベートSSHキーのロックを解除するためのパスフレーズとして使用されます。パスワードベースの認証を使用する場合、指定されたパスワードがデバイスパスワードとして使用されます。
プレイブックで対話型プロンプトを定義して、ユーザーのパスワードまたは SSH キーのパスフレーズを取得するには:
または、または--ask-pass
コマンドラインオプションを使用して-k
プレイブックを実行し、パスワードまたはパスフレーズの入力を求めることもできます。既定のユーザー名を使用する次のプレイブックについて考えてみます。
--- - name: Get Device Facts hosts: all connection: local gather_facts: no tasks: - name: Retrieve facts from Junos devices juniper.device.facts: savedir: "{{ playbook_dir }}" - name: Print facts debug: var: junos.version
プレイブックを実行し、パスワードの入力を求め、コマンドラインでパスワードをエコーしないコマンドラインオプションまたはコマンドラインオプションを含め-k
--ask-pass
ます。
[user@localhost]$ ansible-playbook playbook.yaml --ask-pass SSH password: PLAY [Get Device Facts] *********************************************** ...
Ansibleボールトで暗号化されたファイルを使用してユーザーを認証する方法
Ansibleボールトを作成して、保存したパスワードやその他の機密性の高い接続および認証値をボールトで暗号化されたデータファイルに安全に保存できます。その後、プレイブックは、一連のモジュールと Ansible 接続の種類に適した場所 (プレイの vars:
セクションやモジュール引数など) でこれらの変数を参照できます。
パスワードを含む必須変数を含むAnsibleボールトファイルを作成して使用するには:
コンソール サーバー経由で認証する方法
ジュニパーネットワークスのAnsibleモジュールは、コンソールサーバーを介してJunosデバイスに接続できます。コンソール サーバーを経由したSSH接続の場合、コンソール サーバーとJunosデバイスの両方の認証資格情報を指定する必要があります。コンソール・サーバー認証には、デバイス・パスワードまたはパスワードで保護されたSSHキー・ファイルのいずれかを指定できます。
コンソール サーバー経由で Junos デバイスに接続するには、デフォルト値がない場合、またはデフォルト値が適切でない場合は、プレイブックに次のパラメーターを指定する必要があります。
-
host
- コンソール サーバのホスト名または IP アドレス -
user
およびpasswd
- Junos OS ログイン資格情報 -
cs_user
- コンソール サーバのユーザー名 -
cs_passwd
- コンソール・サーバーでの認証に必要なデバイス・パスワードまたはSSHキー・ファイルのパスフレーズ
次の例では、Junos OSユーザーとコンソール・サーバー・ユーザーの認証情報がAnsibleボールト・ファイルで定義されています。その後、コンテナー変数はプレイブックで参照されます。この場合、引数は cs_passwd
、引数で指定された ssh_private_key_file
SSHキーのパスフレーズです。
--- - name: Get Device Facts hosts: dc1_con connection: local gather_facts: no vars_files: - vault-vars.yaml vars: host: "{{ inventory_hostname }}" user: "{{ junos_username }}" passwd: "{{ junos_password }}" cs_user: "{{ cs_username }}" cs_passwd: "{{ cs_key_password }}" ssh_private_key_file: "/home/user/.ssh/id_rsa_dc" tasks: - name: Retrieve facts from Junos devices juniper.device.facts: savedir: "{{ playbook_dir }}"