saltstack搭建集群详解1

简介:

使用saltstack完成这个架构图:


wKiom1majPuhPrJWAAAlqVjKA9o117.png

配置思路

(1).系统初始化

Base环境下存放所有系统都要执行的状态,调整内核参数,dns,装zabbix-agent

(2).功能模块(如:上面的haproxy

如上面的haproxy nginx php memcached等服务,每一个服务都建一个目录,把每一个服务要执行的状态都放在这个目录下.

(3).业务模块

以业务为单位,一个业务里可能包含haproxynginxphp等,业务需要什么服务就把功能模块里对应的服务include


1.编辑配置文件修改file_roots,并且建立对应目录

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@node1 ~]# vim /etc/salt/master
file_roots:
   base:
     - /srv/salt/base
   test:
     - /srv/salt/test
   prod:
- /srv/salt/prod
[root@node1 ~]# /etc/init.d/salt-master restart
注:top.sls必须放在base环境下
[root@node1 ~]# mkdir /srv/salt/test    测试环境目录
[root@node1 ~]# mkdir /srv/salt/base    基础环境目录
[root@node1 ~]# mkdir /srv/salt/prod    生产环境目录

 

2.系统初始化模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@node1 ~]# mkdir /srv/salt/base/init/        #创建一个系统初始化的目录
[root@node1 ~]# mkdir /srv/salt/base/init/files/     #创建一个文件目录,存放一些初始化需要的文件
[root@node1 ~]# cd /srv/salt/base/
[root@node1 base]# tree
├── init
│   ├── files
└── top.sls
[root@node1 base]# cd init/
( 1 ).配置dns
[root@node1 init]# cat dns.sls
/etc/resolv.conf:                   #这里是指定name,这里没有指定ID
   file.managed:                   #文件管理方法
     - source: salt: //init/files/resolv.conf    #这个路径式相当与配置文件中/srv/salt/base/
     - user: root
     - group: root
     - mode :  644
[root@node1 init]# cat files/resolv.conf
nameserver  192.168 . 10.1

(2)历史命令显示时间

1
2
3
4
5
[root@node1 init]# cat history.sls
/etc/profile:
   file.append:                      #文件追加的方法
     - text:
       - export HISTTIMEFORMAT= "%F %T `whoami`"     #执行之后该语句会被追加到/etc/profile

(3).log日志记录谁在什么时间使用了什么命令

1
2
3
4
5
[root@node1 init]# cat audit.sls
/etc/bashrc:
   file.append:
     - text:
       - export PROMPT_COMMAND= '{ msg=$(history 1|{ read x y;echo $y; });logger "[euid=$(whoami)]":$(who am i):[`pwd`]"$msg";}'

(4)内核调优

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@node1 init]# cat sysctl.sls
vm.swappiness:
   sysctl.present:
     - value:  0
net.ipv4.ip_local_port_range:
   sysctl.present:
     - value:  10000  65000
fs.file-max:
   sysctl.present:
     - value:  100000
  
注:上面的路径
/proc/sys/net/ipv4/ip_local_port_range     #监听端口
/proc/sys/fs/file-max              #打开最大文件数
/proc/sys/vm/swappiness             #交换分区

 

(5)将上面的状态include到 env_init.sls

1
2
3
4
5
6
[root@node1 init]# cat env_init.sls
include :
   - init.dns
   - init.history
   - init.audit
   - init.sysctl

(6).编写top.sls执行以上状态

1
2
3
4
5
[root@node1 init]# vim /srv/salt/base/top.sls
[root@node1 init]# cat /srv/salt/base/top.sls
base:
   '*' :
- init.env_init    #这里只需要执行init目录下的env_init.sls即可,

 

(7)注:以上环境中用到的一些命令

1
2
3
4
5
6
7
export HISTTIMEFORMAT= "%F %T `whoami`"     #该命令是将%F %T `whoami`命令执行的结果赋给变量HISTTIMEFORMAT,用export将其变成环境变量
export PROMPT_COMMAND= '{ msg=$(history 1|{ read x y;echo $y; });logger "[euid=$(whoami)]":$(who am i):[`pwd`]"$msg";}'
执行该命令之后会在log日志里记录用户使用命令的情况,如:
[root@node1 base]# uptime
  05 : 17 : 38  up   4 : 08 ,   4  users,  load average:  0.00 0.00 0.00
