Linux自动化运维之SaltStack实践

         1.1、环境

linux-node1(master服务端) 192.168.0.15
linux-node2(minion客户端) 192.168.0.16

1.2、SaltStack三种运行模式介绍

Local 本地
Master/Minion 传统运行方式(server端跟agent端)
Salt SSH SSH

1.3、SaltStack三大功能

  • 远程执行
  • 配置管理
  • 云管理

1.4、SaltStack安装基础环境准备

[root@linux-node1 ~]# cat /etc/redhat-release  ##查看系统版本

CentOS release 6.7 (Final)

[root@linux-node1 ~]# uname -r ##查看系统内核版本

2.6.32-573.el6.x86_64

[root@linux-node1 ~]# getenforce ##查看selinux的状态

Enforcing

[root@linux-node1 ~]# setenforce 0 ##关闭selinux

[root@linux-node1 ~]# getenforce

Permissive

[root@linux-node1 ~]# /etc/init.d/iptables stop

[root@linux-node1 ~]# /etc/init.d/iptables stop

[root@linux-node1 ~]# ifconfig eth0|awk -F ‘[: ]+’ ‘NR==2{print $4}’ ##过滤Ip地址

192.168.0.15

[root@linux-node1 ~]# hostname ##查看主机名

linux-node1.zhurui.com

[root@linux-node1 yum.repos.d]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo  ##安装salt必须使用到epel源

1.4、安装Salt

服务端:

[root@linux-node1 yum.repos.d]# yum install -y salt-master salt-minion ##salt-master包跟salt-minion包

[root@linux-node1 yum.repos.d]# chkconfig salt-master on  ##加入到开机自动启动

[root@linux-node1 yum.repos.d]# chkconfig salt-minion on  ##加入到开机自动启动

[root@linux-node1 yum.repos.d]# /etc/init.d/salt-master start   ##启动salt-master

Starting salt-master daemon:                                   [  OK  ]

启动到这里需要修改minion配置文件,才能启动salt-minion服务

[root@linux-node1 yum.repos.d]# grep ‘^[a-z]’ /etc/salt/minion

master: 192.168.0.15  ##指定master主机

[root@linux-node1 yum.repos.d]# cat /etc/hosts

192.168.0.15 linux-node1.zhurui.com linux-node1  ##确认主机名是否解析

192.168.0.16 linux-node2.zhurui.com linux-node2

解析结果:

  1. [root@linux-node1 yum.repos.d]# ping linux-node1.zhurui.com
  2. PING linux-node1.zhurui.com (192.168.0.15)56(84) bytes of data.
  3. 64 bytes from linux-node1.zhurui.com (192.168.0.15): icmp_seq=1 ttl=64 time=0.087 ms
  4. 64 bytes from linux-node1.zhurui.com (192.168.0.15): icmp_seq=2 ttl=64 time=0.060 ms
  5. 64 bytes from linux-node1.zhurui.com (192.168.0.15): icmp_seq=3 ttl=64 time=0.053 ms
  6. 64 bytes from linux-node1.zhurui.com (192.168.0.15): icmp_seq=4 ttl=64 time=0.060 ms
  7. 64 bytes from linux-node1.zhurui.com (192.168.0.15): icmp_seq=5 ttl=64 time=0.053 ms
  8. 64 bytes from linux-node1.zhurui.com (192.168.0.15): icmp_seq=6 ttl=64 time=0.052 ms
  9. 64 bytes from linux-node1.zhurui.com (192.168.0.15): icmp_seq=7 ttl=64 time=0.214 ms
  10. 64 bytes from linux-node1.zhurui.com (192.168.0.15): icmp_seq=8 ttl=64 time=0.061 ms

[root@linux-node1 yum.repos.d]# /etc/init.d/salt-minion start  ##启动minion客户端

Starting salt-minion daemon:                               [  OK  ]

[root@linux-node1 yum.repos.d]#

客户端:

[root@linux-node2 ~]# yum install -y salt-minion  ##安装salt-minion包,相当于客户端包

[root@linux-node2 ~]# chkconfig salt-minion on  ##加入开机自启动

