Ansibleを使用したJunosデバイスへの接続
概要 ジュニパーネットワークスのAnsibleモジュールを使用すると、SSH、Telnet、またはシリアルコンソール接続を使用してJunosデバイスに接続できます。
ジュニパーネットワークスは、Junosデバイスの管理に使用できるAnsibleモジュールを提供しています。ジュニパーネットワークスのモジュールは、 juniper.device コレクションを通じて配布されます。モジュールは、このドキュメントで説明するさまざまなプロトコルとAnsible接続を使用してJunosデバイスに接続できます。
接続方法の概要
juniper.device収集モジュールを使用すると、SSH、Telnet、またはシリアル コンソール接続を使用して Junos デバイスに接続できます。端末またはラップトップがJunosデバイスのCONSOLEポートに物理的に接続されている場合は、シリアル コンソール接続を使用する必要があります。SSHまたはTelnetを使用して、デバイスの管理インターフェイス、またはデバイスのコンソール ポートに直接接続されているコンソール サーバーに接続できます。
工場出荷時のデフォルト設定を持つ新規またはゼロ化されたデバイスは、コンソール接続を介してアクセスする必要があります。そのため、Ansibleを使用して、デバイスに直接接続しているときにシリアルコンソール接続を使用するか、デバイスに直接接続されているコンソールサーバーを介してtelnetまたはSSHを使用することで、リモートアクセス用にまだ設定されていないデバイスを最初に設定できます。
デフォルトでは、 juniper.device モジュールはSSHを使用してデバイスに接続します。telnet またはシリアル コンソール接続を使用するには、 mode パラメーターを適切な値に設定します。デバイスに telnet で接続するには、 mode 引数を "telnet" に設定します。シリアル コンソール接続を使用するには、 mode 引数を "serial" に設定します。 表 1 は、接続モード、特定のパラメーターのデフォルト値、必要な Junos OS 設定をまとめたものです。 juniper.device モジュールは、初期リリース時点ですべての接続モードをサポートしています。
| 接続モード |
引数の値 |
デフォルトポート |
必要な Junos OS 設定 |
|---|---|---|---|
| SSH経由のNETCONF(デフォルト) |
– |
830 |
[edit system services]
netconf {
ssh;
}
|
| シリアル コンソール接続 |
|
/dev/ttyUSB0 |
– |
| コンソール サーバー経由の SSH |
– |
22 |
– |
| Junos デバイスへの Telnet 接続 |
|
23 |
[edit system services] telnet; |
| コンソール サーバー経由の Telnet |
|
23 |
– |
Telnet または SSH 経由の NETCONF を使用して管理インターフェイスにアクセスする前に、まず [edit system services] 階層レベルで適切なサービスを有効にする必要があります。telnet はクリアテキスト パスワードを使用するため(潜在的なセキュリティ上の脆弱性が生じる)、SSH の使用を推奨します。
juniper.deviceモジュールを実行してJunosデバイスを管理する場合、リモートデバイスは、指定されたプロトコルに適した認証情報を使用してAnsibleユーザーを認証できる必要があります。詳細については、JunosデバイスでAnsibleモジュールを実行するユーザーの認証を参照してください。
juniper.deviceモジュールは、Junosデバイスに接続する際に、ローカル(タスク単位)接続や永続的(プレイ単位)接続など、さまざまなAnsible接続をサポートします。Ansible接続は、Ansibleがプレイ内のタスクごとにホストへの個別の接続を確立するか、プレイ内のすべてのタスクにわたって保持されるホストへの単一の接続を確立するかを決定します。Ansible接続の指定については、ローカルおよび永続的なAnsible接続についてを参照してください。
ローカルおよび永続的なAnsible接続について
ジュニパーネットワークスのAnsibleモジュールは、Junos PyEZとNETCONF上でJunos XML APIを使用してデバイスとインターフェイスするため、JunosデバイスにPythonを使用する必要はありません。そのため、Junosデバイスで操作を実行するには、PythonがインストールされているAnsible制御ノードでローカルにモジュールを実行する必要があります。Playbook プレイに connection: local を含めることで、モジュールをローカルで実行できます。 connection: local を使用すると、Ansible は、ホストで操作を実行するプレイ内のタスクごとに、ホストへの個別の接続を確立します。
juniper.device収集モジュールは、ホストへの永続的な接続を確立するためのconnection: juniper.device.pyezもサポートしています。永続的な接続を使用する場合、Ansible は引き続き制御ノードでモジュールをローカルに実行しますが、各ホストへの 1 つの接続のみを確立して維持し、プレイ内のすべてのタスクの実行にわたって持続します。ホストへの永続的な接続を確立することは、プレイ内のすべてのタスクに対してホストへの個別の接続を確立するよりも、複数のタスクを実行するのに効率的です。
表2 は、Ansible接続とそれらをサポートするコンテンツセットをまとめたものです。
| Ansible接続 |
形容 |
コンテンツセットのサポート |
|---|---|---|
|
|
モジュールをAnsible制御ノードでローカルに実行しますが、ホストで操作を実行するプレイ内のタスクごとにホストへの個別の接続を確立します。 |
|
|
|
モジュールをAnsible制御ノードでローカルに実行しますが、プレイ内のすべてのタスクの実行中はホストへの永続的な接続を確立します。 |
|
connection: local を使用すると、Ansible はモジュールごとにホストへの個別の接続を確立するため、モジュールの引数リストでモジュール固有の接続および認証パラメーターを定義できます。対照的に、connection: juniper.device.pyez を使用すると、プレイ内のすべてのタスクで接続が維持されるため、すべてのモジュールに対して接続と認証のパラメーターをグローバルに定義する必要があります。パラメータは、SSH構成ファイルやAnsibleインベントリファイルなど、他の方法で指定するだけでなく、プレイのvars:セクションで定義できます。詳細については、JunosデバイスでAnsibleモジュールを実行するユーザーを認証するを参照してください。
次のプレイブックは、プレイ内のすべてのタスクに使用される各ホストへの永続的な接続を確立します。Ansible Vaultファイルに保存されているユーザーの認証情報は、プレイの vars: セクションで定義されます。
---
- name: Get Device Information
hosts: dc1
connection: juniper.device.pyez
gather_facts: no
vars:
host: "{{ inventory_hostname }}"
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を使用したデバイスへの接続
ジュニパーネットワークスのAnsibleモジュールは、SSHを使用したJunosデバイスへの接続をサポートしています。デバイスの管理インターフェイスでSSH経由でNETCONFセッションを確立するか、デバイスの コンソール ポートに直接接続されているコンソールサーバーとSSH接続を確立できます。SSHサーバーは、 JunosデバイスでAnsibleモジュールを実行しているユーザーを認証で説明するように、標準のSSH認証メカニズムを使用してユーザーを認証できる必要があります。SSH 経由で NETCONF セッションを確立するには、 Junos OS 管理対象ノードに Ansible を設定するに記載されている要件も満たす必要があります。
ジュニパーネットワークスのモジュールは、~/.ssh/config にあるデフォルトの SSH 構成ファイルがあれば、それに対して自動的にクエリーを実行します。 ssh_config パラメーターを含めて、別の構成ファイルを指定することもできます。
SSH を使用して Junos デバイスまたはデバイスに接続されているコンソール サーバーに接続する場合、モジュールはまず SSH 公開キーベースの認証を試み、次にパスワードベースの認証を試みます。パスワードベースの認証を使用する場合、指定されたパスワードがデバイスパスワードとして使用されます。SSH キーが使用されている場合、指定されたパスワードが秘密キーのロックを解除するためのパスフレーズとして使用されます。SSH秘密キーのパスフレーズが空の場合、パスワードは必要ありません。ただし、空のパスフレーズでSSH秘密キーを使用することはお勧めしません。
次のプレイブックは、JunosデバイスとのSSH経由のNETCONFセッションを確立し、デバイスのファクトを取得します。プレイブックは、デフォルトの場所で SSH キーを使用します。
---
- name: Get Device Facts
hosts: dc1
connection: local
gather_facts: no
tasks:
- name: Retrieve facts from Junos devices
juniper.device.facts:
savedir: "{{ playbook_dir }}"
- name: Print version
ansible.builtin.debug:
var: junos.version
ジュニパーネットワークスのAnsibleモジュールにより、コンソールサーバーへのSSH接続を介してJunosデバイスに接続することもできます。この場合、Junosデバイスとコンソール サーバーの両方のログイン情報を指定する必要があります。 user および passwd パラメーターを使用してJunos OSログイン資格情報を指定し、 cs_user および cs_passwd パラメーターを使用してコンソール・サーバーの資格情報を指定します。SSH キーが使用されている場合、 cs_passwd は秘密キーのパスフレーズです。
以下のプレイブックでは、コンソール サーバーと Junos デバイスの認証情報の入力を求められます。モジュールはコンソール サーバーで認証し、次に Junos デバイスで認証します。認証が成功すると、プレイブックは管理対象ノードからデバイスファクトを取得し、Junos OSのバージョンを出力します。
---
- name: Get Device Facts
hosts: dc1_con
connection: local
gather_facts: no
vars_prompt:
- name: "CS_USER"
prompt: "Console server username"
private: no
- name: "CS_PASSWORD"
prompt: "Console server password"
private: yes
- name: "JUNOS_USER"
prompt: "Junos OS username"
private: no
- name: "JUNOS_PASSWORD"
prompt: "Junos OS password"
private: yes
vars:
cs_user: "{{ CS_USER }}"
cs_passwd: "{{ CS_PASSWORD }}"
user: "{{ JUNOS_USER }}"
passwd: "{{ JUNOS_PASSWORD }}"
tasks:
- name: "Retrieve facts from Junos devices"
juniper.device.facts:
savedir: "{{ playbook_dir }}"
- name: Print version
ansible.builtin.debug:
var: junos.version
ジュニパーネットワークスのモジュールは、デフォルトのSSHクライアント構成ファイル( ~/.ssh/config)があれば、それに対して自動的にクエリーを実行します。 ssh_config パラメーターを含め、構成ファイルの場所を指定することで、別の SSH 構成ファイルを使用できます。例えば:
---
- name: Get Device Facts
hosts: dc1
connection: local
gather_facts: no
vars:
ssh_config: "/home/admin/.ssh/config_dc"
tasks:
- name: "Retrieve facts from Junos devices"
juniper.device.facts:
savedir: "{{ playbook_dir }}"
- name: Print version
ansible.builtin.debug:
var: junos.version
Telnet を使用したデバイスへの接続
ジュニパーネットワークスのモジュールを使用すると、telnetを使用してJunosデバイスに接続できます。これにより、ネットワークデバイスへの暗号化されていないアクセスが可能になります。Telnet では、デバイスの管理インターフェイス、またはデバイスの コンソール ポートに直接接続されているコンソール サーバーに telnet 接続できます。コンソール サーバー経由でデバイスにアクセスすると、リモート アクセス用にまだ構成されていない新しいデバイスまたはゼロ化されたデバイスを初期設定できます。管理インターフェイスに telnet で接続するには、インターフェイスへのアクセスを必要とするすべてのデバイスで、 [edit system services] 階層レベルで Telnet サービスを設定する必要があります。
リモート デバイスに telnet で接続するには、mode パラメーターを "telnet" に設定し、オプションで port パラメーターを含めてポートを指定します。mode を "telnet" に設定し、port パラメーターを省略すると、port の値はデフォルトで 23 になります。永続的な接続の場合は、vars:セクションでmodeとportを定義します。ローカル接続の場合、パラメーターを vars: セクションで定義するか、モジュール引数として定義できます。
次のプレイブックは、ポート 7016 を使用して Junos デバイスに telnet し、デバイス ファクトを取得して、ファイルに保存します。プレイブックは、ユーザー名とパスワードの入力を求められます。
---
- name: Get Device Facts
hosts: dc1
connection: local
gather_facts: no
vars_prompt:
- name: "DEVICE_USERNAME"
prompt: "Device username"
private: no
- name: "DEVICE_PASSWORD"
prompt: "Device password"
private: yes
vars:
user: "{{ DEVICE_USERNAME }}"
passwd: "{{ DEVICE_PASSWORD }}"
mode: "telnet"
port: "7016"
tasks:
- name: Retrieve facts from Junos devices
juniper.device.facts:
savedir: "{{ playbook_dir }}"
- name: Print version
ansible.builtin.debug:
var: junos.version
シリアル コンソール接続を使用したデバイスへの接続
ジュニパーネットワークスのモジュールを使用すると、シリアルコンソール接続を使用してJunosデバイスに接続できます。これは、リモートアクセス用にまだ設定されていない新しいデバイスまたはゼロ化されたデバイスを最初に設定する必要がある場合に便利です。この接続方法を使用するには、端末またはラップトップが CONSOLE ポートを介して Junos デバイスに物理的に接続されている必要があります。Junosデバイスの CONSOLE ポートへの接続について、詳しい手順は、お使いのデバイスのハードウェアマニュアルを参照してください。
シリアル コンソール接続を介してJunosデバイスに接続するには、モジュールのmodeパラメーターを"serial"に設定し、オプションでportパラメーターを含めてポートを指定します。mode を "serial" に設定し、port パラメーターを省略すると、port の値はデフォルトで /dev/ttyUSB0 になります。永続的な接続の場合は、vars:セクションでmodeとportを定義します。ローカル接続の場合は、パラメーターを vars: セクションで定義するか、モジュール引数として定義できます。
次のプレイブックは、 コンソール ポートを介して Junos デバイスに接続し、初期設定を読み込んでコミットします。プレイブックは、ユーザー名とパスワードの入力を求められます。
---
- name: Load Initial Configuration
hosts: dc1
connection: local
gather_facts: no
vars_prompt:
- name: "DEVICE_USERNAME"
prompt: "Device username"
private: no
- name: "DEVICE_PASSWORD"
prompt: "Device password"
private: yes
tasks:
- name: Load initial configuration and commit
juniper.device.config:
user: "{{ DEVICE_USERNAME }}"
passwd: "{{ DEVICE_PASSWORD }}"
mode: "serial"
load: "merge"
src: "configs/junos.conf"
register: response
- name: Print the response
ansible.builtin.debug:
var: response