[root@node1 base]# tail - 1  / var /log/messages
Aug  11  05 : 17 : 38  node1 root: [euid=root]:root pts/ 3  2017 - 08 - 11  04 : 07  ( 192.168 . 10.1 ):[/srv/salt/base]uptime
1
[root@node1 init]# salt  "*"  state.highstate test=True    #这里可以测试一下前面所配置的是否成功



3.功能模块-------基础包模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@node1 ~]# mkdir /srv/salt/prod/pkg     #基础包目录
[root@node1 ~]# cd /srv/salt/prod/pkg/
[root@node1 pkg]# vim pkg-init.sls        #安装一些基础的包
[root@node1 pkg]# cat pkg-init.sls
pkg-init:                     #这里就是ID号,唯一性
   pkg.installed:                #安装包的模块.方法
     - names:                 #安装包的名字
       - gcc
       - gcc-c++
       - glibc
       - make
       - autoconf
       - openssl
       - openssl-devel


4.功能模块--------haproxy模块

1
2
3
4
5
6
7
8
9
#安装haproxy说明:该模块采用编译安装,用模块安装之前先用一台主机测试一下
#cd /usr/local/src/
#tar xf haproxy- 1.6 . 2 .tar.gz
#cd haproxy- 1.6 . 2
#make TARGET=linux26 PREFIX=/usr/local/haproxy &&make install PREFIX=/usr/local/haproxy
#vim haproxy.init 启动脚步路径修改
#BIN=/usr/local/haproxy/sbin/$BASENAME
#修改之后
#cp haproxy.init /srv/salt/prod/haproxy/files/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
[root@node1 ~]# mkdir /srv/salt/prod/haproxy                    #haprox模块目录
[root@node1 ~]# mkdir /srv/salt/prod/haproxy/files                 #存放haprox的一些文件
[root@node1 ~]# ll /srv/salt/prod/haproxy/files/
-rw-r--r--.  1  root root  1538976  Aug  11   2017  haproxy- 1.6 . 2 .tar.gzhaproxy    #源码包
-rw-r--r--.  1  root root     2395  Aug  11  08 : 31  haproxy.inithaproxy         #启动脚本
[root@node1 ~]# cd /srv/salt/prod/haproxy/
[root@node1 haproxy]# vim install.sls
include :
   - pkg.pkg-init                        #这是个相对目录,相对于配置文件中的/srv/salt/prod/,意思是调用/srv/salt/prod/目录下的pkg目录下的pkg-init.sls
  
haproxy-install:                         #ID
   file.managed:
     - name: /usr/local/src/haproxy- 1.6 . 2 .tar.gz        #name 声明,没有ID可以把name声明放在ID位置
     - source: salt: //haproxy/files/haproxy-1.6.2.tar.gz    #这里也是相对路径/srv/salt/prod/,源码包所在
     - user: root
     - group: root
     - mode:  755
   cmd.run:                 #将要执行的命令放在这个模块下
     - name: cd /usr/local/src/ && tar xf haproxy- 1.6 . 2 .tar.gz && cd haproxy- 1.6 . 2  && make TARGET=linux26 PREFIX=/usr/local/haproxy &&make install PREFIX=/usr/local/haproxy
     - unless: test -d /usr/local/haproxy    #/usr/local/haproxy 目录不存在才执行cmd命令
     - require:                #指定依赖
       - pkg: pkg-init              #依赖pkg-init这个ID的pkg模块,这个模块必须执行成功才执行本模块cmd.run
       - file: haproxy-install        #依赖haproxy-install这个ID的file模块
  
haproxy-init:
   file.managed:
     - name: /etc/init.d/haproxy
     - source: salt: //haproxy/files/haproxy.init
     - user: root
     - group: root
     - mode:  755
     - require:
       - cmd: haproxy-install
   cmd.run:
     - name: chkconfig --add haproxy
     - unless: chkconfig --list|grep haproxy
     - require:
       - file: haproxy-init
  
net.ipv4.ip_nonlocal_bind:            #/proc/sys/net/ipv4/ip_nonlocal_bind,这里只需要写相对路径
   sysctl.present:#sysctl           #模块,管理内核模块
     - value:  1               #默认不让监听非本地ip,改为 1 后可以监听
  
haproxy-config-dir:              #ID
   file.directory:
     - name: /etc/haproxy          #创建配置文件目录
     - user: root
     - group: root
- mode:  755
  
[root@node1 haproxy]# salt  'node1'  state.sls haproxy.install env=prod     #手动测试一下