[root@linux-node2 ~]# grep ‘^[a-z]’ /etc/salt/minion   ##客户端指定master主机

master: 192.168.0.15

[root@linux-node2 ~]# /etc/init.d/salt-minion start  ##接着启动minion

Starting salt-minion daemon:                               [  OK  ]

阅读更多

rsync+inotify实时同步环境部署记录

 

 

随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了很多不足。
首先,rsync在同步数据时,需要扫描所有文件后进行比对,进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的,并且正在发生变化的往往是其中很少的一部分,这是非常低效的方式。
其次,rsync不能实时的去监测、同步数据,虽然它可以通过linux守护进程的方式进行触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时完全的恢复数据。

基于以上两种情况,可以使用rsync+inotify的组合来解决,可以实现数据的实时同步。

inotify是一种强大的、细粒度的、异步的文件系统事件控制机制。linux内核从2.6.13起,加入了inotify支持,通过inotify可以监控文件系统中添加、删除、修改、移动等各种事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools正是实施监控的软件。
在使用rsync首次全量同步后,结合inotify对源目录进行实时监控,只有有文件变动或新文件产生,就会立刻同步到目标目录下,非常高效使用!

———————————————————————————————————–
下面分享下我在实际工作中的一个rsync+inotify案例(其实是个网站图片备份方案):

需求说明:
分别将
192.168.1.106的/Data/fangfull_upload和/Data/erp_upload
192.168.1.57的/Data/xqsj_upload/和/Data/fanghu_upload_src
192.168.1.139的/Data/Static_img/webroot/ssapp-prod和/usr/local/nginx/html/ssapp.prod
实时同步到
192.168.1.5的/home/backup/image-back目录下对应的fangfull_upload、erp_upload、xqsj_upload、fanghu_upload_src、ssapp-prod和ssapp.prod目录。

这样的话:
(1)192.168.1.106、192.168.1.57、192.168.1.139这三台服务器是源服务器,作为rsync的客户端,部署rsync+inotify。
(2)192.168.1.5是目标服务器,作为rsync的服务端。只需要安装配置rsync即可,不需要安装inotify。

—————————————————————
详细部署过程,记录如下:

第一部分:在目标服务器192.168.1.5上部署rsync服务端。

1)关闭selinux
[root@bastion-IDC ~]# vim /etc/selinux/config
SELINUX=disabled
[root@bastion-IDC ~]# setenforce 0

2)防火墙上允许以上三台源服务器访问它的22端口和873端口
[root@bastion-IDC ~]# vim /etc/sysconfig/iptables
…….
…….
-A INPUT -s 192.168.1.106 -m state –state NEW -m tcp -p tcp –dport 22 -j ACCEPT
-A INPUT -s 192.168.1.57 -m state –state NEW -m tcp -p tcp –dport 22 -j ACCEPT
-A INPUT -s 192.168.1.139 -m state –state NEW -m tcp -p tcp –dport 22 -j ACCEPT
-A INPUT -s 192.168.1.106 -m state –state NEW -m tcp -p tcp –dport 873 -j ACCEPT
-A INPUT -s 192.168.1.57 -m state –state NEW -m tcp -p tcp –dport 873 -j ACCEPT
-A INPUT -s 192.168.1.139 -m state –state NEW -m tcp -p tcp –dport 873 -j ACCEPT

[root@bastion-IDC ~]# /etc/init.d/iptables restart

如若hosts.allow里面做了限制,同样也要开放以上三台源服务器的权限
[root@bastion-IDC ~]# vim /etc/hosts.allow
#
# hosts.allow This file contains access rules which are used to
# allow or deny connections to network services that
# either use the tcp_wrappers library or that have been
# started through a tcp_wrappers-enabled xinetd.
#
# See ‘man 5 hosts_options’ and ‘man 5 hosts_access’
# for information on rule syntax.
# See ‘man tcpd’ for information on tcp_wrappers
#
sshd:192.168.1.106,192.168.1.57,192.168.1.139:allow
sshd:all:deny
[root@bastion-IDC ~]# cat /etc/hosts.deny
#
# hosts.deny This file contains access rules which are used to
# deny connections to network services that either use
# the tcp_wrappers library or that have been
# started through a tcp_wrappers-enabled xinetd.
#
# The rules in this file can also be set up in
# /etc/hosts.allow with a ‘deny’ option instead.
#
# See ‘man 5 hosts_options’ and ‘man 5 hosts_access’
# for information on rule syntax.
# See ‘man tcpd’ for information on tcp_wrappers
#

