我目前正在编写 Ansible playbook,尝试在 CentOS 6.8 最小安装上安装并启动 iptables 防火墙。我正在 Ansible 中执行以下操作。
### sets up FW pkgs
- name: Install FW packages
hosts: elasticsearch-servers
become: yes
tasks:
- name: install ipset
yum: name={{ item }} state=present
with_items:
- ipset
- iptables
- name: start iptables service
service: name=iptables state=started enabled=yes
然而这会导致这样的结果:
TASK [start iptables service] **************************************************
fatal: [10.40.3.246]: FAILED! => {"changed": false, "failed": true, "msg": "iptables: No config file.[WARNING]\r\n"}
fatal: [10.40.3.254]: FAILED! => {"changed": false, "failed": true, "msg": "iptables: No config file.[WARNING]\r\n"}
fatal: [10.40.3.164]: FAILED! => {"changed": false, "failed": true, "msg": "iptables: No config file.[WARNING]\r\n"}
答案1
所以这似乎是 CentOS 6.5 之后出现的问题。其中有一个客户门户主题,标题为:iptables 在 Red Hat Enterprise Linux 6.6 及以上版本的最小安装中启动失败。。
直接的问题是缺少/etc/sysconfig/ip*
iptables 服务启动所需的文件。您可以通过运行 来强制创建这些文件service iptables save
,但是开箱即用,这也会失败,因为需要内核模块才能运行service iptables save
。
这有点像第22条军规!
解决这个问题的最简单方法是引导这两个内核模块的加载:
- iptables_过滤器
- ip_表
通过运行iptables
命令:
$ iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
您将看到现在已加载的模块:
$ lsmod | grep iptable
iptable_filter 2793 0
ip_tables 17831 1 iptable_filter
然后,您可以执行 aservice iptables save
来创建丢失的文件,从而启动 iptables 服务。
安西布尔
command:
上面的内容很有趣,但如果不借助和模块的帮助,通过 Ansible 执行起来并不是很友好shell:
。
但是我们可以使用modules:
Ansible中的模块来保证内核模块的加载/卸载。
例如:
### sets up FW pkgs
- name: Install FW packages
hosts: elasticsearch-servers
become: yes
tasks:
- name: install ipset
yum: name={{ item }} state=present
with_items:
- ipset
- iptables
# these next 2 tasks work around issue with iptables RPM in CentOS 6.5+
# REF: https://access.redhat.com/solutions/1361093
- name: load ip_tables kernel module
modprobe: name=iptable_filter state=present
- name: initial save iptables generate files
command: /sbin/service iptables save
args:
warn: false
- name: start iptables service
service: name=iptables state=started enabled=yes
在上面,我们在尝试保存之前确保 iptable_filter 存在。