深入探讨:使用 Ansible 网络自动化资源模块管理 ACL 配置
深入探讨:使用 Ansible 网络自动化资源模块管理 ACL 配置
2019 年 10 月,作为 Red Hat Ansible Engine 2.9 版本的一部分,Ansible 网络自动化团队引入了首批资源模块。
这些有主见的网络模块使网络自动化对于在生产环境中自动化各种网络平台的用户来说更加轻松和一致。资源模块的目标是避免创建和维护过于复杂的 jinja2 模板来渲染和推送网络配置。
这篇博文介绍了新发布的 ios_acls
资源模块以及如何自动化与交换机和路由器配置相关的流程。这些网络自动化模块用于配置来自流行供应商(但不限于)Arista、Cisco、Juniper 和 VyOS 的路由器和交换机。访问控制列表 (ACL) 网络资源模块能够从网络读取 ACL 配置,提供修改 ACL 配置的能力,然后将更改推送到网络设备。这些有主见的网络资源模块使网络自动化对于在生产环境中自动化各种网络平台的用户来说更加轻松和一致。我将逐步介绍几个示例,并描述每个状态参数(包括三种新发布的状态类型)的用例以及如何在现实场景中使用它们。
认证内容集合
此博文使用 Ansible 团队维护的 cisco.ios
集合,但其他平台也具有 ACL 资源模块,例如 arista.eos
、junipernetworks.junos
和 vyos.vyos
。
如何获取认证(受支持)和上游(社区)集合
上游社区集合可在 Ansible Galaxy 上找到:https://galaxy.ansible.com/cisco/ios**
下游受支持的集合可在 Automation Hub 上找到:https://cloud.redhat.com/ansible/automation-hub/cisco/ios**
有关 Ansible 内容集合的更多信息,请参阅以下文档
https://docs.ansible.org.cn/ansible/latest/user_guide/collections_using.html
在开始之前,让我们快速解释一下网络资源模块命名背后的原理。新添加的 ACL 模块将使用复数形式 eos_acls
、ios_acls
、junos_acls
、nxos_acls
、iosxr_acls
。较旧的单数形式模块(例如 ios_acl
、nxos_acl
)将逐渐弃用。进行此命名更改是为了确保使用现有网络模块的用户不会导致其 Ansible playbook 停止工作,并有足够的时间迁移到新的网络自动化模块。
平台支持
此模块也适用于 Automation Hub(受支持)和 Galaxy(社区)上的以下 Ansible 维护平台
平台 | 完整集合路径 | Automation Hub 链接(需要订阅) | Ansible Galaxy 链接 |
---|---|---|---|
Arista EOS |
arista.eos.eos_acls |
Automation Hub | Galaxy |
Cisco IOS |
cisco.ios.ios_acls |
Automation Hub | Galaxy |
Cisco IOS-XR |
cisco.iosxr.iosxr_acls |
Automation Hub | Galaxy |
Cisco NX-OS |
cisco.nxos.nxos_acls |
Automation Hub | Galaxy |
Juniper Junos |
junipernetworks.junos.junos_acls |
Automation Hub | Galaxy |
VyOS |
vyos.vyos.vyos_firewall_rules |
Automation Hub | Galaxy |
入门 - 使用 Ansible 管理 ACL 配置
访问控制列表 (ACL) 提供应用于端口号和/或允许通过或到达该网络设备的 IP 地址的规则。访问控制条目 (ACE) 的 ACL 顺序至关重要,因为 ACE 序列/顺序路由决定了哪些规则应用于入站/出站网络流量。
ACL 资源模块提供了用户在 Cisco IOS 设备上手动配置时可以实现的相同级别的功能。但是,结合 Ansible 事实收集和资源模块方法,这更符合网络专业人员日常工作的方式。
我将使用版本为 15.6(3)M2 的 IOS 路由器来进行本文的所有配置。以下是路由器 ACL 配置的初始状态,并且当前设备上已配置了一些活动的 ACL。
网络设备配置
cisco#sh access-lists Extended IP access list 110 10 deny icmp 192.0.2.0 0.0.0.255 192.0.3.0 0.0.0.255 traceroute dscp ef ttl eq 10 20 deny tcp host 198.51.100.0 host 198.51.110.0 eq telnet ack Extended IP access list test_acl 10 deny tcp 192.0.2.0 0.0.0.255 192.0.3.0 0.0.0.255 eq www fin option traceroute ttl eq 10 IPv6 access list R1_TRAFFIC deny tcp any eq www any eq telnet ack dscp af11 sequence 10
使用收集的状态 - 构建 Ansible 清单
资源模块允许用户读取现有网络配置并将其转换为结构化数据模型。**state: gathered** 等效于为此特定资源收集 Ansible 事实。此示例将读取现有网络配置并将其存储为平面文件。
Ansible playbook 示例
这是一个使用 **state: gathered** 并将结果作为 YAML 存储到 host_vars 中的 Ansible playbook 示例。如果您不熟悉 Ansible 清单的概念,并且想要了解有关 group_vars
和 host_vars
的更多信息,请参阅Ansible 用户指南:清单。
--- - name: convert configured ACLs to structured data hosts: cisco gather_facts: false tasks: - name: Use the ACLs resource module to gather the current config cisco.ios.ios_acls: state: gathered register: acls - name: Create inventory directory file: path: "{{ inventory_dir }}/host_vars/{{ inventory_hostname }}" state: directory - name: Write the ACL configuration to a file copy: content: "{{ {‘acls’: acls['gathered']} | to_nice_yaml }}" dest: "{{ inventory_dir }}/host_vars/{{ inventory_hostname }}/acls.yaml"
使用 ansible-playbook 命令执行 Ansible playbook:ansible-playbook example.yml
检查文件内容
这是从读取现有配置创建的数据结构
# lab_inventory/host_vars/rtr2/acls.yaml acls: - acls: - aces: - destination: address: 192.0.3.0 wildcard_bits: 0.0.0.255 dscp: ef grant: deny protocol: icmp protocol_options: icmp: traceroute: true sequence: 10 source: address: 192.0.2.0 wildcard_bits: 0.0.0.255 ttl: eq: 10 - destination: host: 198.51.110.0 port_protocol: eq: telnet grant: deny protocol: tcp protocol_options: tcp: ack: true sequence: 20 source: host: 198.51.100.0 acl_type: extended name: '110' - aces: - destination: address: 192.0.3.0 port_protocol: eq: www wildcard_bits: 0.0.0.255 grant: deny option: traceroute: true protocol: tcp protocol_options: tcp: fin: true sequence: 10 source: address: 192.0.2.0 wildcard_bits: 0.0.0.255 ttl: eq: 10 acl_type: extended name: test_acl afi: ipv4 - acls: - aces: - destination: any: true port_protocol: eq: telnet dscp: af11 grant: deny protocol: tcp protocol_options: tcp: ack: true sequence: 10 source: any: true port_protocol: eq: www name: R1_TRAFFIC afi: ipv6
在以上输出(以及将来的参考)中
-
afi
指的是地址族标识符,可以是 IPv4 或 IPv6 -
acls
指的是访问控制列表,并返回字典列表(ACE) -
aces
指的是访问控制条目,或特定的规则和序列
使用 state merged - 推送配置更改
state merged 将获取您的 Ansible 配置数据(例如 Ansible 变量)并将其合并到网络设备的网络配置中。这不会影响 Ansible 配置数据中未指定的现有配置。让我们逐步介绍一个示例。
修改存储的文件
我们将修改第一个示例中创建的平面文件。然后,我们将创建一个 Ansible playbook 以将此新配置合并到网络设备的运行配置中。
参考链接
https://gist.githubusercontent.com/justjais/bb2a65c373ab4e64d1eeb47bc425c613/raw/056d2a6a44910863cbbbf38cad2273435574db84/Merged.txt
acls: - afi: ipv4 acls: - name: std_acl acl_type: standard aces: - grant: deny source: address: 192.168.1.200 - grant: deny source: address: 192.168.2.0 wildcard_bits: 0.0.0.255 - name: 110 aces: - grant: deny sequence: 10 protocol_options: icmp: traceroute: true source: address: 192.0.2.0 wildcard_bits: 0.0.0.255 destination: address: 192.0.3.0 wildcard_bits: 0.0.0.255 dscp: ef ttl: eq: 10 - grant: deny protocol_options: tcp: ack: true source: host: 198.51.100.0 destination: host: 198.51.110.0 port_protocol: eq: telnet - name: test acl_type: extended aces: - grant: deny protocol_options: tcp: fin: true source: address: 192.0.2.0 wildcard_bits: 0.0.0.255 destination: address: 192.0.3.0 wildcard_bits: 0.0.0.255 port_protocol: eq: www option: traceroute: true ttl: eq: 10 - name: 123 aces: - grant: deny protocol_options: tcp: ack: true source: address: 198.51.100.0 wildcard_bits: 0.0.0.255 destination: address: 198.51.101.0 wildcard_bits: 0.0.0.255 port_protocol: eq: telnet tos: service_value: 12 - grant: deny protocol_options: tcp: ack: true source: address: 192.0.3.0 wildcard_bits: 0.0.0.255 destination: address: 192.0.4.0 wildcard_bits: 0.0.0.255 port_protocol: eq: www dscp: ef ttl: lt: 20 - afi: ipv6 acls: - name: R1_TRAFFIC aces: - grant: deny protocol_options: tcp: ack: true source: any: true port_protocol: eq: www destination: any: true port_protocol: eq: telnet dscp: af11
Ansible playbook 示例
--- - name: Merged state play hosts: cisco gather_facts: false tasks: - name: Merge ACLs config with device existing ACLs config cisco.ios.ios_acls: state: merged config: "{{ acls }}"
运行相应的 Merge playbook 后,所有提供的参数都将在 Cisco IOS 路由器上使用 Ansible **changed=True** 进行配置
网络设备配置
cisco#sh access-lists Standard IP access list std_acl 10 deny 192.168.1.200 20 deny 192.168.2.0, wildcard bits 0.0.0.255 Extended IP access list 110 10 deny icmp 192.0.2.0 0.0.0.255 192.0.3.0 0.0.0.255 traceroute dscp ef ttl eq 10 20 deny tcp host 198.51.100.0 host 198.51.110.0 eq telnet ack Extended IP access list 123 10 deny tcp 198.51.100.0 0.0.0.255 198.51.101.0 0.0.0.255 eq telnet ack tos 12 20 deny tcp 192.0.3.0 0.0.0.255 192.0.4.0 0.0.0.255 eq www ack dscp ef ttl lt 20 Extended IP access list test 10 deny tcp 192.0.2.0 0.0.0.255 192.0.3.0 0.0.0.255 eq www fin option traceroute ttl eq 10 IPv6 access list R1_TRAFFIC deny tcp any eq www any eq telnet ack dscp af11 sequence 10
如果我们深入研究设备输出,我们会做出以下观察
- 根据 AFI 值,模块决定调用 IP/IPV6 访问列表。
- “acl_type”键对于命名 ACL 是必需的。
- 对于由数字而不是名称标识的 ACL,“acl_type”是从平台的已记录 ACL 数字范围派生的。(例如,标准 = 1--99 和 1300--1999,扩展 = 100--199 和 2000--2699 等)
- 如果 ACE 中未提及序列号,它将根据 playbook 中提供的顺序进行配置。
- 第二次运行时,相应的 Merge Playbook 再次运行,并且 Ansible 的幂等性特性发挥作用,如果没有任何更改,playbook 运行结果将为 changed=False,这向用户确认 playbook 中提供的所有配置已在 IOS 设备上配置。
使用 state replaced - 推送配置更改
replaced 参数在每个配置的 ACL/ACE 上对网络设备强制执行数据模型。如果我们修改任何 ACL/ACE,它将强制执行此资源模块知道的所有参数。换句话说,replaced 参数知道哪些命令应该存在,哪些命令不应该存在。
对于这种情况,ACL 以及一些 ACE 已在 Cisco IOS 设备上配置,现在用户希望使用一组新的 ACE 更新 ACL 并丢弃所有已配置的 ACL ACE。replaced 状态的资源模块将用用户作为输入提供的新 ACE 集替换 ACL 现有的 ACE。
Ref gist 链接
https://gist.githubusercontent.com/justjais/bb2a65c373ab4e64d1eeb47bc425c613/raw/056d2a6a44910863cbbbf38cad2273435574db84/Replaced.txt
acls: - afi: ipv4 acls: - name: 110 aces: - grant: deny protocol_options: tcp: syn: true source: address: 192.0.2.0 wildcard_bits: 0.0.0.255 destination: address: 192.0.3.0 wildcard_bits: 0.0.0.255 port_protocol: eq: www dscp: ef ttl: eq: 10 - name: 150 aces: - grant: deny sequence: 20 protocol_options: tcp: syn: true source: address: 198.51.100.0 wildcard_bits: 0.0.0.255 port_protocol: eq: telnet destination: address: 198.51.110.0 wildcard_bits: 0.0.0.255 port_protocol: eq: telnet dscp: ef ttl: eq: 10
Ansible playbook 示例
--- - name: Replaced state play hosts: cisco gather_facts: false tasks: - name: Replace ACLs config with device existing ACLs config cisco.ios.ios_acls: state: replaced config: "{{ acls }}"
使用上述 playbook,用户将使用提供的 ACL ACE 配置替换 123 扩展 ACL,并配置 150 扩展的新 ACL ACE。
运行 replaced
playbook 之前的网络设备配置
cisco#sh access-lists Standard IP access list std_acl 10 deny 192.168.1.200 20 deny 192.168.2.0, wildcard bits 0.0.0.255 Extended IP access list 110 10 deny icmp 192.0.2.0 0.0.0.255 192.0.3.0 0.0.0.255 traceroute dscp ef ttl eq 10 20 deny tcp host 198.51.100.0 host 198.51.110.0 eq telnet ack Extended IP access list 123 10 deny tcp 198.51.100.0 0.0.0.255 198.51.101.0 0.0.0.255 eq telnet ack tos 12 20 deny tcp 192.0.3.0 0.0.0.255 192.0.4.0 0.0.0.255 eq www ack dscp ef ttl lt 20 Extended IP access list test 10 deny tcp 192.0.2.0 0.0.0.255 192.0.3.0 0.0.0.255 eq www fin option traceroute ttl eq 10 IPv6 access list R1_TRAFFIC deny tcp any eq www any eq telnet ack dscp af11 sequence 10
运行 replaced
playbook 时触发的命令
- ip access-list extended 110 - no 10 - no 20 - deny tcp 192.0.2.0 0.0.0.255 192.0.3.0 0.0.0.255 eq www syn dscp ef ttl eq 10 - ip access-list extended 150 - 20 deny tcp 198.51.100.0 0.0.0.255 eq telnet 198.51.110.0 0.0.0.255 eq telnet syn dscp ef ttl eq 10
运行 replaced
playbook 之后的网络设备配置
cisco#sh access-lists Standard IP access list std_acl 10 deny 192.168.1.200 20 deny 192.168.2.0, wildcard bits 0.0.0.255 Extended IP access list 110 10 deny tcp 192.0.2.0 0.0.0.255 192.0.3.0 0.0.0.255 eq www syn dscp ef ttl eq 10 Extended IP access list 123 10 deny tcp 198.51.100.0 0.0.0.255 198.51.101.0 0.0.0.255 eq telnet ack tos 12 20 deny tcp 192.0.3.0 0.0.0.255 192.0.4.0 0.0.0.255 eq www ack dscp ef ttl lt 20 Extended IP access list 150 20 deny tcp 198.51.100.0 0.0.0.255 eq telnet 198.51.110.0 0.0.0.255 eq telnet syn dscp ef ttl eq 10 Extended IP access list test 10 deny tcp 192.0.2.0 0.0.0.255 192.0.3.0 0.0.0.255 eq www fin option traceroute ttl eq 10 IPv6 access list R1_TRAFFIC deny tcp any eq www any eq telnet ack dscp af11 sequence 10
如果我们简要地分析输出,可能会观察到以下内容
-
replaced
将否定输入 ACL 下所有预先存在的 ACE,然后应用 playbook 中提供的配置。在上面针对编号 ACL 123 的命令输出中可以看到相同的行为,其中在应用更新的 ACE 配置之前,首先否定了序列 10 和 20 处的预先存在的 ACE。 - 对于 150 扩展 ACL ACE,由于它之前未在设备上预先配置,因此模块会继续应用 playbook 中提供的 ACE 配置。需要注意的是,在 playbook 输入配置中,序列的值被设置为 20,因此 ACE 在序列 20 上配置,而不是如果用户未提供序列值则可能出现的序列 10。
第二次运行上述 playbook 时,changed 将变为 false,这满足了 Ansible 的幂等性。
使用 state overridden - 推送配置更改
在此示例中,我们将稍微进行一些修改。假设您是用户,正在网络设备上进行定制配置(在自动化之外进行更改)。state: overridden
将循环返回以强制执行数据模型(配置策略强制执行)并删除定制更改。
如果用户希望完全重新配置 Cisco IOS 设备的预配置 ACL,则 overridden 状态的资源模块是最合适的。使用 overridden 状态时,用户可以使用用户提供的 ACL 覆盖所有 ACL。
为了显示 replaced 和 overridden 状态工作之间的差异,我们将使用与 replaced 场景中相同的 playbook,并保持预先存在的配置相同。
Ref gist 链接
https://gist.githubusercontent.com/justjais/bb2a65c373ab4e64d1eeb47bc425c613/raw/056d2a6a44910863cbbbf38cad2273435574db84/Overridden.txt
ACL 配置
acls: - afi: ipv4 acls: - name: 110 aces: - grant: deny sequence: 20 protocol_options: tcp: ack: true source: address: 198.51.100.0 wildcard_bits: 0.0.0.255 port_protocol: eq: telnet destination: address: 198.51.110.0 wildcard_bits: 0.0.0.255 port_protocol: eq: www dscp: ef ttl: eq: 10 - name: 150 aces: - grant: deny sequence: 10 protocol_options: tcp: syn: true source: address: 198.51.100.0 wildcard_bits: 0.0.0.255 port_protocol: eq: telnet destination: address: 198.51.110.0 wildcard_bits: 0.0.0.255 port_protocol: eq: telnet dscp: ef ttl: eq: 10
Ansible playbook 示例
--- - name: Overridden state play hosts: cisco gather_facts: false tasks: - name: Override ACLs config with device existing ACLs config cisco.ios.ios_acls: state: overridden config: "{{ acls }}"
使用上述 playbook,用户将使用提供的 ACL ACE 配置替换 123 扩展 ACL,并配置 150 扩展的新 ACL ACE。
运行 Overridden
playbook 之前的网络设备配置
cisco#sh access-lists Standard IP access list std_acl 10 deny 192.168.1.200 20 deny 192.168.2.0, wildcard bits 0.0.0.255 Extended IP access list 110 10 deny icmp 192.0.2.0 0.0.0.255 192.0.3.0 0.0.0.255 traceroute dscp ef ttl eq 10 20 deny tcp host 198.51.100.0 host 198.51.110.0 eq telnet ack Extended IP access list 123 10 deny tcp 198.51.100.0 0.0.0.255 198.51.101.0 0.0.0.255 eq telnet ack tos 12 20 deny tcp 192.0.3.0 0.0.0.255 192.0.4.0 0.0.0.255 eq www ack dscp ef ttl lt 20 Extended IP access list test 10 deny tcp 192.0.2.0 0.0.0.255 192.0.3.0 0.0.0.255 eq www fin option traceroute ttl eq 10 IPv6 access list R1_TRAFFIC deny tcp any eq www any eq telnet ack dscp af11 sequence 10
运行 Overridden
playbook 时发送的命令
- no ip access-list standard std_acl - no ip access-list extended 110 - no ip access-list extended 123 - no ip access-list extended 150 - no ip access-list extended test - no ipv6 access-list R1_TRAFFIC - ip access-list extended 150 - 10 deny tcp 198.51.100.0 0.0.0.255 eq telnet 198.51.110.0 0.0.0.255 eq telnet syn dscp ef ttl eq 10 - ip access-list extended 110 - 20 deny tcp 198.51.100.0 0.0.0.255 eq telnet 198.51.110.0 0.0.0.255 eq www ack dscp ef ttl eq 10
运行 Overridden
playbook 之后的网络设备配置
cisco#sh access-lists Extended IP access list 110 20 deny tcp 198.51.100.0 0.0.0.255 eq telnet 198.51.110.0 0.0.0.255 eq www ack dscp ef ttl eq 10 Extended IP access list 150 10 deny tcp 198.51.100.0 0.0.0.255 eq telnet 198.51.110.0 0.0.0.255 eq telnet syn dscp ef ttl eq 10
现在,如果我们再次深入分析 overridden playbook 的输出
- Overridden 会否定所有预先存在的 ACL 并删除提供的配置中不存在的那些配置。
- 对于预先存在且也在 playbook 中的 ACL 配置,ios_acls overridden 状态将尝试删除/否定所有预先存在的 ACE,然后配置 playbook 中提到的新 ACE
- 对于任何不存在的 ACL,overridden 状态将以与 merged 相同的方式配置 ACL
既然我们已经讨论了如何使用 ios_acls 资源模块的合并、替换和覆盖状态来配置 CISCO IOS 设备上的 ACL 和 ACE,那么现在是时候讨论如何删除预配置的 ACL 和 ACE,以及用户可以使用删除操作状态获得的粒度级别。
删除配置更改
如果用户想要使用提供的 ACL 配置删除 Cisco IOS 设备预配置的 ACL,则使用资源模块的 delete 状态。
方法 1:根据**ACL 编号**删除单个 ACL(这意味着如果用户需要删除在 IPV4 或 IPV6 下配置的任何特定 ACL)
参考 gist 链接:
https://gist.githubusercontent.com/justjais/bb2a65c373ab4e64d1eeb47bc425c613/raw/056d2a6a44910863cbbbf38cad2273435574db84/Deleted.txt
需要删除的 ACL
acls: - afi: ipv4 acls: - name: test acl_type: extended - name: 110 - name: 123 - afi: ipv6 acls: - name: R1_TRAFFIC
Ansible playbook 示例
--- - name: Deleted state play hosts: cisco gather_facts: false tasks: - name: Delete ACLs based on ACL number cisco.ios.ios_acls: state: deleted config: "{{ acls }}"
运行Deleted
playbook 之前的网络设备配置
cisco#sh access-lists Standard IP access list std_acl 10 deny 192.168.1.200 20 deny 192.168.2.0, wildcard bits 0.0.0.255 Extended IP access list 110 10 deny icmp 192.0.2.0 0.0.0.255 192.0.3.0 0.0.0.255 traceroute dscp ef ttl eq 10 20 deny tcp host 198.51.100.0 host 198.51.110.0 eq telnet ack Extended IP access list 123 10 deny tcp 198.51.100.0 0.0.0.255 198.51.101.0 0.0.0.255 eq telnet ack tos 12 20 deny tcp 192.0.3.0 0.0.0.255 192.0.4.0 0.0.0.255 eq www ack dscp ef ttl lt 20 Extended IP access list test 10 deny tcp 192.0.2.0 0.0.0.255 192.0.3.0 0.0.0.255 eq www fin option traceroute ttl eq 10 IPv6 access list R1_TRAFFIC deny tcp any eq www any eq telnet ack dscp af11 sequence 10
使用Delete by ACLs
playbook 运行时发送的命令
- no ip access-list extended test - no ip access-list extended 110 - no ip access-list extended 123 - no ipv6 access-list R1_TRAFFIC
运行Deleted
playbook 之后的网络设备配置
cisco#sh access-lists Standard IP access list std_acl 10 deny 192.168.1.200 20 deny 192.168.2.0, wildcard bits 0.0.0.255 cisco#
方法 2:根据**其 AFI(即地址族指示符)**删除单个 ACL,这意味着如果用户需要删除在 IPV4 或 IPV6 下配置的所有 ACL
Ref gist 链接
https://gist.githubusercontent.com/justjais/bb2a65c373ab4e64d1eeb47bc425c613/raw/8c65946eae561ff569cfc5398879c51598ae050c/Deleted_by_AFI
Ansible playbook 示例
--- - name: Deleted state play hosts: cisco gather_facts: false tasks: - name: Delete ALL IPV4 configured ACLs cisco.ios.ios_acls: config: - afi: ipv4 state: deleted
运行 Deleted playbook 之前的网络设备配置
cisco#sh access-lists Standard IP access list std_acl 10 deny 192.168.1.200 20 deny 192.168.2.0, wildcard bits 0.0.0.255 Extended IP access list 110 10 deny icmp 192.0.2.0 0.0.0.255 192.0.3.0 0.0.0.255 traceroute dscp ef ttl eq 10 20 deny tcp host 198.51.100.0 host 198.51.110.0 eq telnet ack Extended IP access list 123 10 deny tcp 198.51.100.0 0.0.0.255 198.51.101.0 0.0.0.255 eq telnet ack tos 12 20 deny tcp 192.0.3.0 0.0.0.255 192.0.4.0 0.0.0.255 eq www ack dscp ef ttl lt 20 Extended IP access list test 10 deny tcp 192.0.2.0 0.0.0.255 192.0.3.0 0.0.0.255 eq www fin option traceroute ttl eq 10 IPv6 access list R1_TRAFFIC deny tcp any eq www any eq telnet ack dscp af11 sequence 10
使用 Delete by ACLs Playbook 运行时触发的命令
- no ip access-list standard std_acl - no ip access-list extended test - no ip access-list extended 110 - no ip access-list extended 123 - no ip access-list extended test
运行Deleted
playbook 之后的网络设备配置
cisco#sh access-lists IPv6 access list R1_TRAFFIC deny tcp any eq www any eq telnet ack dscp af11 sequence 10 cisco#
方法 3:一次删除所有 ACL
注意:这是一个非常关键的删除操作,如果使用不当,它有删除所有预配置 ACL 的能力。
参考 gist 链接:https://gist.githubusercontent.com/justjais/bb2a65c373ab4e64d1eeb47bc425c613/raw/056d2a6a44910863cbbbf38cad2273435574db84/Deleted_wo_config.txt
Ansible playbook 示例
--- - name: Deleted state play hosts: cisco gather_facts: false tasks: - name: Delete ALL configured ACLs w/o passing any config cisco.ios.ios_acls: state: deleted
运行 Deleted playbook 之前的网络设备配置
cisco#sh access-lists Standard IP access list std_acl 10 deny 192.168.1.200 20 deny 192.168.2.0, wildcard bits 0.0.0.255 Extended IP access list 110 10 deny icmp 192.0.2.0 0.0.0.255 192.0.3.0 0.0.0.255 traceroute dscp ef ttl eq 10 20 deny tcp host 198.51.100.0 host 198.51.110.0 eq telnet ack Extended IP access list 123 10 deny tcp 198.51.100.0 0.0.0.255 198.51.101.0 0.0.0.255 eq telnet ack tos 12 20 deny tcp 192.0.3.0 0.0.0.255 192.0.4.0 0.0.0.255 eq www ack dscp ef ttl lt 20 Extended IP access list test 10 deny tcp 192.0.2.0 0.0.0.255 192.0.3.0 0.0.0.255 eq www fin option traceroute ttl eq 10 IPv6 access list R1_TRAFFIC deny tcp any eq www any eq telnet ack dscp af11 sequence 10
使用 Delete by ACLs Playbook 运行时触发的命令
- no ip access-list standard std_acl - no ip access-list extended test - no ip access-list extended 110 - no ip access-list extended 123 - no ip access-list extended test - no ipv6 access-list R1_TRAFFIC
运行 Overridden
playbook 之后的网络设备配置
cisco#sh access-lists
cisco#
使用状态渲染 - 开发和离线工作
状态渲染将提供的结构化数据模型转换为特定于平台的 CLI 命令。此状态不需要连接到终端设备。对于此示例,它将提供的数据模型渲染成 Cisco IOS 语法命令。
Ref gist 链接
https://gist.githubusercontent.com/justjais/bb2a65c373ab4e64d1eeb47bc425c613/raw/8c65946eae561ff569cfc5398879c51598ae050c/Rendered.txt
需要渲染的 ACL 配置
acls: - afi: ipv4 acls: - name: 110 aces: - grant: deny sequence: 10 protocol_options: tcp: syn: true source: address: 192.0.2.0 wildcard_bits: 0.0.0.255 destination: address: 192.0.3.0 wildcard_bits: 0.0.0.255 port_protocol: eq: www dscp: ef ttl: eq: 10 - name: 150 aces: - grant: deny protocol_options: tcp: syn: true source: address: 198.51.100.0 wildcard_bits: 0.0.0.255 port_protocol: eq: telnet destination: address: 198.51.110.0 wildcard_bits: 0.0.0.255 port_protocol: eq: telnet dscp: ef ttl: eq: 10
Ansible playbook 示例
--- - name: Rendered state play hosts: cisco gather_facts: false tasks: - name: Render the provided configuration cisco.ios.ios_acls: config: "{{ acls }}" state: rendered
使用 Render 状态模块执行结果
"rendered": [ "ip access-list extended 110", "10 deny tcp 192.0.2.0 0.0.0.255 192.0.3.0 0.0.0.255 eq www syn dscp ef ttl eq 10", "ip access-list extended 150", "deny tcp 198.51.100.0 0.0.0.255 eq telnet 198.51.110.0 0.0.0.255 eq telnet syn dscp ef ttl eq 10" ]
注意:Render 状态不会更改配置端的内容
使用状态解析 - 开发和离线工作
此状态从 running_config 选项读取配置并将其转换为结构化数据(即 JSON)。如果您有离线配置,例如备份文本文件,并且希望将其转换为结构化数据,这将非常有用。这对于实验、故障排除或离线创建数据模型的事实来源很有帮助。
Ref gist 链接
https://gist.githubusercontent.com/justjais/bb2a65c373ab4e64d1eeb47bc425c613/raw/8c65946eae561ff569cfc5398879c51598ae050c/Parsed.txt
需要解析的 ACL 配置
Ansible playbook 示例
--- - name: Parsed state play hosts: cisco gather_facts: false tasks: - name: Parse the provided ACLs configuration cisco.ios.ios_acls: running_config: "ipv6 access-list R1_TRAFFIC deny tcp any eq www any eq telnet ack dscp af11" state: parsed
使用 Parsed 状态模块执行结果
"parsed": [ { "acls": [ { "aces": [ { "destination": { "any": true, "port_protocol": { "eq": "telnet" } }, "dscp": "af11", "grant": "deny", "protocol_options": { "tcp": { "ack": true } }, "source": { "any": true, "port_protocol": { "eq": "www" } } } ], "name": "R1_TRAFFIC" } ], "afi": "ipv6" } ]
结论
ACL 资源模块为网络工程师提供了一种简单的方法,可以开始在多个网络平台上自动化访问列表。虽然某些配置可以在网络设备上保持静态,但 ACL 可能需要不断更新和验证。这些资源模块允许用户采用增量步骤进行自动化,从而使组织能够轻松地采用自动化。一旦您将 ACL 转换为结构化数据,任何网络平台的任何资源模块都可以读取。想象一下读取 Cisco IOS 设备的 ACL 并将其转换为 Cisco IOS-XR 命令。