题外话
CentOS/RHEL是国内使用最为广泛的Linux操作系统,尤其是企业用户。
CentOS6的生命力之强大,是小版本都已经数到了10!根据历史趋势看,很可能6.11已经在路上了,不排除能创记录得发展到12。
即便是CentOS7已经诞生超过五年,小版本也数到了6!
这就像英国的女王,查尔斯王子都年过七十了,仍然还是女王陛下的天下。
任何软件切换大版本时,总是令人痛苦的,这就像你在centos6时iptables使用得很溜,结果进入7时代后就换成了firewalld!
也许你可以坚持回退到继续使用iptables上去,但操作系统底层的服务启动管理可没法回退,systemd换不回旧时代的init。
So,废话少讲,主动拥抱变化吧。我们就是要同时面对各个技术系统条线上,centos6/7长期并行的局面。在这里,我们演示下怎么利用SaltStack帮助适配系统运维管理中的这些挑战。
下面通过一个例子讲解使用Salt按相同的ACL访问规则使用需求,统一对centos6和centos7系统的主机进行配置管理。
我们假定你已经有一些Salt的基础知识了,所以直接进入正题。
我们将创建一个salt state模块,可以统一配置所有业务主机系统防火墙上针对ssh登录和zabbix监控服务的访问限制规则,同时针对web类型的主机统一放开8080服务端口。
创建一个Salt state状态模块
touch /srv/salt/firewall.sls
假定我们有一个centos6测试机hb1,一个centos7测试机hb2,均已接入salt master管理。
那么,在我们编写完成firewall.sls模块的配置内容后,分别在两个测试机上执行下面的salt状态同步命令,即可使自己的系统防火墙变更为和系统管理的要求一致的状态了。
# salt-call state.apply firewall
- 无论centos6/7,都执行这一个相同的命令即可
编写firewall.sls文件的内容
# 对所有主机生效的通用规则
{% if grains['osmajorrelease'] == 6 %}
# 确认iptables服务启用且运行
iptables:
service.running:
- enable: True
# 放行zabbix监控服务端口
zabbix_service_rule on centos6:
iptables.insert:
- position: 1
- table: filter
- family: ipv4
- chain: INPUT
- jump: ACCEPT
- match: state
- connstate: NEW
- source: 10.2.3.4
- dport: 10050
- proto: tcp
- save: True
# 放行ssh管理端口,限制指定源IP才可以访问
ssh_service_rule on centos6:
iptables.insert:
- position: 2
- table: filter
- family: ipv4
- chain: INPUT
- jump: ACCEPT
- match: state
- connstate: NEW
- source: 10.22.22.22,10.44.44.44
- dport: 22
- proto: tcp
- save: True
# 删除centos6系统默认自带的ssh全放行规则
ssh_close_the_opening_door on centos6:
iptables.delete:
- table: filter
- chain: INPUT
- jump: ACCEPT
- match: state
- connstate: NEW
- dport: 22
- protocol: tcp
- save: True
{% elif grains['osmajorrelease'] == 7 %}
# 确保firewalld启用且运行
firewalld:
service.running:
- enable: True
# 放行zabbix监控服务、ssh管理端口,限制指定源IP才可以访问
ssh and zabbix service rich rules on centos7:
firewalld.present:
- name: public
- rich_rules:
- 'rule family="ipv4" source address="10.22.22.22/32" port protocol="tcp" port="22" accept'
- 'rule family="ipv4" source address="10.44.44.44/32" port protocol="tcp" port="22" accept'
- 'rule family="ipv4" source address="10.2.3.4/32" port protocol="tcp" port="10050" accept'
{% endif %}
# 配置只对web主机生效的规则
{% if grains['server-role'] == 'web' and grains['osmajorrelease'] == 6 %}
web_service_rule on centos6:
iptables.insert:
- position: 3
- table: filter
- family: ipv4
- chain: INPUT
- jump: ACCEPT
- match: state
- connstate: NEW
- dport: 8080
- proto: tcp
- save: True
{% elif grains['server-role'] == 'web' and grains['osmajorrelease'] == 7 %}
web_service_rule on centos7:
firewalld.present:
- name: public
- ports:
- 8080/tcp
{% endif %}
- 在Salt Neon版本之前,firewalld模块中的
prune_services
参数,默认值都是True
。这意味着,利用这个模块配置centos7的firewalld防火墙时,会默认清除防火墙上原有的其他service配置规则,只保留你当前执行状态同步的模块中定义的service规则。当然,如果你也没定义任何service,最终结果就是在firewalld中一条service规则也不会有。 - 在过滤web主机时,使用到了一个自定义的
grains item
项目,有兴趣的可以自行了解下怎样在salt minion配置文件中为主机节点定义更多的grains标签元数据。
关于配置管理命令的幂等特性
上面的firewall.sls系统防火墙状态配置模块,不但是同时兼容centos6/7的,还是支持幂等的。也就是说,任你在一台主机上执行 salt-call state.apply firewall 命令多少次,结果总是同一个。
幂等性,在我们管理很多应用服务或配置状态时,都越发得重要。比方说,关停一个应用程序,点一次停止按钮后,再多点几次,启动一个程序时,把启动按钮多点几次。配置一个服务的过程中,因故中断了,再执行一次部署与配置同步的管理命令。如果你的系统和功能,可以做到上述这些行为,既不会让命令执行的结果出错,也不会重复,也不会缺少内容。那么,这就是支持幂等的系统或功能了。
salt.states.firewalld模块的不足之处
相对于centos6使用的iptables而言,firewalld在SaltStack中得到的配置管理支持,显然要差很多,但基本的功能也都有,也可以使用rich rule做复杂的规则设计。
不足之外,比如说,有firewalld.present函数,却一直没有提供firewalld.absent函数的实现。这对于要删除一条端口放行规则,或删除指定的一条service规则来说,都无法实现。
如果这些方面对你的影响较大,也许,可以自行开发个absent函数对管理功能完善一下。
参考资料:
https://docs.saltstack.com/en/latest/ref/states/all/salt.states.iptables.html
https://docs.saltstack.com/en/latest/ref/states/all/salt.states.firewalld.html