我们希望听到您的意见!帮助我们深入了解 Ansible 生态系统的现状。
参与 Ansible 项目 2024 年调查

深入探讨:使用 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.eosjunipernetworks.junosvyos.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_aclsios_aclsjunos_aclsnxos_aclsiosxr_acls。较旧的单数形式模块(例如 ios_aclnxos_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_varshost_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 命令。