Ansible配置Cisco ACL更新的技术问询:检查与规则添加
Cisco ACL更新Ansible Playbook实现方案
1. 批量检查指定ACL是否存在
用ios_command执行show access-lists获取设备上所有ACL配置,再通过Ansible的文本过滤能力提取已存在的ACL列表,和目标列表(11、13、DATA_TEST、dummy)做比对。
代码片段:
- name: 收集所有ACL配置 ios_command: commands: show access-lists register: acl_output - name: 提取已存在的ACL(含编号和命名ACL) set_fact: existing_acls: "{{ acl_output.stdout[0] | regex_findall('(Extended|Standard) IP access list (\\S+)|Standard IP access list (\\d+)') | map('flatten') | reject('equalto', '') | list }}"
2. 判断ACL是否存在(排除无输出的dummy)
通过列表交集操作,自动过滤掉不存在的ACL(比如dummy):
- name: 筛选实际存在的目标ACL set_fact: valid_acls: "{{ ['11', '13', 'DATA_TEST', 'dummy'] | intersect(existing_acls) }}" - name: 输出有效ACL列表 debug: msg: "设备上存在的目标ACL: {{ valid_acls }}"
解释:intersect会取两个列表的重叠部分,直接排除不在设备ACL列表里的项。
3. 检查待添加IP是否已在ACL中
针对每个有效ACL,用正则匹配判断目标IP规则是否已存在:
# 先定义待添加的ACL规则变量 vars: acl_rules: 11: ip: 192.168.1.0/24 action: permit 13: ip: 10.0.0.0/8 action: permit DATA_TEST: ip: 172.16.0.0/16 action: deny - name: 检查每个有效ACL的IP规则存在性 set_fact: acl_has_ip_{{ item }}: "{{ acl_output.stdout[0] | search('{{ acl_rules[item].action }}.*{{ acl_rules[item].ip }}') }}" loop: "{{ valid_acls }}"
解释:search会在ACL输出文本中匹配包含指定动作和IP的规则,返回布尔值标记是否存在。
4. 匹配ACL名称并添加对应IP规则
循环有效ACL列表,仅当目标IP未存在时执行添加操作,同时自动区分编号ACL和命名ACL的配置语法:
- name: 向ACL添加IP规则(仅当IP未存在时) ios_config: lines: "{{ acl_rules[item].action }} ip {{ acl_rules[item].ip }} any" parents: >- {% if item is search('^\\d+$') %} ip access-list standard {{ item }} {% else %} ip access-list extended {{ item }} {% endif %} when: not lookup('vars', 'acl_has_ip_' + item) | bool loop: "{{ valid_acls }}"
解释:通过正则判断ACL是数字编号还是命名类型,自动选择standard或extended配置父节点,when条件确保仅在IP未配置时执行。
完整Playbook示例
--- - name: 更新Cisco ACL配置 hosts: cisco_routers gather_facts: no vars: target_acls: ['11', '13', 'DATA_TEST', 'dummy'] acl_rules: 11: ip: 192.168.1.0/24 action: permit 13: ip: 10.0.0.0/8 action: permit DATA_TEST: ip: 172.16.0.0/16 action: deny tasks: - name: 收集所有ACL配置 ios_command: commands: show access-lists register: acl_output - name: 提取已存在的ACL列表 set_fact: existing_acls: "{{ acl_output.stdout[0] | regex_findall('(Extended|Standard) IP access list (\\S+)|Standard IP access list (\\d+)') | map('flatten') | reject('equalto', '') | list }}" - name: 筛选有效ACL(排除不存在的) set_fact: valid_acls: "{{ target_acls | intersect(existing_acls) }}" - name: 检查每个有效ACL的IP规则存在性 set_fact: acl_has_ip_{{ item }}: "{{ acl_output.stdout[0] | search('{{ acl_rules[item].action }}.*{{ acl_rules[item].ip }}') }}" loop: "{{ valid_acls }}" - name: 添加IP规则到ACL ios_config: lines: "{{ acl_rules[item].action }} ip {{ acl_rules[item].ip }} any" parents: >- {% if item is search('^\\d+$') %} ip access-list standard {{ item }} {% else %} ip access-list extended {{ item }} {% endif %} when: not lookup('vars', 'acl_has_ip_' + item) | bool loop: "{{ valid_acls }}"
内容的提问来源于stack exchange,提问作者avid
相关产品推荐
相关产品推荐

