ansible可免agent批量配置并核对百台服务器防火墙基线:通过ssh免密登录、主机组管理、playbook统一设置firewalld/iptables规则,并自动断言验证策略一致性,失败时精准定位违规主机与规则。

用 Ansible 自动化下发并核对上百台服务器的防火墙基线,核心在于“免 Agent、批量执行、结果可验证”。不需要在每台机器装客户端,只要 SSH 通、有 root 或 sudo 权限,就能统一配置 iptables/firewalld,并自动比对实际策略与预期是否一致。
准备环境:SSH 免密 + 主机分组
确保主控机可无密码登录所有目标服务器:
- 生成密钥:
ssh-keygen -t rsa -b 4096 -N "" - 批量分发公钥:
for ip in $(cat servers.txt); do ssh-copy-id root@$ip; done - 编辑
/etc/ansible/hosts,按角色分组(例如):
[firewall-servers]
192.168.10.1
192.168.10.2
...
[all:vars]
ansible_user=root
ansible_ssh_private_key_file=/root/.ssh/id_rsa
定义防火墙基线:用 playbook 统一配置
编写 firewall-baseline.yml,明确允许/拒绝规则,适配不同系统:
- CentOS/RHEL 7+ 默认用 firewalld:
- name: ensure firewalld is running<br> systemd:<br> name: firewalld<br> state: started<br> enabled: yes- name: set default zone to public<br> firewalld:<br> zone: public<br> permanent: yes<br> state: present- name: allow only ssh, http, https<br> firewalld:<br> port: "{{ item }}"<br> permanent: yes<br> state: enabled<br> loop:<br> - "22/tcp"<br> - "80/tcp"<br> - "443/tcp" - 如需兼容 iptables(如 CentOS 6 或定制场景),加条件判断:
when: ansible_facts['distribution_major_version'] == "6"
自动核对:执行后立即验证策略一致性
下发不是终点,关键在确认每台机器是否真正生效:
- 执行配置后追加验证任务:
- name: get current firewalld rules<br> command: firewall-cmd --list-all --zone=public<br> register: current_rules
- name: assert baseline matches<br> assert:<br> that:<br> - "'22/tcp' in current_rules.stdout"<br> - "'80/tcp' in current_rules.stdout"<br> - "'443/tcp' in current_rules.stdout"<br> - "'2222/tcp' not in current_rules.stdout"<br> msg: "Firewall policy mismatch on {{ inventory_hostname }}" - 失败时会中断并报错,输出具体哪台机器哪条规则不合规,便于快速定位
批量导出与差异分析(可选增强)
若需长期审计或生成报告,可把每台机器的当前策略拉回本地归档:
- 用
fetch模块保存原始输出:- name: fetch firewall config<br> fetch:<br> src: /dev/stdout<br> dest: "reports/firewall/{{ inventory_hostname }}.txt"<br> flat: yes<br> args:<br> executable: /bin/bash<br> command: firewall-cmd --list-all --zone=public - 后续可用脚本对比所有文件,或导入 Excel 做横向策略一致性检查











