Ansible을 사용하여 Junos 디바이스에 연결
요약 주니퍼 네트웍스의 Ansible 모듈을 사용하면 SSH, 텔넷 또는 시리얼 콘솔 연결을 사용하여 Junos 디바이스에 연결할 수 있습니다.
주니퍼 네트웍스는 Junos 디바이스를 관리하는 데 사용할 수 있는 Ansible 모듈을 제공합니다. 주니퍼 네트웍스 모듈은 Ansible Galaxy에서 호스팅되는 컬렉션과 Juniper.junos
역할을 통해 juniper.device
배포됩니다. 모듈은 이 문서에 설명된 다양한 프로토콜과 Ansible 연결을 사용하여 Junos 디바이스에 연결할 수 있습니다.
연결 방법 개요
주니퍼 네트웍스 Ansible 모듈을 사용하면 SSH, 텔넷 또는 시리얼 콘솔 연결을 사용하여 Junos 디바이스에 연결할 수 있습니다. 터미널 또는 노트북이 Junos 디바이스의 CONSOLE 포트에 물리적으로 연결되어 있는 경우 시리얼 콘솔 연결을 사용해야 합니다. SSH 또는 텔넷을 사용하여 디바이스의 관리 인터페이스 또는 디바이스의 콘솔 포트에 직접 연결된 콘솔 서버에 연결할 수 있습니다.
공장 기본 구성을 가진 신규 또는 제로화된 디바이스는 콘솔 연결을 통해 액세스해야 합니다. 따라서 디바이스에 직접 연결되어 있을 때 시리얼 콘솔 연결을 사용하거나 디바이스에 직접 연결된 콘솔 서버를 통해 텔넷 또는 SSH를 사용하여 원격 액세스를 위해 아직 구성되지 않은 디바이스를 초기에 구성할 수 있습니다.
기본적으로 주니퍼 네트웍스 모듈은 SSH를 사용하여 디바이스에 연결합니다. 텔넷 또는 직렬 콘솔 연결을 사용하려면 모듈의 mode
매개 변수를 적절한 값으로 설정합니다. 디바이스에 텔넷하려면 인수를 mode
와 동일하게 "telnet"
설정합니다. 직렬 콘솔 연결을 사용하려면 인수를 mode
와 동일하게 "serial"
설정합니다. 표 1 에는 연결 모드, 특정 매개 변수에 대한 기본값, 필요한 Junos OS 구성 및 Juniper.junos
해당 연결 모드에 대한 지원이 처음 도입된 릴리스가 요약되어 있습니다. 이 juniper.device
모듈은 최초 출시 시점부터 모든 연결 모드를 지원합니다.
연결 모드 |
인수의 |
기본 포트 |
필수 Junos OS 구성 |
첫 번째 지원 릴리스( |
---|---|---|---|---|
SSH를 통한 NETCONF(기본값) |
– |
830 |
[edit system services] netconf { ssh; } |
1.0.0 |
시리얼 콘솔 연결 |
|
/dev/ttyUSB0 |
– |
2.0.0 |
콘솔 서버를 통한 SSH |
– |
22 |
– |
2.2.0 |
Junos 디바이스에 텔넷 연결하기 |
|
23 |
[edit system services] telnet; |
1.4.0 2.0.0에 추가된 기본 포트 |
콘솔 서버를 통한 텔넷 |
|
23 |
– |
1.4.0 |
SSH를 통해 텔넷 또는 NETCONF를 사용하여 관리 인터페이스에 액세스하려면 먼저 계층 수준에서 적절한 서비스를 [edit system services]
활성화해야 합니다. 텔넷은 일반 텍스트 암호를 사용하므로 잠재적인 보안 취약성이 발생하므로 SSH를 사용하는 것이 좋습니다.
주니퍼 네트웍스 모듈을 실행하여 Junos 디바이스를 관리할 때 원격 디바이스는 지정된 프로토콜에 적합한 자격 증명을 사용하여 Ansible 사용자를 인증할 수 있어야 합니다. 자세한 내용은 Junos 디바이스에서 Ansible 모듈을 실행하는 사용자 인증을 참조하십시오.
주니퍼 네트웍스 모듈은 Junos 디바이스에 연결할 때 로컬(작업별) 연결과 영구(플레이별) 연결을 포함하여 다양한 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 제어 노드에서 로컬로 모듈을 실행하되 플레이 중인 모든 작업을 실행하는 동안 지속되는 호스트에 대한 지속적인 연결을 설정합니다. |
|
Ansible은 더 이상 사용되지 않습니다 connection: local
. 따라서 컬렉션 모듈을 사용하는 경우 Ansible이 이후 릴리스에서 로컬 연결에 대한 지원을 제거하는 경우 문제를 방지하기 위해 플레이북에서 사용하는 juniper.device
connection: juniper.device.pyez
것이 좋습니다.
를 사용할 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: 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/config에 있는 기본 SSH 구성 파일을 자동으로 쿼리합니다. 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 debug: var: junos.version
또한 주니퍼 네트웍스 Ansible 모듈을 사용하면 콘솔 서버에 대한 SSH 연결을 통해 Junos 디바이스에 연결할 수 있습니다. 이 경우 Junos 디바이스와 콘솔 서버 모두에 대한 로그인 자격 증명을 지정해야 합니다. user
및 매개 변수를 사용하여 Junos OS 로그인 자격 증명을 지정하고, 및 passwd
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 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 debug: var: junos.version
텔넷을 사용하여 장치에 연결
주니퍼 네트웍스 모듈을 사용하면 네트워크 디바이스에 대한 암호화되지 않은 액세스를 제공하는 텔넷을 사용하여 Junos 디바이스에 연결할 수 있습니다. 디바이스의 관리 인터페이스 또는 디바이스의 CONSOLE 포트에 직접 연결된 콘솔 서버에 텔넷을 연결할 수 있습니다. 콘솔 서버를 통해 디바이스에 액세스하면 원격 액세스를 위해 아직 구성되지 않은 새 디바이스 또는 제로화된 디바이스를 초기에 구성할 수 있습니다. 관리 인터페이스에 텔넷하려면 인터페이스에 액세스해야 하는 모든 디바이스의 계층 수준에서 텔넷 서비스를 [edit system services]
구성해야 합니다.
원격 디바이스에 텔넷하려면 매개 변수를 로 "telnet"
설정하고 mode
선택적으로 매개 변수를 포함하여 port
포트를 지정합니다. 매개 변수를 로 설정 mode
"telnet"
하지만 생략하면 port
의 port
값은 기본적으로 23으로 설정됩니다. 지속적 연결의 경우, 섹션 아래에 및 port
을(를) 정의 mode
하십시오vars:
. 로컬 연결의 경우 매개 변수를 섹션 아래 vars:
또는 모듈 인수로 정의할 수 있습니다.
다음 플레이북은 포트 7016을 사용하여 Junos 디바이스에 텔넷하고, 디바이스 팩트를 검색하여 파일에 저장합니다. 모듈은 기본 사용자를 사용하고 로그인 암호를 묻는 메시지를 표시합니다.
--- - name: Get Device Facts hosts: dc1 connection: local gather_facts: no vars_prompt: - name: "DEVICE_PASSWORD" prompt: "Device password" private: yes vars: passwd: "{{ DEVICE_PASSWORD }}" mode: "telnet" port: "7016" tasks: - name: Retrieve facts from Junos devices juniper.device.facts: savedir: "{{ playbook_dir }}" - name: Print version debug: var: junos.version
직렬 콘솔 연결을 사용하여 장치에 연결Connect to a device using a serial console connection
주니퍼 네트웍스 모듈을 사용하면 시리얼 콘솔 연결을 사용하여 Junos 디바이스에 연결할 수 있으며, 이는 원격 액세스를 위해 아직 구성되지 않은 신규 또는 제로화된 디바이스를 처음 구성해야 할 때 유용합니다. 이 연결 방법을 사용하려면 터미널 또는 노트북이 CONSOLE 포트를 통해 Junos 디바이스에 물리적으로 연결되어 있어야 합니다. Junos 디바이스의 CONSOLE 포트 연결에 대한 자세한 지침은 특정 디바이스에 대한 하드웨어 설명서를 참조하십시오.
시리얼 콘솔 연결을 통해 Junos 디바이스에 연결하려면 모듈의 mode
매개 변수를 로 "serial"
설정하고, 선택적으로 매개 변수를 포함하여 port
포트를 지정합니다. 로 설정 mode
"serial"
하되 매개 변수를 생략 port
하면 의 port
값은 기본적으로 /dev/ttyUSB0
. 지속적 연결의 경우, 섹션 아래에 및 port
을(를) 정의 mode
하십시오vars:
. 로컬 연결의 경우 매개 변수를 섹션 아래 vars:
또는 모듈 인수로 정의할 수 있습니다.
다음 플레이북은 CONSOLE 포트를 통해 Junos 디바이스에 연결한 다음 초기 구성을 로드하고 커밋합니다. 모듈은 기본 사용자를 사용하고 로그인 암호를 묻는 메시지를 표시합니다.
--- - name: Load Initial Configuration hosts: dc1 connection: local gather_facts: no vars_prompt: - name: "DEVICE_PASSWORD" prompt: "Device password" private: yes tasks: - name: Load initial configuration and commit juniper.device.config: passwd: "{{ DEVICE_PASSWORD }}" mode: "serial" load: "merge" src: "configs/junos.conf" register: response - name: Print the response debug: var: response