Ansible을 사용하여 Junos 디바이스에서 명령 및 RPC 실행
요약 주니퍼 네트웍스 Ansible 모듈을 사용하여 Junos 디바이스에서 운영 모드 명령 및 RPC를 실행할 수 있습니다.
주니퍼 네트웍스는 Junos 디바이스에서 운영 모드 명령 및 원격 절차 호출(RPC)을 실행하는 데 사용할 수 있는 Ansible 모듈을 제공합니다. 표 1 에는 모듈이 요약되어 있습니다.
콘텐츠 세트 |
모듈 이름 |
---|---|
다음 섹션에서는 모듈을 사용하고, 모듈 응답을 구문 분석하고, 출력 형식을 지정하고, 출력을 파일에 저장하는 방법에 대해 설명합니다.
운영 출력에서 대상 데이터를 보다 쉽게 추출하기 위해 사용자 지정 또는 사전 정의된 Junos PyEZ 운영 테이블과 juniper.device.table
함께 모듈을 사용할 수도 있습니다. 자세한 내용은 Junos PyEZ 테이블과 함께 Ansible을 사용하여 Junos 디바이스에서 운영 정보 검색을 참조하십시오.
주니퍼 네트웍스 모듈로 명령을 실행하는 방법
이 juniper.device.command
모듈을 사용하면 Junos 디바이스에서 운영 모드 명령을 실행할 수 있습니다. 이 모듈에는 디바이스에서 실행할 하나 이상의 Junos OS 운영 모드 명령 목록인 하나의 인수 commands
가 필요합니다.
다음 플레이북은 인벤토리 그룹의 각 디바이스에서 두 개의 운영 모드 명령을 실행하고 모듈 응답을 표준 출력으로 표시합니다. 이 예에서 모듈은 command
기본 위치에서 SSH 키를 사용하여 디바이스로 인증합니다.
--- - name: Get device information hosts: dc1 connection: local gather_facts: no tasks: - name: Get software and uptime information juniper.device.command: commands: - "show version" - "show system uptime" register: junos_result - name: Print response ansible.builtin.debug: var: junos_result
모듈의 응답 및 출력 형식에 대한 자세한 내용은 모듈 응답 이해 및 명령 또는 RPC 출력의 형식을 지정하는 방법을 참조하십시오.
주니퍼 네트웍스 모듈로 RPC를 실행하는 방법
Junos XML API는 Junos OS 구성 명령문 및 운영 모드 명령의 XML 표현입니다. 이는 Junos OS 구성 계층의 모든 문과 Junos OS CLI에서 실행하는 많은 운영 모드 명령에 해당하는 XML을 정의합니다. Junos XML에 대응하는 각 운영 모드 명령은 요청 태그 요소에 매핑되며, 필요한 경우 응답 태그 요소에 매핑됩니다. 요청 태그는 NETCONF 또는 Junos XML 프로토콜 세션 내의 RPC(Remote Procedure Call)에서 Junos 디바이스의 정보를 요청하는 데 사용됩니다. 서버는 응답 태그 요소 내에 포함된 Junos XML 요소를 사용하여 응답을 반환합니다.
이 juniper.device.rpc
모듈을 사용하면 Junos 디바이스에서 RPC를 실행할 수 있습니다. 모듈에는 디바이스에서 실행할 하나 이상의 Junos OS RPC 목록인 하나의 인수 rpcs
가 필요합니다.
다음 플레이북은 인벤토리 그룹의 각 디바이스에서 RPC를 get-interface-information
실행하고 모듈 응답을 표준 출력으로 표시합니다. 에서 RPC는 운영 모드 명령과 show interfaces
동일합니다. 이 예에서 모듈은 rpc
기본 위치에서 SSH 키를 사용하여 디바이스로 인증합니다.
--- - name: Execute RPC hosts: dc1 connection: local gather_facts: no tasks: - name: Get interface information juniper.device.rpc: rpcs: "get-interface-information" register: junos_result - name: Print response ansible.builtin.debug: var: junos_result
CLI 명령을 RPC 요청 태그에 매핑하는 방법에 대한 자세한 내용은 Junos XML API 탐색기 에서 작동 태그를 참조하십시오.
모듈의 응답 및 출력 형식에 대한 자세한 내용은 모듈 응답 이해 및 명령 또는 RPC 출력의 형식을 지정하는 방법을 참조하십시오.
모듈은 juniper.device.rpc
RPC에 kwargs
대한 키워드 인수와 값을 지정할 수 있는 옵션을 지원합니다. 의 kwargs
값은 다음과 같을 수 있습니다.
-
키워드와 값의 단일 사전A single dictionary of keywords and values
-
여러 RPC에 대한 인수를 제공하는 사전 목록입니다
목록의 항목 kwargs
과 목록의 RPC rpcs
간에 일대일 대응이 있어야 합니다. 여러 RPC를 실행하고 RPC에 인수가 필요하지 않은 경우 해당 kwargs
목록 항목을 빈 사전 {}
과 동일하게 설정합니다. 개별 RPC 인수에 값이 필요하지 않은 경우 해당 값을 와 true
동일하게 설정합니다.
RPC 인수에서는 하이픈 대신 밑줄을 사용해야 하며, 이로 인해 특정 상황에서 예외나 오류가 발생할 수 있습니다.
다음 플레이북은 인벤토리 그룹의 각 디바이스에서 지정된 RPC를 실행하고 모듈 응답을 표준 출력으로 표시합니다. RPC는 get-interface-information
lo0.0 인터페이스에 대한 간결한 수준 출력을 요청하고 RPC는 get-lldp-interface-neighbors
ge-0/0/0 인터페이스에 대한 정보를 요청합니다. RPC는 get-software-information
빈 사전을 사용하여 추가 인수 없이 RPC를 실행합니다.
--- - name: Get Device Information hosts: dc1a connection: local gather_facts: no tasks: - name: Get device information juniper.device.rpc: rpcs: - "get-interface-information" - "get-lldp-interface-neighbors" - "get-software-information" kwargs: - interface_name: "lo0.0" terse: true - interface_device: "ge-0/0/0" - {} register: junos_result - name: Print response ansible.builtin.debug: var: junos_result
모듈 응답 이해하기
및 juniper.device.rpc
모듈은 juniper.device.command
디바이스의 RPC 응답을 모듈 응답의 여러 다른 키 내에 저장합니다. 각 키에 대한 데이터는 다음과 같이 구조화됩니다.
-
stdout
- RPC 응답은 단일 여러 줄 문자열입니다. -
stdout_lines
- RPC 응답은 한 줄 문자열의 목록입니다. -
parsed_output
- RPC 응답은 JSON(JavaScript Object Notation) 데이터 구조로 구문 분석됩니다. 이 키는 데이터 형식이 XML 또는 JSON인 경우에만 반환됩니다.
모듈이 단일 명령 또는 RPC를 실행하는 경우 모듈의 응답은 반환된 키를 최상위 수준에 배치합니다. 모듈이 여러 명령 또는 RPC를 실행하는 경우 모듈의 응답에는 대신 사전 목록인 키가 포함됩니다 results
. 목록의 각 요소는 단일 명령 또는 RPC에 해당하며 해당 명령 또는 RPC에 대해 반환되는 모든 키를 포함합니다.
예를 들어 다음 응답은 단일 RPC를 실행하는 것에 해당합니다.
"junos_result": { "attrs": null, "changed": false, "failed": false, "format": "xml", "kwargs": null, "msg": "The RPC executed successfully.", "parsed_output": { "interface-information": { "physical-interface": [ [...output omitted...] } }, "rpc": "get-interface-information", "stdout": "<interface-information style=\"normal\">\n <physical-interface>\n [...output omitted...] </physical-interface>\n</interface-information>\n" "stdout_lines": [ "<interface-information style=\"normal\">", " <physical-interface>", [...output omitted...] " </physical-interface>", "</interface-information>" ] }
경우에 따라 명령 또는 RPC 출력이 광범위할 수 있으며 모듈의 응답에서 출력을 억제해야 할 수 있습니다. 모듈의 응답에서 출력 키를 생략하려면 해당 모듈의 인수 목록에 포함합니다 return_output: false
.
tasks: - name: Get interface information juniper.device.rpc: rpcs: "get-interface-information" return_output: false register: junos_result
명령 또는 RPC 출력의 형식을 지정하는 방법
및 모듈은 command
디바이스의 RPC 응답을 모듈 응답의 여러 다른 키(stdout
, , stdout_lines
및 parsed_output
)에 rpc
저장합니다. 명령 또는 RPC 출력 형식이 XML 또는 JSON인 경우에만 존재하는 키에는 parsed_output
JSON 데이터 구조로 구문 분석되는 데이터가 포함됩니다.
및 stdout_lines
키에는 stdout
모듈에 대해 정의된 기본 형식의 데이터가 포함됩니다. 기본적으로 모듈은 명령 출력을 텍스트 형식으로 반환하고 모듈은 command
rpc
RPC 출력을 XML 형식으로 반환합니다.
다른 출력 형식을 지정하려면 인수를 formats
포함시키고 값을 원하는 형식과 동일하게 설정하십시오. 지원되는 형식은 다음과 같습니다.
-
json
-
text
-
xml
formats
매개 변수는 문자열 또는 문자열 목록을 사용합니다. 여러 명령 또는 RPC를 실행하고 단일 형식만 지정하면 실행된 모든 명령 및 RPC에 대해 출력 형식이 동일합니다. 각 명령 또는 RPC의 출력에 대해 다른 형식을 지정하려면 인수를 formats
원하는 형식 목록으로 설정합니다. 목록은 명령 또는 RPC가 있는 것과 동일한 수의 형식을 지정해야 합니다.
다음 플레이북은 인벤토리 그룹의 각 디바이스에서 2개의 RPC를 실행하고 실행된 모든 RPC의 출력에 대한 텍스트 형식을 요청합니다.
--- - name: Get device information hosts: dc1 connection: local gather_facts: no tasks: - name: Get software and system uptime information juniper.device.rpc: rpcs: - "get-software-information" - "get-system-uptime-information" formats: "text" register: junos_result - name: Print response ansible.builtin.debug: var: junos_result
플레이북이 실행되면 모듈 응답의 및 stdout_lines
키에 stdout
텍스트 형식의 RPC 응답이 포함됩니다.
다음 플레이북은 인벤토리 그룹의 각 디바이스에서 두 개의 RPC를 실행하고 텍스트 형식의 첫 번째 RPC에 대한 출력과 JSON 형식의 두 번째 RPC에 대한 출력을 요청합니다.
--- - name: Get device information hosts: dc1 connection: local gather_facts: no tasks: - name: Get software and system uptime information juniper.device.rpc: rpcs: - "get-software-information" - "get-system-uptime-information" formats: - "text" - "json" register: junos_result - name: Print response ansible.builtin.debug: var: junos_result
명령 또는 RPC 출력을 파일에 저장하는 방법
및 모듈을 사용하여 juniper.device.command
디바이스에서 명령 또는 RPC를 실행할 때 또는 dest_dir
모듈 인수를 포함하여 dest
반환된 데이터를 로컬 Ansible 제어 노드의 파일에 저장할 수 juniper.device.rpc
있습니다. 옵션은 각 명령 또는 RPC에 대한 출력을 디바이스에 대한 별도의 파일에 저장하는 반면dest_dir
, dest
옵션은 모든 명령 및 RPC에 대한 출력을 디바이스의 동일한 파일에 저장합니다. 대상 이름을 가진 출력 파일이 이미 있는 경우 모듈은 파일을 덮어씁니다.
데이터를 파일에 저장하고 모듈의 응답에서 명령 또는 RPC 출력을 복제하지 않으려는 경우 선택적으로 모듈의 인수 목록에 포함할 return_output: false
수 있습니다. 값을 로 false
설정하면 return_output
모듈이 모듈의 응답에서 출력 키를 생략합니다. 디바이스가 상당한 양의 데이터를 반환하는 경우 이 작업이 필요할 수 있습니다.
다음 섹션에서는 및 dest
옵션을 사용하는 dest_dir
방법에 대해 간략하게 설명합니다.
dest_dir
검색된 데이터가 저장되는 로컬 Ansible 제어 노드의 디렉터리를 지정하려면 인수를 포함 dest_dir
하고 대상 디렉터리의 경로를 정의합니다. 모듈은 장치에서 실행된 각 명령 또는 RPC에 대한 출력을 _name라는hostname 별도의 파일에 저장합니다.format 설명:
-
hostname- 명령 또는 RPC가 실행되는 디바이스의 호스트 이름.
-
name- 매니지드 디바이스에서 실행된 명령 또는 RPC의 이름입니다. 이 모듈은 명령 이름의 공백을 밑줄( _ )로 바꿉니다.
-
format- 출력 형식으로, json, text 또는 xml일 수 있습니다.
다음 플레이북은 인벤토리 그룹의 각 디바이스에서 두 개의 RPC를 실행하고 각 디바이스의 각 RPC에 대한 출력을 Ansible 제어 노드의 플레이북 디렉터리에 있는 별도의 파일에 저장합니다.
--- - name: Get device information hosts: dc1 connection: local gather_facts: no tasks: - name: Get software and uptime information juniper.device.rpc: rpcs: - "get-software-information" - "get-system-uptime-information" dest_dir: "{{ playbook_dir }}"
호스트 dc1a.example.net 의 결과 출력 파일은 다음과 같습니다.
-
dc1a.example.net_get-software-information.xml
-
dc1a.example.net_get-system-uptime-information.xml
마찬가지로 다음 플레이북은 인벤토리 그룹의 각 디바이스에서 동일한 명령을 실행하고 각 디바이스의 각 명령에 대한 출력을 Ansible 제어 노드의 플레이북 디렉터리에 있는 별도의 파일에 저장합니다.
--- - name: Get device information hosts: dc1 connection: local gather_facts: no tasks: - name: Get software and uptime information juniper.device.command: commands: - "show version" - "show system uptime" dest_dir: "{{ playbook_dir }}"
호스트 dc1a.example.net 의 결과 출력 파일은 다음과 같습니다.
-
dc1a.example.net_show_version.텍스트
-
dc1a.example.net_show_system_uptime.텍스트
대상
대상 노드에 대한 모든 명령 또는 RPC 출력이 로컬 Ansible 제어 노드에 저장되는 경로 및 파일 이름을 지정하려면 인수를 포함 dest
하고 파일 이름 또는 파일의 전체 경로를 정의합니다. 인수를 dest
포함하지만 디렉터리를 생략하면 파일이 플레이북 디렉터리에 저장됩니다. 여러 디바이스에서 명령 또는 RPC를 실행하는 경우 인수에 dest
각 디바이스의 파일 이름을 구별하는 것과 같은 {{ inventory_hostname }}
변수가 포함되어야 합니다. 파일 이름을 구분하지 않으면 각 장치의 출력 파일이 다른 장치의 출력 파일을 덮어씁니다.
다음 플레이북은 인벤토리 그룹의 각 디바이스에서 RPC를 실행합니다. 모든 RPC의 출력은 각 디바이스에 대해 별도의 파일에 저장되며 파일은 Ansible 제어 노드의 플레이북 디렉터리에 배치됩니다. 각 파일은 디바이스 호스트 이름으로 고유하게 식별됩니다.
--- - name: Get device information hosts: dc1 connection: local gather_facts: no tasks: - name: Get software and uptime information juniper.device.rpc: rpcs: - "get-software-information" - "get-system-uptime-information" dest: "{{ inventory_hostname }}-system-information.xml"
예를 들어, 호스트 dc1a.example.net 에 대한 결과 출력 파일은 dc1a.example.net-system-information.xml 되며 디바이스에서 실행되는 모든 RPC에 대한 출력을 포함합니다.