5.业务模块-------haproxy模块

1
2
[root@node1 ~]# mkdir /srv/salt/prod/cluster
[root@node1 ~]# mkdir /srv/salt/prod/cluster/files
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
[root@node1 ~]# cd /srv/salt/prod/cluster/files
[root@node1 files]# vim haproxy-outside.cfg        #负载均衡文件
global
maxconn  100000
chroot /usr/local/haproxy
uid  99
gid  99
daemon
nbproc  1
pidfile /usr/local/haproxy/logs/haproxy.pid
log  127.0 . 0.1  local3 info
  
defaults
option http-keep-alive
maxconn  100000
mode http
timeout connect 5000ms
timeout client 5000ms
timeout server 5000ms
  
listen stats
mode http
bind  0.0 . 0.0 : 8888
stats enable
stats uri /haproxy-status
stats auth haproxy:saltstack
  
frontend frontend_www_example_com
bind  192.168 . 10.150 : 80
mode http
option httplog
log global
     default_backend backend_www_example_com
backend backend_www_example_com
option forwardfor header X-REAL-IP
option httpchk HEAD / HTTP/ 1.0
balance roundrobin
server web-node1   192.168 . 10.129 : 8080  check inter  2000  rise  30  fall  15
server web-node2   192.168 . 10.128 : 8080  check inter  2000  rise  30  fall  15

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@node1 cluster]# cd /srv/salt/prod/cluster/
[root@node1 cluster]# cat haproxy-outside.sls
include :
   - haproxy.install                      #执行haproxy目录下的install.sls
haproxy-service:#ID
   file.managed:
     - name: /etc/haproxy/haproxy.cfg             #安装之后配置文件的名字
     - source: salt: //cluster/files/haproxy-outside.cfg    #源配置文件,前面已经写好
     - user: root
     - group: root
     - mode:  644
   service.running:            #service模块下的running方法,作用:启动服务
     - name: haproxy           #服务名字
- enable: True             #是否开机启动
     - reload: True           #是否reload,如果不加,配置文件变了会restart
     - require:
       - cmd: haproxy-init      #依赖haproxy-init下的cmd,意思是启动脚本那步必须执行成功
     - watch:              #关注某个文件状态
       - file: haproxy-service    #关注haproxy-service ID下的file模块里的文件,文件改变会reload

 

6.编辑top.sls

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@node1 base]# cd /srv/salt/base/
[root@node1 base]# vim top.sls
base:
   '*' :
     - init.env_init                   #所有主机都执行init目录下的env_init.sls
prod:
   'node1' :
     - cluster.haproxy-outside              #node1执行cluster目录下的haproxy-outside.sls
   'node2' :
     - cluster.haproxy-outside
  
[root@node1 base]# salt  '*'  state.highstate test=True    #测试执行一下
[root@node1 prod]# salt  '*'  state.highstate




使用httpd测试一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@node1 prod]# vim /etc/httpd/conf/httpd.conf
Listen  8080
[root@node1 prod]# cat / var /www/html/index.html
node1
[root@node1 prod]# /etc/init.d/httpd restart
[root@node2 ~]# vim /etc/httpd/conf/httpd.conf
[root@node2 prod]# cat / var /www/html/index.html
Node2
  
Listen  8080
[root@node2 ~]# /etc/init.d/httpd restart
 
在网页输入下面的地址登录:
192.168 . 10.129 : 8888 /haproxy-status
192.168 . 10.128 : 8888 /haproxy-status
用户haproxy密码saltstack

wKioL1maxkCg6NmlAACBrP8Y0qI098.png


本文转自 fxl风 51CTO博客,原文链接:http://blog.51cto.com/fengxiaoli/1958115


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
消息中间件 监控 网络协议
SaltStack安装Apache/Mysql/PHP部署Wordpress
SaltStack是一个服务器基础架构集中化管理平台,具备配置管理、远程执行、监控等功能,基于Python语言实现,结合轻量级消息队列(ZeroMQ)与Python第三方模块(Pyzmq、PyCrypto、Pyjinjia2、python-msgpack和PyYAML等)构建。 SaltStack 采用 C/S模式,server端就是salt的master,client端就是minion,minion与master之间通过ZeroMQ消息队列通信。 master监听4505和4506端口,4505对应的是ZMQ的PUB system,用来发送消息,4506对应的是REP system是来接受
153 0
|
关系型数据库 应用服务中间件 测试技术