JunosデバイスでAnsibleモジュールを実行しているユーザーを認証する
認証の概要
ジュニパーネットワークスは、Junosデバイスの管理に使用できるAnsibleモジュールを提供しています。ジュニパーネットワークスのモジュールは、Ansible Galaxyでホストされているjuniper.deviceコレクションを通じて配布されます。
ジュニパーネットワークスのモジュールにより、SSH、telnet、またはシリアルコンソール接続を使用してJunosデバイスに直接接続し、管理することができます。モジュールは、デバイスの CONSOLE ポートに接続されたコンソール サーバーへのSSHまたはTelnet接続を介したデバイスへの接続もサポートしています。リモートデバイスは、接続プロトコルに応じて、パスワードまたはその他の標準SSH認証メカニズムを使用してユーザーを認証できる必要があります。
Ansibleを使用してJunosデバイスを管理する場合、デバイスにアクセスする最も便利な方法は、SSHキーを設定することです。SSHキーにより、リモートデバイスは信頼できるユーザーを識別できます。または、モジュールと Playbook を実行するときにユーザー名とパスワードを指定することもできます。
SSH 接続の場合、ジュニパーネットワークスのモジュールは、まず SSH 公開キーベースの認証を試み、次にパスワードベースの認証を試みます。SSH キーが使用されている場合、指定されたパスワードはプライベート SSH キーのロックを解除するためのパスフレーズとして使用されます。パスワードベースの認証を使用する場合、指定されたパスワードがデバイスパスワードとして使用されます。SSH公開鍵ベースの認証を使用しており、SSH秘密鍵のパスフレーズが空の場合、パスワードは必要ありません。ただし、空のパスフレーズでSSH秘密キーを使用することはお勧めしません。パスワードベースの認証またはパスワードで保護された SSH キーのパスワードを取得するには、プレイブックまたはコマンドラインからパスワードの入力を求めるか、パスワードを安全に保存するボールトで暗号化されたデータファイルを作成します。
ジュニパーネットワークスモジュールの接続および認証パラメータは、以下の方法で指定できます。値を明示的に定義しない場合は、 ジュニパーネットワークスモジュールのデフォルト値についてで説明されているように、デフォルト値が使用されることがあります。パラメーターの値を複数の場所で定義する場合、Ansible は、公式の Ansible ドキュメントの 「変数の優先順位について 」で説明されているように、変数の優先順位に基づいて値を選択します。
-
Ansible変数—通常のAnsible変数(インベントリまたはボルトファイルで定義された変数、ホスト変数またはグループ変数など)、またはコマンドラインオプションを使用して、接続および認証パラメータ値を指定できます。
-
SSHクライアント構成ファイル—SSH接続の場合、ジュニパーネットワークスのモジュールは、 ~/.ssh/configにあるデフォルトのSSH構成ファイルがあれば、それに対して自動的にクエリーを実行します。また、
ssh_configオプションを含めて、別の構成ファイルを指定することもできます。モジュールは、設定を上書きする変数を明示的に定義しない限り、特定の接続の SSH 構成ファイル内の関連する設定を使用します。 -
モジュール引数—
juniper.deviceモジュールでは、ローカル接続(connection: local)の接続および認証関連のオプションを最上位のモジュール引数として指定することをサポートしています。 -
vars:セクション —juniper.deviceモジュールでは、プレイのvars:セクションでローカル接続と持続接続の接続および認証関連のオプションの指定をサポートしています (ローカル接続と 持続接続の vars: セクションの認証パラメーターの定義方法を参照)。
このドキュメントでは、ジュニパーネットワークスのモジュールを使用して Junos デバイスを管理する場合の、認証のさまざまな側面について説明します。
ジュニパーネットワークスモジュールのデフォルト値について
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 は、接続を必要とする Play 内のタスクごとにホストへの個別の接続を確立します。対照的に、 connection: juniper.device.pyez を使用すると、Ansible はホストへの単一の永続的な接続を確立し、この接続はプレイ内のすべてのタスクの実行中も維持されます。
持続的接続にはローカル接続と同じ接続および認証パラメーターを使用し、 ジュニパーネットワークスモジュールのデフォルト値について で説明されているデフォルトのパラメーター値は、両方のタイプの接続に適用されます。ローカル接続の場合、接続パラメーターと認証パラメーターを vars: セクションで定義するか、モジュール引数として定義できます。両方の場所でパラメーターを定義すると、モジュール引数が優先されます。ただし、持続的接続のプレイ内でパラメータを定義する場合は、 vars: セクションでパラメータを定義する必要があります。永続的な接続では、すべてのタスクに対して 1 つの接続しかないため、そのプレイのすべてのタスクに適用されるようにパラメーターをグローバルに定義する必要があります。
次のプレイブックは、インベントリグループの各ホストで 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: "{{ 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 }}"
SSH キーを使用してユーザーを認証する方法
Juniper Networks juniper.device モジュールを使用すると、SSH キーを使用して Junos デバイスまたはデバイスに接続されているコンソール サーバーに接続できます。SSHキーを使用してユーザーを認証するには、まずAnsible制御ノードでキーを生成してから、モジュールの接続先となるデバイス(管理対象JunosデバイスまたはJunosデバイスに接続されたコンソールサーバー)でキーを設定します。
SSH キーを生成して構成する
Ansible制御ノードでSSHキーを生成し、リモートデバイスで公開キーを設定するには、次の手順に従います。
Ansible Playbook での SSH キーの使用
SSHキーペアを生成し、リモートデバイスで公開キーを設定した後、キーを使用してデバイスに接続できます。ジュニパーネットワークスのモジュールは、 ~/.ssh/config にあるデフォルトの SSH 構成ファイルがあれば、それに対して自動的にクエリーを実行します。また、 ssh_config オプションを定義して、別の構成ファイルを指定することもできます。モジュールは、設定を上書きする変数を明示的に定義しない限り、特定の接続の SSH 構成ファイル内の関連する設定を使用します。さらに、モジュールは、デフォルトの場所にあるキーと、SSH キーエージェントにアクティブにロードされているキーを自動的に検索します。
SSH キーの特定の設定を定義するには、Ansible Playbook に適切な引数を含めます。モジュールと 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環境変数を設定するか、Playbook の実行時に--private-keyまたは--key-fileコマンドラインオプションを定義します。 -
パスワードで保護されたSSHキー・ファイル(推奨される方法)を使用してJunosデバイスに接続するには、
passwd引数でSSHキー・ファイルのパスフレーズを参照するか、通常のAnsible変数またはコマンドライン・オプションを使用してパスワードを指定します。環境に適した安全な方法でSSHキーファイルのパスフレーズを取得するのはユーザーの責任です。ベストプラクティスは、Playbook を呼び出すたびにプロンプトを表示するか、暗号化されていない形式で認証情報を保存するのではなく、暗号化されたボールトを使用して変数を保存することです。たとえば、次に示すように、
--ask-passコマンドラインオプションを使用して Playbook を実行し、プロンプトが表示されたら SSH キーファイルのパスフレーズを指定できます。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 キーのパスフレーズにプロンプトまたは暗号化された Vault ファイルを使用する方法の詳細は、 How to Authenticate the User Using a Playbook or Command-Line Password Prompt および How to authenticate the user using an Ansible vault-encrypted fileを参照してください。
SSHキーを使用してコンソールサーバーに接続する手順については、「 コンソールサーバーを介して認証する方法」を参照してください。
プレイブックまたはコマンドラインパスワードプロンプトを使用してユーザーを認証する方法
Ansibleモジュールを実行しているユーザーを認証するには、Playbookの実行時にユーザーの認証情報の入力を求めます。例えば、Playbook で対話型プロンプトを定義したり、 -k または --ask-pass コマンドラインオプションを使用して Playbook を実行し、パスワードの入力を求めるプロンプトを表示したりできます。SSH キーが使用されている場合、指定されたパスワードはプライベート SSH キーのロックを解除するためのパスフレーズとして使用されます。パスワードベースの認証を使用する場合、指定されたパスワードがデバイスパスワードとして使用されます。
ユーザーのパスワードまたは SSH キーのパスフレーズを取得するための対話型プロンプトを Playbook で定義するには、以下を行います。
または、 -k または --ask-pass コマンドラインオプションを使用して Playbook を実行し、パスワードまたはパスフレーズの入力を求めることもできます。デフォルトのユーザー名を使用する次のプレイブックについて考えてみます。
---
- 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
Playbook を実行し、パスワードの入力を求め、コマンドラインにパスワードをエコーしない -k または --ask-pass コマンドラインオプションを含めます。
user@localhost:~$ ansible-playbook playbook.yaml --ask-pass SSH password: PLAY [Get Device Facts] *********************************************** ...
Ansible Vaultで暗号化されたファイルを使用してユーザーを認証する方法
Ansibleボールトを作成して、保存されたパスワードやその他の機密性の高い接続および認証値を、ボールトで暗号化されたデータファイルに安全に保存することができます。その後、Playbook は、モジュールのセットと Ansible 接続タイプに適した場所 (Play の vars: セクション内など) で、これらの変数を参照できます。
パスワードなど、必要な変数を含む Ansible Vault ファイルを作成して使用するには、次の手順を実行します。
コンソール サーバーを介して認証する方法
ジュニパーネットワークスのAnsibleモジュールは、コンソール サーバーを介してJunosデバイスに接続できます。コンソール サーバーを経由する SSH 接続の場合、コンソール サーバーと Junos デバイスの両方の認証資格情報を入力する必要があります。コンソール・サーバーの認証には、デバイス・パスワードまたはパスワードで保護されたSSHキー・ファイルのいずれかを使用できます。
コンソール サーバー経由で Junos デバイスに接続する場合、デフォルト値がない場合、またはデフォルト値が適切でない場合、プレイブックで次のパラメーターを指定する必要があります。
-
host—コンソール サーバのホスト名または IP アドレス -
userおよびpasswd- Junos OSログイン資格情報 -
cs_user- コンソール サーバ ユーザ名 -
cs_passwd- コンソール サーバーとの認証に必要なデバイス パスワードまたは SSH キー ファイル パスフレーズ
次の例では、Junos OSユーザーとコンソール・サーバー・ユーザーの認証情報がAnsible Vaultファイルで定義されています。その後、コンテナー変数が Playbook で参照されます。この場合、 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 }}"