深入探讨,使用 Ansible 网络自动化资源模块的 ACL 配置管理
2019 年 10 月,作为 Red Hat Ansible Engine 2.9 版本的一部分,Ansible 网络自动化团队引入了第一个资源模块。
这些有见地的网络模块使网络自动化对那些在生产环境中自动化各种网络平台的人来说更轻松、更一致。资源模块的目标是避免为渲染和推送网络配置创建和维护过于复杂的 jinja2 模板。
这篇博文涵盖了新发布的 ios_acls
资源模块以及如何自动化与交换机和路由器配置相关的流程。这些网络自动化模块用于配置来自流行供应商(但不限于)Arista、Cisco、Juniper 和 VyOS 的路由器和交换机。访问控制列表 (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 停止工作,并有足够的时间迁移到新的网络自动化模块。
平台支持
此模块也可用于以下 Ansible 维护的平台,这些平台在 Automation Hub(支持)和 Galaxy(社区)上都可用
入门 - 使用 Ansible 管理 ACL 配置
访问控制列表 (ACL) 提供应用于端口号和/或允许传输或到达该网络设备的 IP 地址的规则。ACL 访问控制条目 (ACE) 的顺序至关重要,因为 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 播放后,所有提供的参数都将在 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 中没有提到序列号,则它将根据播放中提供的顺序进行配置。
- 在第二次运行中,相应的 Merge Play 再次运行,Ansible 的幂等性发挥作用,如果没有任何改变,播放运行结果为 changed=False,这向用户确认播放中提供的配置已在 IOS 设备上配置。
使用 state replaced - 推送配置更改
replaced 参数对每个配置的 ACL/ACE 对网络设备上的数据模型进行强制。如果我们修改任何 ACL/ACE,它将强制执行此资源模块意识到的所有参数。换句话说,replaced 参数了解应该存在和不应该存在的命令。
对于这种情况,Cisco IOS 设备上已经配置了一个带有某些 ACE 的 ACL,现在用户想要用一组新的 ACE 更新 ACL,并丢弃所有已经配置的 ACL ACE。将 "s" 替换的资源模块将用用户作为输入提供的一组新的 ACE 替换 ACL 现有的 ACE。
参考 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 }}"
通过以上播放,用户用提供的 ACL ACE 配置替换了 123 扩展 ACL,并配置了 150 扩展新 ACL ACE。
在运行 replaced
播放之前,网络设备配置
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 Play 运行,触发的命令
- 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 播放之后,网络设备配置
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,然后应用播放中作为输入提供的配置。在上面的命令输出中,对于编号为 123 的 ACL,可以在序列 10 和 20 处的预先存在的 ACE 在应用较新 ACE 配置的更改之前被首先否定,可以看出相同行为。
- 对于 150 扩展 ACL ACE,由于它尚未在设备上预先配置,因此模块会继续应用播放中作为输入提供的 ACE 配置。这里要注意的一点是,在播放输入配置值中,序列值被指定为 20,因此 ACE 被配置为序列 20 而不是 10,如果用户没有提供序列值,则情况会是 10。
通过以上播放的第二次运行,changed 变为 false,这满足了 Ansible 的幂等性。
使用 state overridden - 推送配置更改
在这个例子中,我们将稍微改变一下。假设你是一位用户,正在网络设备上进行定制配置(进行自动化之外的更改)。state: overridden
将循环回到强制执行数据模型(配置策略强制执行)并删除定制更改。
如果用户希望完全重新配置 Cisco IOS 设备预先配置的 ACL,那么资源模块覆盖状态是最合适的。使用覆盖状态时,用户可以使用用户提供的 ACL 覆盖所有 ACL。
为了显示替换和覆盖状态工作之间的区别,我们将使用与替换场景相同的剧本,并保持预先存在的配置相同。
参考 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 }}"
通过以上播放,用户用提供的 ACL ACE 配置替换了 123 扩展 ACL,并配置了 150 扩展新 ACL ACE。
在运行 Overridden
剧本之前,网络设备配置
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
剧本运行,发送的命令
- 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
剧本后,网络设备配置
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
现在,如果我们再次深入研究覆盖剧本的输出
- 覆盖会否定所有预先存在的 ACL 并删除那些在提供的配置中不存在的配置。
- 对于预先存在且也在剧本中的 ACL 配置,ios_acls 覆盖状态将尝试删除/否定所有预先存在的 ACE,然后配置剧本中提到的新 ACE。
- 对于任何不存在的 ACL,覆盖状态将以与合并相同的方式配置 ACL。
现在我们已经讨论了如何使用 ios_acls 资源模块的合并、替换和覆盖状态来配置 CISCO IOS 设备上的 ACL 和 ACE,现在是时候讨论如何删除预先配置的 ACL 和 ACE 以及用户在删除操作状态下可以使用哪些粒度级别了。
删除配置更改
如果用户希望使用提供的 ACL 配置删除 Cisco IOS 设备的预先配置的 ACL,则使用资源模块删除状态。
方法 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
剧本之前,网络设备配置
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
剧本运行,发送的命令
- 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
剧本后,网络设备配置
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:删除单个 ACL **基于其 AFI(即地址族指示器)**,这意味着如果用户需要删除在 IPV4 或 IPV6 下配置的所有 ACL
参考 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 剧本之前,网络设备配置
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 剧本运行,触发的命令
- 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
剧本后,网络设备配置
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 剧本之前,网络设备配置
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 剧本运行,触发的命令
- 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
剧本后,网络设备配置
cisco#sh access-lists
cisco#
使用状态渲染 - 开发和离线工作
状态渲染将提供的结构化数据模型转换为平台特定的 CLI 命令。此状态不需要连接到最终设备。在本例中,它将提供的 data model 转换为 Cisco IOS 语法命令。
参考 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)。如果您有离线配置,例如备份文本文件,并且希望将其转换为结构化数据,这将很有帮助。这对于实验、故障排除或离线创建数据模型的真相来源很有帮助。
参考 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 命令。