阅读更多

Pupet自动化管理环境部署记录(二)

另一种查看认证的方法:

[root@Master-node ~]# tree /var/lib/puppet/ssl/                       //可以使用”yum install -y tree” 安装tree命令

/var/lib/puppet/ssl/

├── ca

│   ├── ca_crl.pem

│   ├── ca_crt.pem

│   ├── ca_key.pem

│   ├── ca_pub.pem

│   ├── inventory.txt

│   ├── private

│   │   └── ca.pass

│   ├── requests

│   ├── serial

│   └── signed

│       ├── agent-node1.pem

│       ├── agent-node2.pem

│       ├── agent-node3.pem

│       └── master-node.pem

├── certificate_requests

├── certs

│   ├── ca.pem

│   └── master-node.pem

├── crl.pem

├── private

├── private_keys

│   └── master-node.pem

└── public_keys

└── master-node.pem

 

最后在Agent端进行motd模块测试(即客户端取回通过的证书)

[root@Agent-node1 ~]# puppet agent –test                    //–test也可以替换为-t

Info: Caching certificate for agent-node1

Info: Caching certificate_revocation_list for ca

Info: Caching certificate for agent-node1

Warning: Unable to fetch my node definition, but the agent run will continue:

Warning: undefined method `include?’ for nil:NilClass

Info: Retrieving pluginfacts

Info: Retrieving plugin

Info: Caching catalog for agent-node1

Info: Applying configuration version ‘1495876267’

Info: Creating state file /var/lib/puppet/state/state.yaml

Notice: Finished catalog run in 0.06 seconds

 

——————————————————————————-

也可以直接使用命令”puppet agent –no-daemonize –onetime –verbose –debug”,打印证书申请过程中的详细信息

–no-daemonize     前台输出日志

–verbose          输入更加详细的日志

–debug            更加详细的日志,排错的时候使用

–test             表示测试,就带一个–test参数就可以

——————————————————————————-

 

——————————-证书管理——————————

当出现问题需要重新申请证书或重新安装puppet时使用,需要注销证书和删除证书

 

注销证书既是要证书过期(–revoke)

[root@Master-node ~]# puppet cert –revoke agent-node1

Notice: Revoked certificate with serial 10

[root@Master-node ~]# puppet cert –list –all          //如下,过期的证书签名是”-“号

+ “agent-node2” (SHA256) 63:BF:AA:C2:C5:1E:A6:64:47:72:85:B3:4B:32:3E:07:C3:70:8D:86:D3:86:53:1A:FF:F9:9E:93:46:46:CB:13

+ “agent-node3” (SHA256) 41:B1:A7:3C:E3:7D:47:32:21:4F:25:8A:5E:96:77:1A:E0:FE:45:C3:42:0C:BC:D7:0A:0A:D1:E9:BF:FA:E1:96

+ “master-node” (SHA256) DB:81:FB:58:D7:FF:DC:17:3C:C2:4D:7B:2E:DF:35:C2:F5:4D:B8:D2:AE:9D:EF:E0:73:44:11:07:C4:C2:72:23

– “agent-node1” (SHA256) 86:61:2A:99:38:54:E3:FD:E0:8F:40:D4:2D:75:83:6F:64:B6:36:E1:B0:97:0D:B5:82:9C:69:95:D2:95:98:92 (certificate revoked)

 

[root@Master-node ~]# puppet cert –revoke –all          //注销所有证书

 

上面只是让证书失效,客户端连接会失败,并没有删除证书文件。

 

删除证书(–clean)

[root@Master-node ~]# puppet cert –clean agent-node1       //删除agent-node1证书

[root@Master-node ~]# puppet cert –clean –all             //删除所有证书

阅读更多