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

如何在Ansible中遍历复杂列表配置firewalld区域

Ansible Firewalld 区域配置解决方案

使用原始的列表格式fw_zones变量即可完成配置,无需转为字典结构。借助Ansible的with_subelements插件可以轻松遍历每个区域下的子列表(allowed_services和icmp_blocks),全程用firewalld模块实现所有配置,不需要额外依赖command模块。


变量定义(保持原始列表结构)

fw_zones:
  - name: "example"
    target: "DROP"
    allowed_services:
      - ssh
    icmp_block_inversion: true
    icmp_blocks:
      - fragmentation-needed
  - name: "another_example"
    target: "DROP"
    allowed_services:
      - ssh
      - http
      - ntp
    icmp_block_inversion: true
    icmp_blocks:
      - fragmentation-needed
      - echo-request

完整Playbook任务

- name: Configure firewalld zones
  hosts: your_target_hosts
  become: true
  vars:
    fw_zones:
      - name: "example"
        target: "DROP"
        allowed_services:
          - ssh
        icmp_block_inversion: true
        icmp_blocks:
          - fragmentation-needed
      - name: "another_example"
        target: "DROP"
        allowed_services:
          - ssh
          - http
          - ntp
        icmp_block_inversion: true
        icmp_blocks:
          - fragmentation-needed
          - echo-request

  tasks:
    # 1. 创建/更新区域基础配置:设置默认目标、启用ICMP阻断反转
    - name: Setup firewalld zone base settings
      ansible.posix.firewalld:
        zone: "{{ item.name }}"
        state: present
        permanent: true
        immediate: true
        target: "{{ item.target }}"
        icmp_block_inversion: "{{ item.icmp_block_inversion }}"
      loop: "{{ fw_zones }}"

    # 2. 遍历允许的服务,批量添加到对应区域
    - name: Allow specified services in zones
      ansible.posix.firewalld:
        zone: "{{ item.0.name }}"
        service: "{{ item.1 }}"
        state: enabled
        permanent: true
        immediate: true
      with_subelements:
        - "{{ fw_zones }}"
        - allowed_services

    # 3. 遍历ICMP类型,批量添加到对应区域的阻断列表
    - name: Block specified ICMP types in zones
      ansible.posix.firewalld:
        zone: "{{ item.0.name }}"
        icmp_block: "{{ item.1 }}"
        state: enabled
        permanent: true
        immediate: true
      with_subelements:
        - "{{ fw_zones }}"
        - icmp_blocks

关键说明

  1. with_subelements的作用
    该插件会将fw_zones中的每个区域对象与其子列表(如allowed_services)关联,生成(区域对象, 子列表项)的元组。任务中通过item.0访问区域属性(如name),item.1访问子列表的具体项(如服务名、ICMP类型)。

  2. 无需command模块设置目标
    firewalld模块原生支持target参数,可以直接在创建/更新区域时设置默认目标(如DROP),无需手动执行firewall-cmd命令。

  3. 配置即时生效
    immediate: true确保配置在任务执行后立即生效,无需重启firewalld服务;permanent: true将配置写入持久化文件,避免系统重启后丢失。

内容的提问来源于stack exchange,提问作者Lior

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 05:36:14