Ansible을 사용하여 Junos 디바이스에 연결
요약 주니퍼 네트웍스 Ansible 모듈을 사용하면 SSH, 텔넷 또는 시리얼 콘솔 연결을 사용하여 Junos 디바이스에 연결할 수 있습니다.
주니퍼 네트웍스는 Junos 디바이스를 관리하는 데 사용할 수 있는 Ansible 모듈을 제공합니다. 주니퍼 네트웍스 모듈은 컬렉션을 통해 juniper.device
배포됩니다. 모듈은 이 문서에 설명된 다양한 프로토콜 및 Ansible 연결을 사용하여 Junos 디바이스에 연결할 수 있습니다.
연결 방법 개요
juniper.device
수집 모듈을 통해 SSH, 텔넷 또는 시리얼 콘솔 연결을 사용하여 Junos 디바이스에 연결할 수 있습니다. 터미널 또는 노트북이 Junos 디바이스의 CONSOLE 포트에 물리적으로 연결되어 있을 때는 반드시 직렬 콘솔 연결을 사용해야 합니다. SSH 또는 Telnet을 사용하여 디바이스의 관리 인터페이스 또는 디바이스의 CONSOLE 포트에 직접 연결된 콘솔 서버에 연결할 수 있습니다.
초기 구성의 새 디바이스 또는 제로화된 디바이스는 콘솔 연결을 통해 액세스해야 합니다. 따라서 Ansible을 사용하여 디바이스에 직접 연결된 경우 직렬 콘솔 연결을 사용하거나 디바이스에 직접 연결된 콘솔 서버를 통해 텔넷 또는 SSH를 사용하여 원격 액세스를 위해 아직 구성되지 않은 디바이스를 초기에 구성할 수 있습니다.
기본적으로 모듈은 juniper.device
SSH를 사용하여 디바이스에 연결합니다. 텔넷 또는 직렬 콘솔 연결을 사용하려면 매개 변수를 적절한 값으로 설정합니다 mode
. 장치에 텔넷하려면 인수를 mode
와 "telnet"
동일하게 설정합니다. 직렬 콘솔 연결을 사용하려면 인수를 mode
와 "serial"
동일하게 설정합니다. 표 1 에는 연결 모드, 특정 매개 변수에 대한 기본값, 필요한 Junos OS 구성이 요약되어 있습니다. 모듈은 juniper.device
초기 릴리스를 기준으로 모든 연결 모드를 지원합니다.
연결 모드 |
인수의 |
기본 포트 |
필수 Junos OS 구성 |
---|---|---|---|
NETCONF over SSH(기본값) |
– |
830 |
[edit system services] netconf { ssh; } |
직렬 콘솔 연결 |
|
/dev/ttyUSB0 |
– |
콘솔 서버를 통한 SSH |
– |
22 |
– |
Junos 디바이스에 텔넷 |
|
23 |
[edit system services] telnet; |
콘솔 서버를 통한 텔넷 |
|
23 |
– |
SSH를 통해 텔넷 또는 NETCONF를 사용하여 관리 인터페이스에 액세스하려면 먼저 계층 수준에서 적절한 서비스를 [edit system services]
활성화해야 합니다. 텔넷은 일반 텍스트 암호를 사용하므로(따라서 잠재적인 보안 취약성이 생성됨) SSH를 사용하는 것이 좋습니다.
모듈을 실행하여 juniper.device
Junos 디바이스를 관리할 때 원격 디바이스는 지정된 프로토콜에 적합한 자격 증명을 사용하여 Ansible 사용자를 인증할 수 있어야 합니다. 자세한 내용은 Junos 디바이스에서 Ansible 모듈을 실행하는 사용자 인증을 참조하십시오.
모듈은 juniper.device
Junos 디바이스에 연결할 때 로컬(작업별) 연결 및 지속적(플레이별) 연결을 포함하여 다양한 Ansible 연결을 지원합니다. Ansible 연결은 Ansible이 연극의 각 작업에 대해 호스트에 대한 별도의 연결을 설정하는지 또는 연극의 모든 작업에 대해 지속되는 호스트에 대한 단일 연결을 설정하는지 여부를 결정합니다. Ansible 연결 지정에 대한 자세한 내용은 로컬 및 영구 Ansible 연결 이해를 참조하십시오.
로컬 및 영구 Ansible 연결 이해
주니퍼 네트웍스 Ansible 모듈은 NETCONF를 통해 Junos PyEZ 및 Junos XML API를 사용하여 디바이스와 인터페이스하기 때문에 Junos 디바이스에서 Python을 필요로 하지 않습니다. 따라서 Junos 디바이스에서 작업을 수행하려면 Python이 설치된 Ansible 제어 노드에서 모듈을 로컬로 실행해야 합니다. 플레이북 플레이에 포함하여 connection: local
모듈을 로컬로 실행할 수 있습니다. 를 사용하면 connection: local
Ansible은 호스트에서 작업을 수행하는 플레이의 각 작업에 대해 호스트에 대한 별도의 연결을 설정합니다.
컬렉션 모듈은 juniper.device
호스트에 대한 영구 연결 설정도 지원합니다 connection: juniper.device.pyez
. 영구 연결을 사용하는 경우 Ansible은 여전히 제어 노드에서 로컬로 모듈을 실행하지만 각 호스트에 대한 단일 연결만 설정하고 유지 관리하며, 이는 플레이의 모든 작업 실행 동안 지속됩니다. 호스트에 대한 영구 연결을 설정하는 것이 플레이의 모든 작업에 대해 호스트에 대한 별도의 연결을 설정하는 것보다 여러 작업을 실행하는 데 더 효율적일 수 있습니다.
표 2 에는 Ansible 연결과 이를 지원하는 콘텐츠 세트가 요약되어 있습니다.
Ansible 연결 |
묘사 |
콘텐츠 세트 지원 |
---|---|---|
|
Ansible 제어 노드에서 로컬로 모듈을 실행하지만 호스트에서 작업을 수행하는 플레이의 각 작업에 대해 호스트에 대한 별도의 연결을 설정합니다. |
|
|
Ansible 제어 노드에서 로컬로 모듈을 실행하지만 플레이의 모든 작업 실행 동안 지속되는 호스트에 대한 영구 연결을 설정합니다. |
|
를 사용하면 connection: local
Ansible은 각 모듈에 대해 호스트에 대한 별도의 연결을 설정하므로 모듈의 인수 목록에서 모듈별 연결 및 인증 매개 변수를 정의할 수 있습니다. 반대로, 를 사용하면 connection: juniper.device.pyez
플레이의 모든 작업에서 연결이 유지되므로 모든 모듈에 대해 연결 및 인증 매개 변수를 전역으로 정의해야 합니다. SSH 구성 파일 또는 Ansible 인벤토리 파일과 같은 다른 방법을 통해 매개 변수를 제공하는 것 외에도 연극 섹션에서 매개 변수를 vars:
정의할 수 있습니다. 자세한 내용은 Junos 디바이스에서 Ansible 모듈을 실행하는 사용자 인증을 참조하십시오.
다음 플레이북은 플레이의 모든 작업에 사용되는 각 호스트에 대한 영구 연결을 설정합니다. Ansible 볼트 파일에 저장된 사용자의 자격 증명은 플레이 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 세션을 설정하거나 디바이스의 CONSOLE 포트에 직접 연결된 콘솔 서버와 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 디바이스와 콘솔 서버 모두에 대한 로그인 자격 증명을 지정해야 합니다. 및 passwd
매개 변수를 사용하여 user
Junos OS 로그인 자격 증명을 지정하고, 및 cs_passwd
매개 변수를 사용하여 cs_user
콘솔 서버 자격 증명을 지정합니다. 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/config에서 기본 SSH 클라이언트 구성 파일(있는 경우)을 자동으로 쿼리합니다. 매개 변수를 포함 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
텔넷을 사용하여 장치에 연결
주니퍼 네트웍스 모듈을 사용하면 텔넷을 사용하여 Junos 디바이스에 연결할 수 있으며, 텔넷은 네트워크 디바이스에 암호화되지 않은 액세스를 제공합니다. 디바이스의 관리 인터페이스 또는 디바이스의 CONSOLE 포트에 직접 연결된 콘솔 서버에 텔넷할 수 있습니다. 콘솔 서버를 통해 디바이스에 액세스하면 원격 액세스를 위해 아직 구성되지 않은 새 디바이스 또는 제로화된 디바이스를 처음에 구성할 수 있습니다. 관리 인터페이스에 텔넷하려면 인터페이스에 [edit system services]
액세스해야 하는 모든 디바이스의 계층 수준에서 텔넷 서비스를 구성해야 합니다.
원격 디바이스에 텔넷하려면 매개 변수를 로 "telnet"
설정하고 mode
선택적으로 매개 변수를 포함하여 port
포트를 지정합니다. 로 "telnet"
설정하고 mode
매개 변수를 생략 port
하면 에 대한 port
값은 기본적으로 23이 됩니다. 영구 연결의 경우 섹션에서 및 port
를 vars:
정의합니다mode
. 로컬 연결의 경우, 매개 변수를 section 아래 vars:
또는 모듈 인수로 정의할 수 있습니다.
다음 플레이북은 포트 7016을 사용하여 Junos 디바이스에 텔넷하고, 디바이스 팩트를 검색하고, 파일에 저장합니다. 플레이북은 사용자 이름과 암호를 묻는 메시지를 표시합니다.
--- - 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
직렬 콘솔 연결을 사용하여 디바이스에 연결Connect to a device using a serial console connection
주니퍼 네트웍스 모듈을 사용하면 직렬 콘솔 연결을 사용하여 Junos 디바이스에 연결할 수 있으며, 이는 원격 액세스를 위해 아직 구성되지 않은 새 디바이스 또는 제로화된 디바이스를 처음에 구성해야 할 때 유용합니다. 이 연결 방법을 사용하려면 터미널 또는 노트북이 CONSOLE 포트를 통해 Junos 디바이스에 물리적으로 연결되어 있어야 합니다. Junos 디바이스의 CONSOLE 포트 연결에 대한 자세한 지침은 해당 디바이스의 하드웨어 설명서를 참조하십시오.
직렬 콘솔 연결을 통해 Junos 디바이스에 연결하려면 모듈의 mode
매개 변수를 로 "serial"
설정하고, 선택적으로 매개 변수를 포함하여 port
포트를 지정합니다. 를 로 "serial"
설정 mode
하되 매개 변수를 생략 port
하면 의 port
/dev/ttyUSB0
기본값은 입니다. 영구 연결의 경우 섹션에서 및 port
를 vars:
정의합니다mode
. 로컬 연결의 경우, 매개 변수를 section 아래 vars:
또는 모듈 인수로 정의할 수 있습니다.
다음 플레이북은 CONSOLE 포트를 통해 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