使用 juniper.device.config Ansible 模块检索或比较 Junos OS 配置
您可以使用 juniper.device.config Ansible 模块检索或比较运行 Junos OS 的设备和运行 Junos OS Evolved 的设备上的配置。
瞻博网络提供了一个 Ansible 模块,该模块允许您管理运行 Junos OS 的设备和运行 Junos OS Evolved 的设备的配置。 表 1 概述了可用模块,您可以使用该模块检索或比较 Junos 设备配置。
| 收藏 |
模块集 |
模块名称 |
|---|---|---|
|
|
您可以使用该 juniper.device.config 模块请求完整配置。您还可以为本机 Junos OS 配置以及与已添加到设备的第三方 YANG 数据模型相对应的配置数据请求选定的配置部分。
要检索配置,请使用 juniper.device.config 参数执行 retrieve 模块。模块的响应包括 和 config config_lines 键中的文本格式配置,除非该 return_output 选项设置为 false。您还可以将活动配置与之前提交的配置进行比较。
以下部分讨论如何使用该模块检索或比较配置。
如何为配置数据指定源数据库
使用 juniper.device.config 模块检索配置时,必须将参数 retrieve 包含在模块的参数列表中。该 retrieve 参数指定要从中检索数据的配置数据库。您可以设置为 retrieve 以下值以从相应的数据库返回配置数据:
-
candidate- 从候选配置中检索数据。 -
committed— 从提交的配置中检索数据。
提交的配置数据库
以下操作指南以文本格式检索清单组中每台设备的完整提交配置:
---
- name: Get Junos OS configuration
hosts: junos
connection: local
gather_facts: no
tasks:
- name: Get committed configuration
juniper.device.config:
retrieve: committed
register: response
- name: Print result
ansible.builtin.debug:
var: response
候选配置数据库
以下操作指南以文本格式检索清单组中每台设备的完整候选配置。如果数据库被锁定或修改,则模块将返回错误。
---
- name: Get Junos OS configuration
hosts: junos
connection: local
gather_facts: no
tasks:
- name: Get candidate configuration
juniper.device.config:
retrieve: candidate
register: response
- name: Print result
ansible.builtin.debug:
var: response
如何指定要返回的配置数据的范围
除了检索完整的 Junos OS 配置外,您还可以使用 该 filter 参数检索配置的特定部分。该 filter 参数的值是一个字符串,其中包含子树过滤器,用于选择要返回的配置语句。子树过滤器返回与选择条件匹配的配置数据。如果您请求多个层次结构,则 的 filter 值必须表示从根(由 <configuration> 元素表示)一直到要显示的每个元素的所有配置层级。
以下操作指南在每个设备的已提交配置数据库中检索[edit protocols]并打印层次结构级别的[edit interfaces]配置:
---
- name: Get Junos OS configuration hierarchies
hosts: junos
connection: local
gather_facts: no
tasks:
- name: Get selected configuration hierarchies
juniper.device.config:
retrieve: committed
filter: "<configuration><interfaces/><protocols/></configuration>"
register: response
- name: Print result
ansible.builtin.debug:
var: response
以下操作指南检索并打印 ge-1/0/1 接口的配置:
---
- name: Get Junos OS configuration hierarchies
hosts: junos
connection: local
gather_facts: no
tasks:
- name: Get selected configuration hierarchies
juniper.device.config:
retrieve: committed
filter: "<interfaces><interface>
<name>ge-1/0/1</name></interface></interfaces>"
register: response
- name: Print result
ansible.builtin.debug:
var: response
以下操作指南检索并打印在 [edit system services] 层次结构级别提交的配置:
---
- name: Get Junos OS configuration hierarchies.
hosts: junos
connection: local
gather_facts: no
tasks:
- name: Get selected configuration hierarchies
juniper.device.config:
retrieve: committed
filter: "system/services"
register: response
- name: Print result
ansible.builtin.debug:
var: response
如何指定要返回的配置数据的格式
使用该 juniper.device.config 模块检索配置时,该模块将调用 Junos XML 协议 <get-configuration> 操作,该操作可以返回不同格式的配置数据。默认情况下,该模块将配置数据作为格式化文本返回。文本格式使用换行符、制表符和其他空格、大括号和方括号来指示语句之间的层次结构关系。
要指定返回配置数据的格式,请将模块的 format 参数设置为等于所需格式。可接受的值包括:
-
json—JavaScript 对象标记 (JSON) -
set—Junos OSset命令 -
text- 格式化文本 (默认) -
xml—Junos XML 元素
在 playbook 输出中,和 config_lines 键config以请求的格式包含配置。如果请求 Junos XML 或 JSON 格式,config_parsed则密钥将包含 JSON 格式的等效配置。
以下操作指南以 XML 格式检索清单组中每台设备的完整提交配置:
---
- name: Get Junos OS configuration.
hosts: junos
connection: local
gather_facts: no
tasks:
- name: Get configuration in XML format
juniper.device.config:
retrieve: committed
format: xml
register: response
- name: Print result
ansible.builtin.debug:
var: response
如何处理大型配置
Junos 设备以 XML 格式返回 RPC 响应。即使您请求 JSON、集合或文本格式的数据,NETCONF 服务器的响应也会将数据包装在 XML 标记中。因此,Ansible 模块必须使用 XML 解析器来处理 RPC 回复。XML 解析器通常对单个文本节点的文档深度和大小施加安全限制。这些限制是一项内置的安全措施,用于防止恶意攻击、内存耗尽和一般性能问题。
网络设备可以具有大型、复杂的配置以及大量的命令和 RPC 输出。默认情况下,XML 解析器对文本节点施加大小限制,通常约为 10 MB。当单个文本节点超过大小限制时,解析器会生成错误。例如:
TASK [Retrieve the committed configuration] **************************************** [ERROR]: Task failed: Module failed: Resource limit exceeded: Text node too long, try XML_PARSE_HUGE, line 83442, column 21 (<string>, line 83442)
通常,如果您请求 XML 格式的配置、命令或 RPC 数据,则文档包含许多小的 XML 节点,并且解析器不会遇到此限制,除非在极少数情况下。但是,如果您请求 JSON、set 或文本格式的相同数据,则设备将返回用一个或多个 XML 标记包装的数据。例如,除了 <rpc-reply> 标记之外,设备还会根据需要将集配置数据和文本配置数据包装在标记 <configuration-set> 或标记中 <configuration-text> 。同样,该设备将命令输出以文本格式封装在元素中 <output> 。对于大量数据,响应可能会导致单个 XML 文本节点超出解析器的默认限制。
当您请求任何格式的大型配置或大量命令或 RPC 输出时,XML 解析器将处理 RPC 回复。因此,您可能遇到所有格式的节点大小限制错误,尽管对于 XML 数据来说这种情况比较罕见。在这些情况下,建议将响应作为 XML 返回。
如果您需要其他格式之一,则可以通过包含 huge_tree: true 模块参数来覆盖解析器限制。使用 huge_tree: true时,它会启用该 XML_PARSE_HUGE 选项,该选项将忽略对最大文本节点大小、最大属性大小和最大深度的限制。因此,解析器可以处理大型 XML 文档、深度 XML 树和大型文本节点。
以下操作指南按清单组中设备的格式检索已提交的配置 set 。 juniper.device.config 模块参数包括 huge_tree: true.使用此选项,即使特定响应超过解析器的默认节点大小限制,任务也会成功。
---
- name: Handle large configurations
hosts: junos
connection: local
gather_facts: false
tasks:
- name: Retrieve the committed configuration
juniper.device.config:
retrieve: committed
diff: false
check: false
commit: false
format: set
huge_tree: true
register: response
- name: Print response
ansible.builtin.debug:
var: response
如何检索第三方 YANG 数据模型的配置数据
您可以在 Junos 设备上加载标准化或自定义 YANG 模块,以添加 Junos OS 本身不支持但可以通过转换支持的数据模型。可以使用为候选配置中为这些模型定义的语法配置非本机数据模型。提交配置时,数据模型的转换脚本会转换该数据,并将相应的 Junos OS 配置提交为检出配置中的瞬时更改。
候选配置和活动配置包含采用非本机 YANG 数据模型定义的语法的配置数据。除了检索本机 Junos OS 配置之外,您还可以使用该 juniper.device.config 模块检索标准(IETF、OpenConfig)和自定义 YANG 数据模型的配置数据。默认情况下,模块的回复不包括第三方 YANG 数据模型的配置数据。
要检索由非本机 YANG 数据模型定义的配置数据,除了检索 Junos OS 配置之外,还要执行带有该 model 参数的模块,并在适当时包含该 namespace 参数。该 model 参数采用以下值之一:
-
custom- 检索由自定义 YANG 数据模型定义的配置数据。检索自定义 YANG 数据模型的数据时,必须包含namespace该参数。 -
ietf- 检索由 IETF YANG 数据模型定义的配置数据。 -
openconfig—检索由 OpenConfig YANG 数据模型定义的配置数据。 -
True— 检索所有配置数据,包括完整的 Junos OS 配置和来自任何 YANG 数据模型的数据。
如果参数指定 model ietf or openconfig,则模块会自动使用适当的命名空间。如果指定 model: custom 检索自定义 YANG 数据模型的数据,则还必须将参数与相应的命名空间一起包含在 namespace 内。
如果将参数与model值 custom、 ietf或 openconfig ,并同时包含filter用于返回特定 XML 子树的参数,则 Junos OS 仅返回来自非本机数据模型的匹配层次结构。如果 Junos OS 配置包含同名层次结构,例如“interfaces”,则该层次结构不会包含在回复中。使用 model: True时不支持该filter选项。
使用该 juniper.device.config 模块检索非本机配置数据时,只有在同时包含 filter 该参数时,才能指定返回数据的格式。如果省略该 filter 参数,则必须指定 format: xml。
以下操作指南从已提交的配置中检索 OpenConfig interfaces 配置层次结构。如果省略该 filter 参数,RPC 将返回完整的 Junos OS 和 OpenConfig 配置。
---
- name: Retrieve OpenConfig configuration
hosts: junos
connection: local
gather_facts: no
tasks:
- name: Retrieve the OpenConfig interfaces configuration
juniper.device.config:
retrieve: committed
model: openconfig
filter: interfaces
format: xml
register: response
- name: Print result
ansible.builtin.debug:
var: response
以下任务从 l2vpn 具有给定命名空间的自定义 YANG 数据模型的已提交配置中检索配置层次结构:
tasks:
- name: Retrieve custom configuration
juniper.device.config:
retrieve: committed
model: custom
filter: l2vpn
remove_ns: False
namespace: http://yang.juniper.net/customyang/l2vpn
format: xml
register: response
以下任务将检索完整的 Junos OS 提交配置以及已添加到设备的其他 YANG 数据模型的配置数据:
tasks:
- name: Retrieve Junos OS and all third-party configuration data
juniper.device.config:
retrieve: committed
model: True
format: xml
register: response
如何指定没有等效模块参数的选项
使用该 juniper.device.config 模块检索配置时,该模块将调用 Junos XML 协议 <get-configuration> 操作。该模块支持许多 <get-configuration> 属性的显式参数,例如属性 format 。该模块还支持参数 options ,它使您能够包含没有等效模块参数的任何其他 <get-configuration> 属性。该 options 参数采用操作支持 <get-configuration> 的任何属性的键/值对字典。
有关 Junos XML 协议 <get-configuration> 操作支持的属性的完整列表,请参阅 <get-configuration>。
例如,该juniper.device.config模块从预继承配置中检索数据,其中 <groups>、 、 <apply-groups><apply-groups-except>和<interface-range>标签是配置输出中的单独元素。要从继承后配置中检索数据,可以将参数inherit: inherit包含在 options .继承后配置将继承自用户定义的组和范围的语句显示为继承语句的子项,
以下操作指南从继承后提交的配置中检索层次结构级别的 [edit system services] 配置数据。在继承后配置中,在组层次结构级别下配置的语句(如) [edit groups global system services] 将在检索到的配置数据下 [edit system services] 继承并在检索到的配置数据中返回。
---
- name: Get Junos OS configuration hierarchies
hosts: junos
connection: local
gather_facts: no
tasks:
- name: Get selected hierarchy from the post-inheritance configuration
juniper.device.config:
retrieve: committed
filter: system/services
options:
inherit: inherit
register: response
- name: Print result
ansible.builtin.debug:
var: response
如何将配置数据保存到文件中
使用该juniper.device.config模块检索配置时,可以将返回的配置数据保存在本地 Ansible 控制节点上的文件中。要将数据保存到文件中,请包括模块的或dest参数dest_dir。该dest_dir选项指定目录路径。该dest选项可以指定路径和文件名。如果已存在具有目标名称的输出文件,则模块将覆盖该文件。
要指定要保存检索到的配置的目录,请将参数设置为dest_dir目标目录的路径。每个设备的配置存储在名为 .config 的hostname单独文件中。
以下操作指南从清单组中的所有设备检索提交的配置。该操作指南会将每个设备配置保存到 Ansible 控制节点上 playbook 目录下的 configs 目录中的单独文件中。
---
- name: Get Junos OS configuration
hosts: junos
connection: local
gather_facts: no
tasks:
- name: Save configuration to a file
juniper.device.config:
retrieve: committed
dest_dir: "{{ playbook_dir }}/configs"
要指定输出文件的路径和文件名,请将参数设置为 dest 文件的绝对路径或相对路径。如果包含参数, dest 但省略目录,则文件将保存在 playbook 目录中。如果检索多个设备的配置, dest 则参数必须包含一个变量,例如 {{ inventory_hostname }} 用于区分每个设备的文件名。如果不区分文件名,每个设备的配置文件将覆盖其他设备的配置文件。
以下操作指南从 [edit system services] 清单组中所有设备上的已提交配置数据库中检索层次结构。该操作指南会将每个设备配置保存到 Ansible 控制节点上操作指南目录中的单独文件中。每个文件都由其主机名唯一标识。
---
- name: Get Junos OS configuration
hosts: junos
connection: local
gather_facts: no
tasks:
- name: Get selected configuration hierarchies and save to file
juniper.device.config:
retrieve: committed
filter: "system/services"
dest: "{{ inventory_hostname }}-system-services-config"
如果要将配置数据保存到文件中,并且不想在模块的响应中复制配置数据,则可以选择包含在return_output: false模块的参数列表中。设置为会导致return_outputfalse模块在其响应中省config略 、 和 config_lines和 键config_parsed 。如果设备返回大量配置数据,则可能需要执行此操作。
如何将活动配置与之前的配置进行比较
该 juniper.device.config 模块允许您将活动配置与之前提交的配置或回滚配置进行比较。要将活动配置与之前的配置进行比较,请添加以下模块参数:
juniper.device.config: diff: true rollback: id check: false commit: false
默认情况下,当您包含 rollback: id 参数时,模块将回滚配置,执行提交检查并提交更改。您必须包含该 commit: false 参数,以仅比较配置并阻止模块加载和提交回滚配置。包含参数可 check: false 防止不必要的提交检查操作。
该模块返回 和 diff diff_lines 键。这些密钥以 差异 或修补程序格式包含活动配置与先前配置之间的配置差异。
-
diff- 包含已命名prepared的单个键及其值的字典,该字典是包含差异的单个多行字符串。 -
diff_lines- 包含差异的单行字符串列表。
要将差异保存到本地 Ansible 控制节点上的文件中,请包含 diffs_file 参数并定义输出文件的绝对路径或相对路径。如果包含参数但 diffs_file 省略目录,则文件将保存在 playbook 目录中。如果比较多个设备上的配置,则参数 diffs_file 必须包含一个变量,例如 {{ inventory_hostname }} 用于区分每个设备的文件名。如果不区分文件名,则每个设备的输出文件将覆盖其他设备的输出文件。
以下操作指南提示输入之前提交的配置的回滚 ID。然后,操作指南会将提交的配置与指定的回滚配置进行比较,将比较保存到唯一命名的文件中,并将响应打印到标准输出。
---
- name: Compare configurations
hosts: dc1
connection: local
gather_facts: no
vars_prompt:
- name: ROLLBACK
prompt: "Rollback ID to compare with active configuration"
private: no
tasks:
- name: Compare active to previous configuration
juniper.device.config:
diff: true
rollback: "{{ ROLLBACK }}"
check: false
commit: false
diffs_file: "{{ inventory_hostname }}-diff-rollback-{{ ROLLBACK }}"
register: response
- name: Print diff
ansible.builtin.debug:
var: response
user@ansible-cn:~$ ansible-playbook configuration-compare-to-rollback.yaml
Rollback ID to compare with active configuration: 2
PLAY [Compare configurations] *************************************************
TASK [Compare active to previous configuration] ******************************
changed: [dc1a.example.net]
TASK [Print diff] ************************************************************
ok: [dc1a.example.net] => {
"response": {
"changed": true,
"diff": {
"prepared": "\n[edit system services]\n- netconf {\n- ssh;\n- }\n"
},
"diff_lines": [
"",
"[edit system services]",
"- netconf {",
"- ssh;",
"- }"
],
"failed": false,
"msg": "Configuration has been: opened, rolled back, diffed, closed."
}
}
PLAY RECAP ********************************************************************
dc1a.example.net : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
user@ansible-cn:~$ cat dc1a.example.net-diff-rollback-2
[edit system services]
- netconf {
- ssh;
- }