1. Ansible核心模块实战解析:firewalld与setup深度应用
在自动化运维领域摸爬滚打多年,我深刻体会到Ansible模块就像瑞士军刀里的各种工具——看似简单,但组合使用能解决90%的运维难题。今天重点拆解两个高频模块:firewalld(防火墙管理)和setup(系统信息收集),这两个模块在服务器初始化、安全加固场景中几乎每天都会用到。
最近在给某电商平台做自动化部署时,仅用firewalld模块就实现了200+服务器端口策略的批量配置,而setup模块则在硬件巡检时帮我们快速定位了30台内存异常的服务器。下面分享的实战经验包含大量生产环境验证过的技巧,特别是firewalld规则持久化、多网卡策略配置这些容易踩坑的细节。
2. firewalld模块完全指南
2.1 基础规则管理
firewalld模块的核心功能是通过ansible-playbook动态管理防火墙规则。与手动敲firewall-cmd命令相比,它能实现规则变更的原子化操作和版本控制。以下是开放HTTP服务的典型示例:
yaml复制- name: Allow HTTP service
ansible.posix.firewalld:
service: http
permanent: true
immediate: true
state: enabled
关键参数解析:
permanent: 规则持久化(写入配置文件)immediate: 立即生效(无需reload)zone: 指定作用域(默认public)
生产环境必须同时启用permanent和immediate,否则重启后规则会丢失。曾经有次线上事故就是因为漏了permanent参数,服务器重启后业务端口全部被阻断。
2.2 高级端口管理
复杂场景下需要精细控制端口规则,比如允许特定IP访问数据库端口:
yaml复制- name: Allow DB access from app servers
ansible.posix.firewalld:
port: 3306/tcp
source: 192.168.1.0/24
permanent: yes
state: enabled
特殊技巧:
- 端口范围用
5000-6000/tcp格式 - 多网卡环境需指定zone:
yaml复制zone: internal interface: eth1 - 富规则(Rich Rule)实现复杂ACL:
yaml复制rich_rule: 'rule family="ipv4" source address="10.0.0.5" port port="8080" protocol="tcp" accept'
2.3 规则持久化原理
firewalld模块底层通过DBus接口与firewalld服务通信。当设置permanent=true时,规则会写入XML配置文件(通常位于/etc/firewalld/zones/)。这个机制导致两个常见问题:
-
配置冲突:手动修改配置文件可能导致ansible执行失败
- 解决方案:先用
firewall-cmd --runtime-to-permanent同步配置
- 解决方案:先用
-
服务未启动:firewalld服务必须处于running状态
- 预处理任务示例:
yaml复制- name: Ensure firewalld is running service: name: firewalld state: started enabled: yes
- 预处理任务示例:
3. setup模块系统探秘
3.1 信息收集机制
setup模块是Ansible的"系统体检仪",能采集200+项硬件和系统指标。执行以下任务会返回结构化数据:
yaml复制- name: Gather system facts
setup:
gather_subset:
- all
关键数据分类:
- 硬件信息:ansible_processor、ansible_memtotal_mb
- 网络配置:ansible_interfaces、ansible_default_ipv4
- 存储信息:ansible_devices、ansible_mounts
在KVM虚拟化环境中,ansible_processor_vcpus可能返回物理核心数而非分配的核心数,这是libvirt的已知特性。
3.2 性能优化技巧
默认情况下setup会收集全部信息,但某些场景只需特定数据:
yaml复制- name: Collect minimal facts
setup:
gather_subset:
- '!all'
- '!min'
- network
过滤策略对比:
| 策略 | 执行时间 | 数据量 |
|---|---|---|
| all | 2.3s | 45KB |
| min | 0.5s | 5KB |
| 自定义 | 1.1s | 12KB |
对于100+节点的集群,合理使用gather_subset能显著提升playbook执行速度。
3.3 自定义fact扩展
除了系统内置信息,还可以通过/etc/ansible/facts.d/添加自定义fact。例如创建应用版本检测:
bash复制# /etc/ansible/facts.d/appinfo.fact
[general]
app_version = 2.4.1
config_hash = 7d3f4e1
在playbook中通过ansible_local.appinfo.general访问这些数据。这个特性在蓝绿部署时特别有用,可以快速验证各节点版本一致性。
4. 模块组合实战案例
4.1 服务器安全基线配置
结合两个模块实现自动化安全加固:
yaml复制- name: Security hardening
hosts: all
tasks:
- name: Collect network info
setup:
gather_subset: network
- name: Allow SSH only from management network
ansible.posix.firewalld:
service: ssh
source: "{{ ansible_default_ipv4.network }}/24"
permanent: true
state: enabled
when: ansible_default_ipv4.address is defined
这个playbook会:
- 先收集网络信息
- 仅允许同网段IP访问SSH
- 自动跳过无IP地址的节点
4.2 硬件变更检测系统
定期巡检硬件配置变更:
yaml复制- name: Hardware audit
hosts: db_servers
vars:
baseline_file: "/var/lib/ansible/hw_baseline/{{ inventory_hostname }}.json"
tasks:
- name: Get current facts
setup:
gather_subset:
- hardware
register: current_facts
- name: Load baseline data
stat:
path: "{{ baseline_file }}"
register: baseline_stat
- name: Compare changes
fail:
msg: "Hardware configuration changed!"
when: >
baseline_stat.stat.exists and
current_facts.ansible_facts != lookup('file', baseline_file)|from_json
5. 高频问题解决方案
5.1 firewalld模块常见错误
-
权限不足:
bash复制
Failed to connect to bus: Permission denied- 原因:非root用户未配置sudo
- 修复:在playbook开头添加:
yaml复制become: yes become_method: sudo
-
服务未运行:
bash复制
FirewallD is not running- 预处理任务:
yaml复制- name: Start firewalld service: name: firewalld state: started
- 预处理任务:
5.2 setup模块数据过滤
当只需要特定fact时,可以用filter参数大幅减少数据量:
yaml复制- name: Get only memory info
setup:
filter: "ansible_mem*"
支持的通配符:
ansible_*:所有factsansible_mem*:内存相关ansible_*_ipv4:IPv4网络信息
5.3 性能调优参数
对于大型集群,这些参数能提升模块执行效率:
ini复制# ansible.cfg
[defaults]
gathering = smart
fact_caching = jsonfile
fact_caching_connection = /tmp/ansible_facts
fact_caching_timeout = 3600
这种配置会使setup模块:
- 首次运行时收集全部facts并缓存
- 后续运行只收集变化的数据
- 缓存1小时后自动失效
