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

如何用templates/blockinfile/lineinfile模块化构建配置?iptables多角色配置求助

我之前在维护多角色Ansible配置的时候,刚好碰到过和你一模一样的需求——用一个基础角色生成通用iptables规则,再让各个业务角色按需追加专属规则。试过几种方案后,发现模板预留锚点+blockinfile模块的组合是最靠谱的,完全适配你说的先初始化再逐个角色叠加的流程,给你一步步拆解下具体怎么实现:

核心思路

先通过setup-iptables角色的模板生成包含通用规则的基础配置文件,在需要追加业务规则的关键位置(比如INPUT链默认拒绝规则之前)预留唯一的标记锚点;然后各个业务角色(比如setup-httpd)通过blockinfile模块,以这个锚点为定位,精准插入自己的规则块。这种方式既能保证规则的顺序正确,又能实现完全的模块化,每个角色只负责自己的规则。

1. 构建setup-iptables角色的基础模板

首先在setup-iptables/templates/iptables.j2里编写通用规则,同时在需要追加业务规则的位置预留锚点注释(一定要唯一,避免和其他内容冲突):

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]

# 通用规则:允许SSH访问
-A INPUT -p tcp --dport 22 -j ACCEPT

# 通用规则:允许回环接口流量
-A INPUT -i lo -j ACCEPT

# 预留的INPUT链业务规则锚点(所有业务规则插入到这里)
# ANSIBLE_MANAGED_INPUT_RULES

# 通用规则:默认拒绝所有未匹配的INPUT流量
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

然后在setup-iptables/tasks/main.yml里用template模块生成初始配置文件:

- name: 生成基础iptables配置文件
  template:
    src: iptables.j2
    dest: /etc/iptables/rules.v4
    mode: '0644'

2. 业务角色通过blockinfile追加规则

以setup-httpd角色为例,在setup-httpd/tasks/main.yml里使用blockinfile模块,定位到之前预留的锚点,插入80/443端口的规则:

- name: 追加HTTP/HTTPS端口规则到iptables配置
  blockinfile:
    path: /etc/iptables/rules.v4
    # 标记该规则块属于httpd角色,方便后续更新/删除
    marker: "# {mark} ANSIBLE_HTTPD_RULES"
    # 指定插入到预留锚点之前,确保规则在默认拒绝之前生效
    insertbefore: "# ANSIBLE_MANAGED_INPUT_RULES"
    # 要插入的规则内容
    block: |
      -A INPUT -p tcp --dport 80 -j ACCEPT
      -A INPUT -p tcp --dport 443 -j ACCEPT

这里的marker参数非常关键:Ansible会自动把{mark}替换成BEGIN和END,生成类似# BEGIN ANSIBLE_HTTPD_RULES和# END ANSIBLE_HTTPD_RULES的标记,后续再次执行角色时,会自动检查这个标记块是否存在,存在的话就只会更新块内的内容,不会重复插入,完美解决重复执行的问题。

如果你的业务规则需要插入到其他位置(比如自定义链后面),只需要把insertbefore换成insertafter,指定对应的锚点即可。

3. 优化:用变量统一管理锚点

为了避免锚点拼写错误,也方便后续修改,可以在setup-iptables/defaults/main.yml里定义锚点变量:

iptables_input_rule_anchor: "# ANSIBLE_MANAGED_INPUT_RULES"

然后在模板里引用这个变量:

# 预留的INPUT链业务规则锚点(所有业务规则插入到这里)
{{ iptables_input_rule_anchor }}

业务角色里也引用这个变量,比如setup-httpd的任务:

insertbefore: "{{ iptables_input_rule_anchor }}"

这样后续要修改锚点内容,只需要改一处变量即可,维护起来更方便。

4. 统一生效iptables规则

所有角色执行完毕后,需要让新的规则生效。可以在setup-iptables角色里添加一个handler,或者单独写一个小角色来执行加载操作:
比如在setup-iptables/tasks/main.yml末尾添加:

- name: 重新加载iptables规则
  command: iptables-restore < /etc/iptables/rules.v4
  notify: 保存iptables规则到文件

然后在setup-iptables/handlers/main.yml里添加:

- name: 保存iptables规则到文件
  command: iptables-save > /etc/iptables/rules.v4

这样每次修改配置后,都会自动加载规则并保存,避免重启主机后规则丢失。

额外场景:删除业务规则

如果某个业务角色不再需要(比如服务下线),只需要在对应的任务里添加state: absent参数,加上对应的marker,就能精准删除该角色添加的规则块:

- name: 删除HTTP/HTTPS端口规则
  blockinfile:
    path: /etc/iptables/rules.v4
    marker: "# {mark} ANSIBLE_HTTPD_RULES"
    state: absent

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:25:48