JunosデバイスでAnsibleモジュールを実行しているユーザーの認証
juniper.device Ansibleコレクションで設定されたjuniper.deviceモジュールを使用する場合のユーザー認証方法を理解します。
ジュニパーネットワークス には、Junos OS を実行しているデバイスと Junos OS Evolved を実行しているデバイスの管理に使用できる Ansible モジュールが用意されています。ジュニパーネットワークス モジュールは、 juniper.device コレクションを介して配布されます。 juniper.device コレクションには、次の 2 つのモジュール セットが含まれています。
-
juniper.deviceモジュール (command、config、facts、file_copy、jsnapy、ping、pmtud、rpc、software、srx_cluster、system、table) -
junipernetworks.junosモジュール (juniper.device.junos_*)
このトピックでは、 juniper.device モジュールセットのみを使用する場合にユーザーを認証する方法について説明します。 junipernetworks.junos モジュールを使用してJunosデバイスに接続し、認証する方法については、 juniper.device.junos_* Ansibleモジュールを使用したJunosデバイスの管理を参照してください。
認証の概要
juniper.deviceモジュールにより、SSH、telnet、またはシリアルコンソール接続を使用して、Junosデバイスに直接接続し、管理することができます。また、これらのモジュールは、デバイスのCONSOLEポートに接続されたコンソールサーバーへのSSHまたはTelnet接続を介したデバイスへの接続もサポートしています。リモートデバイスは、接続プロトコルに応じて、パスワードまたはその他の標準的なSSH認証メカニズムを使用してユーザーを認証できる必要があります。
Ansibleを使用してJunosデバイスを管理する場合、デバイスにアクセスする最も便利な方法は、SSHキーを設定することです。SSHキーにより、リモートデバイスは信頼できるユーザーを識別できます。または、モジュールやプレイブックの実行時にユーザー名とパスワードを指定することもできます。
SSH 接続の場合、 juniper.device モジュールはまず SSH 公開鍵ベースの認証を試み、次にパスワードベースの認証を試みます。パスワードベースの認証を使用する場合、提供されたパスワードがデバイスパスワードとして使用されます。SSHキーが使用されている場合、提供されたパスワードがプライベートキーのロックを解除するためのパスフレーズになります。キーをSSH認証エージェントにロードする場合、またはSSHプライベートキーのパスフレーズが空の場合は、パスワードを指定する必要はありません。ただし、空のパスフレーズでSSHプライベートキーを使用することはお勧めしません。
Ansibleには、パスワードベースの認証やパスワードで保護されたSSHキー用のパスワードを提供する方法が数多く用意されています。オプションには、プレイブック プロンプトの使用、コマンド ライン オプションの提供、パスワードを安全に保存する Vault 暗号化データ ファイルの作成などがあります。詳細については、Ansibleの公式ドキュメントを参照してください。
以下の方法で、 juniper.device モジュールの接続パラメーターと認証パラメーターを指定できます。値を明示的に定義しない場合、場合によってはデフォルト値が使用されます。デフォルト値については、「 ジュニパーネットワークスモジュールのデフォルト値について」で説明しています。パラメーターの値を複数の場所で定義する場合、Ansibleは、Ansible公式ドキュメントの 「変数の優先度について」 で説明されているように、変数の優先度に基づいて値を選択します。
-
Ansible変数—通常のAnsible変数(インベントリまたはボルトファイル、ホスト変数またはグループ変数、コマンドライン引数など)を使用して、接続および認証パラメータ値を指定できます。
-
SSHクライアント設定ファイル—SSH接続の場合、モジュールはデフォルトのSSH設定ファイル( 存在する場合)に自動的にクエリします。
ssh_configオプションを含めることで、別の設定ファイルを指定できます。モジュールは、設定を上書きする変数を明示的に定義しない限り、特定の接続のSSH構成ファイル内の関連する設定を使用します。 -
モジュール引数—
juniper.deviceモジュールは、最上位のモジュール引数としてローカル接続およびローカル接続の認証関連オプション(connection: local)を指定することをサポートしています。 -
プレイブック
vars:セクション—juniper.deviceモジュールは、ローカルおよび永続接続の変数セクションで説明されている、ローカルおよび永続接続のvars:セクションで、ローカルおよび永続接続の接続および認証関連オプションの指定をサポートしています。
ジュニパーネットワークスモジュールのデフォルト値について
Junosデバイスを管理するモジュールの接続パラメーターと認証パラメーターを明示的に定義できます。パラメーターを定義しない場合、モジュールは場合によってはデフォルト値を使用します。 表1 は、 juniper.device モジュールセットの一般的な接続パラメーターのデフォルト値と変数優先順位の概要を示しています。個々のモジュールで受け入れられる引数については、そのモジュールの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 で認証パラメーターを定義する方法: ローカル接続と永続接続のセクション
プレイのvars:セクションで、juniper.deviceモジュールの接続と認証パラメータを定義できます。このオプションは、SSH設定ファイル、Ansibleインベントリファイル、コマンドライン引数、モジュール引数など、他の手段によるパラメーターの定義に追加されます。vars:セクションでは、プレイ内のすべてのモジュールがホストへの接続に使用できる共通の接続パラメーターを1つの場所に定義できます。さらに、特定のAnsible接続では、ここで説明するように、プレイ内でパラメーターを定義するときにvars:セクションを使用する必要があります。
juniper.deviceモジュールは、以下のAnsible接続タイプをサポートしています。
-
ローカル接続は、
connection: local -
永続的な接続は、
connection: juniper.device.pyez
ローカル接続と永続接続の両方で、Ansibleは制御ノード上でモジュールをローカルに実行します。 connection: localを使用する場合、Ansibleは、接続を必要とするプレイ内のタスクごとに、ホストへの個別の接続を確立します。対照的に、 connection: juniper.device.pyez を使用すると、Ansible はホストへの単一の永続的な接続を確立し、この接続はプレイ内のすべてのタスクの実行中も持続します。
永続接続にはローカル接続と同じ接続パラメーターと認証パラメーターを使用し、デフォルトのパラメーター値が両方のタイプの接続に適用されます。ローカル接続の場合、接続パラメーターと認証パラメーターは、 vars: セクション内またはモジュール引数として定義できます。両方の場所でパラメーターを定義すると、モジュール引数が優先されます。ただし、永続接続のプレイ内でパラメーターを定義する場合は、 vars: セクションでパラメーターを定義する必要があります。永続的な接続では、すべてのタスクに対して単一の接続しかないため、パラメーターをグローバルに定義して、そのプレイのすべてのタスクに適用する必要があります。
次のプレイブックでは、インベントリグループの各ホストで2つの juniper.device モジュールを実行します。プレイでは、Ansible接続を juniper.device.pyezと定義しており、プレイ内のすべてのタスクの実行中も持続する各ホストへの接続を確立します。プレイの vars: セクションでは、永続的な接続の認証パラメーターを定義します。 user 値と passwd 値は、 vault-vars.yaml Vault ファイルで定義された変数を参照します。
---
- name: Get Device Facts
hosts: dc1
connection: juniper.device.pyez
gather_facts: no
vars:
user: "{{ vault_admin_username }}"
passwd: "{{ vault_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 }}"
SSHキーを使用してユーザーを認証する方法
juniper.deviceモジュールを使用すると、SSHキーを使用して、Junosデバイスまたはデバイスに接続されているコンソールサーバーに接続できます。SSHキーを使用してユーザーを認証するには、まずAnsible制御ノードでキーを生成し、次にモジュールが接続するデバイス(管理対象のJunosデバイスまたはJunosデバイスに接続されたコンソールサーバー)でJunosを設定します。
SSHキーを生成して設定する
Ansible制御ノードでSSHキーを生成し、リモートデバイスで公開キーを設定するには、以下を行います。
AnsibleプレイブックでSSHキーを使用する
SSHキーペアを生成し、リモートデバイスで公開キーを設定した後、そのキーを使用してデバイスに接続できます。ジュニパーネットワークスモジュールは、 ~/.ssh/configにあるデフォルトのSSH設定ファイル(存在する場合)を自動的にクエリします。また、 ssh_config オプションを定義して、別の設定ファイルを指定することもできます。モジュールは、設定を上書きする変数を明示的に定義しない限り、特定の接続の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プライベートキーファイルのパスに設定します。次に例を示します。vars: ssh_private_key_file: "/home/user/.ssh/id_rsa_alternate" tasks: - name: Retrieve facts from Junos devices juniper.device.facts: savedir: "{{ playbook_dir }}"または、SSH プライベートキーのパスを指定することもできます。 SSH 設定ファイルで定義します。
ANSIBLE_NET_SSH_KEYFILE環境変数を設定するか、プレイブックの実行時に--private-keyまたは--key-fileコマンドラインオプションを定義します。 -
パスワードで保護されたSSHキーファイルを使用してJunosデバイスに接続するには(推奨される方法)、SSHキーファイルのパスフレーズを参照する方法はいくつかあります。例えば、
passwd引数の使用、Ansible変数の定義、コマンドラインオプションの指定を行うことができます。次の例では、
--ask-passコマンドラインオプションを使用してプレイブックを実行し、ユーザーにパスフレーズの入力を求めます。vars: ssh_private_key_file: "/home/user/.ssh/id_rsa_dc" tasks: - name: Retrieve facts from Junos devices juniper.device.facts: savedir: "{{ playbook_dir }}"user@localhost:~$ ansible-playbook playbook.yaml --ask-pass SSH password:
注:SSHキーファイルのパスフレーズを、それぞれの環境に適した安全な方法で取得するのはユーザーの責任です。Playbook の実行時にパスフレーズの入力を求めるか、資格情報を暗号化されていない形式で保存するのではなく、暗号化された Vault を使用して変数を保存することをお勧めします。SSH キーパスフレーズにプロンプトまたは暗号化されたボールトファイルの使用についての詳細は、 プレイブックまたはコマンドラインパスワードプロンプトを使用してユーザーを認証する方法 および Ansibleボールトで暗号化されたファイルを使用してユーザーを認証する方法を参照してください。
SSHキーを使用してコンソールサーバーに接続する方法については、 コンソールサーバーを介して認証する方法を参照してください。
プレイブックまたはコマンドラインパスワードプロンプトを使用してユーザーを認証する方法
Ansibleモジュールを実行しているユーザーを認証するために、プレイブックの実行時にユーザーの資格情報の入力を求めることができます。例えば、プレイブックでインタラクティブなプロンプトを定義したり、 -k または --ask-pass コマンドラインオプションを使用してプレイブックを実行し、パスワードの入力を求めることができます。SSHキーが使用されている場合、提供されたパスワードがプライベートSSHキーのパスフレーズとして使用されます。パスワードベースの認証を使用する場合、提供されたパスワードがデバイスパスワードとして使用されます。
ユーザーのパスワードまたはSSHキーパスフレーズを取得するための対話型プロンプトをプレイブックで定義するには:
または、 -k または --ask-pass コマンドラインオプションを使用してプレイブックを実行し、パスワードまたはパスフレーズの入力を求めることもできます。デフォルトのユーザー名を使用する次のプレイブックを考えてみましょう。
---
- 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
ansible.builtin.debug:
var: junos.version
プレイブックを実行し、パスワードの入力を求め、コマンドライン上のパスワードをエコーしない -k または --ask-pass コマンドラインオプションを含めます。
user@localhost:~$ ansible-playbook playbook.yaml --ask-pass SSH password: PLAY [Get Device Facts] *********************************************** ...
Ansible Vaultで暗号化されたファイルを使用してユーザーを認証する方法
Ansibleボールトを使用して、パスワードやその他の機密性の高い接続および認証値をボールトで暗号化されたデータファイルに安全に保存できます。プレイブックは、モジュールのセットと Ansible 接続タイプに適した場所 (プレイの vars: セクションやモジュール引数など) で、これらの変数を参照できます。
この例では、Ansibleボールトを使用して、新しいボールトファイルを作成し、暗号化します。また、個々の変数を暗号化したり、異なるパスワードで複数の暗号化ファイルを使用することもできます。コンテンツとファイルの暗号化にAnsibleVaultを使用する方法の詳細については、Ansibleの公式ドキュメントを参照してください。
パスワードを含む必須変数を含む Ansible ボールトファイルを作成して使用するには、次の手順に従います。
コンソールサーバーを介して認証する方法
ジュニパーネットワークスのAnsibleモジュールは、コンソールサーバーを介してJunosデバイスに接続できます。コンソールサーバーを介したSSH接続の場合、コンソールサーバーとJunosデバイスの両方の認証資格情報を提供する必要があります。コンソールサーバーの認証には、デバイスパスワードまたはパスワードで保護されたSSHキーファイルのいずれかを使用できます。
コンソール サーバー経由で Junos デバイスに接続するには、デフォルト値がない場合、またはデフォルト値が適切でない場合、プレイブックに以下のパラメーターを指定する必要があります。
-
host—コンソールサーバーのホスト名またはIPアドレス -
userおよびpasswd—ログイン資格情報Junos OS -
cs_user—コンソールサーバーのユーザー名 -
cs_passwd—コンソールサーバーとの認証に必要なデバイスパスワードまたはSSHキーファイルのパスフレーズ -
port—ポート(デフォルトと異なる場合)
次の例では、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: "{{ vault_junos_username }}"
passwd: "{{ vault_junos_password }}"
cs_user: "{{ vault_cs_username }}"
cs_passwd: "{{ vault_cs_key_password }}"
ssh_private_key_file: "/home/user/.ssh/id_rsa_dc"
port: 3007
tasks:
- name: Retrieve facts from Junos devices
juniper.device.facts:
savedir: "{{ playbook_dir }}"