如何在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
关键说明
with_subelements的作用
该插件会将fw_zones中的每个区域对象与其子列表(如allowed_services)关联,生成(区域对象, 子列表项)的元组。任务中通过item.0访问区域属性(如name),item.1访问子列表的具体项(如服务名、ICMP类型)。无需
command模块设置目标firewalld模块原生支持target参数,可以直接在创建/更新区域时设置默认目标(如DROP),无需手动执行firewall-cmd命令。配置即时生效
immediate: true确保配置在任务执行后立即生效,无需重启firewalld服务;permanent: true将配置写入持久化文件,避免系统重启后丢失。
内容的提问来源于stack exchange,提问作者Lior
相关产品推荐
相关产品推荐

