我目前正在編寫 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 存在。