You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 04:25:16