saltstack是一个非常强大的管理工具,使用saltstack会做到标准化的管理,下面就以一个简单的示例来更加具体的了解一下saltstack的功能特性。
使用saltstack来搭建一个简单的web集群,需要完成三个步骤:
1、系统初始化。初始化模块所有的机器环境一致。
2、功能模块:设置单独的目录haproxy nginx php mysql memcached.
功能模块做到尽可能的全,独立。
3、业务模块:根据业务类型划分,如web服务、论坛bbs等
Base基础环境的配置
salt环境配置
创建salt初始化环境:
修改master配置文件,
1
2
3
4
5
6
7
8
9
10
11
|
# vim /etc/salt/master
file_roots:
#配置基础环境和生产环境两个目录
base:
-
/srv/salt/base
prod:
-
/srv/salt/prod
pillar_roots:
#创建pillar环境
base:
-
/srv/pillar/base
-
/srv/pillar/prod
|
创建环境目录:
1
2
3
4
|
mkdir
/srv/salt/base
mkdir
/srv/salt/prod
mkdir
/srv/pillar/base
mkdir
/srv/pillar/prod
|
base基础环境初始化
基础环境的配置项:
-
dns配置
-
history记录时间
-
记录命令操作
-
内核参数优化
-
安装yum仓库
-
安装zabbix-agent
dns配置,创建dns.sls:
1
2
3
4
5
6
7
8
9
|
[root@node1
/srv/salt/base/init
]
# cat dns.sls
/etc/resolv
.conf:
file
.managed:
-
source
: salt:
//init/files/resolv
.conf
- user: root
- group: root
- mode: 644
[root@node1
/srv/salt/base/init
]
# cp /etc/resolv.conf files/
|
history记录时间,创建history.sls:
1
2
3
4
5
|
[root@node1
/srv/salt/base/init
]
# cat history.sls
/etc/profile
:
file
.append:
- text:
-
export
HISTTIMEFORMAT=
"%F %T `whoami` "
|
记录命令操作,创建audit.sls :
1
2
3
4
5
|
[root@node1
/srv/salt/base/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"; }'
|
内核参数优化,创建sysctl.sls:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[root@node1
/srv/salt/base/init
]
# cat sysctl.sls
net.ipv4.ip_local_port_range:
sysctl.present:
- value: 10000 65000
#指定本地可用的端口范围
fs.
file
-max:
sysctl.present:
- value: 2000000
#最大文件
net.ipv4.ip_forward:
sysctl.present:
- value: 1
#打开转发功能
vm.swappiness:
sysctl.present:
- value: 0
#设置尽量不使用交换分区(权重值)
|
设置epel源,创建yum仓库,
1
2
3
4
5
|
[root@node1
/srv/salt/base/init
]
# cat epel.sls
yum_repo_release:
pkg.installed:
- sources:
- epel-release: http:
//mirrors
.aliyun.com
/epel/epel-release-latest-7
.noarch.rpm
|
创建zabbix-agent模板,这里的安装必须要有对应的yum源,在生产或环境需要有自己的yum源(或zabbix yum源),才能安装上对应的软件包:
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
|
[root@node1
/srv/salt/base/init
]
# cat zabbix-agent.sls
zabbix-agent:
pkg.installed:
- name: zabbix-agent
file
.managed:
- name:
/etc/zabbix/zabbix_agentd
.conf
-
source
: salt:
//init/files/zabbix_agentd
.conf
- template: jinja
- backup: minion
#在文件模块中,对要修改的文件先备份,备份的文件默认在:/var/cache/salt/minion/file_backup/中
- defaults:
Zabbix_Server: {{ pillar[
'Zabbix_Server'
] }}
#被引用的名称A
Hostname: {{
'grains[fqdn]'
}}
#被应用的名称B
- require:
- pkg: zabbix-agent
service.running:
-
enable
: True
-
watch
:
- pkg: zabbix-agent
#包和文件发生改变就重启服务
-
file
: zabbix-agent
zabbix_agentd.conf.d:
file
.directory:
- name:
/etc/zabbix/zabbix_agentd
.d
- watch_in:
#配置目录中发生任何变化都会重启zabbix-agent
- service: zabbix-agent
- require:
- pkg: zabbix-agent
-
file
: zabbix-agent
|
拷贝zabbix的配置文件到file目录,并将pillar参数添加到配置文件的对应位置:
1
2
3
4
5
|
cp
/etc/zabbix/zabbix_agentd
.conf files/
vim files
/zabbix_agentd
.conf
#设置对应参数的引用
Hostname={{ Hostname }}
#设置agent为主动模式,引用B出的参数
Server= {{ Zabbix_Server }}
#此处引用的是A处的Zabbix_Server要使用上面的参数,还需要配置pillar才能使用。
|
配置pillar base初始化环境
创建一个pillar,
1
2
|
[root@node1
/srv/pillar/base/zabbix
]
# cat agent.sls
Zabbix_Server: 172.16.10.60
|
创建pillar的top.sls,指定那些主机运行那些文件:
1
2
3
4
|
[root@node1
/srv/pillar/base
]
# cat top.sls
base:
'*'
:
- zabbix.agent
|
验证pillar的base环境:
1
2
3
4
5
6
7
8
9
|
[root@node1
/srv/pillar/base
]
# salt '*' pillar.items
node2:
----------
Zabbix_Server:
172.16.10.60
node1:
----------
Zabbix_Server:
172.16.10.60
|
验证zabbix配置:
1
|
[root@node1 ~]
# salt '*' state.sls init.zabbix-agent
|
执行成功并自动修改了zabbix的配置文件则说明设置成功。
配置完上面的这些文件,基础环境就配置好了:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
[root@node1
/srv
]
# tree
.
├── pillar
│ ├── base
│ │ ├──
top
.sls
│ │ └── zabbix
│ │ └── agent.sls
│ ├── prod
│ └──
top
.sls
└── salt
├── base
│ └── init
│ ├── audit.sls
│ ├── dns.sls
│ ├── epel.sls
│ ├── files
│ │ ├── resolv.conf
│ │ └── zabbix_agentd.conf
│ ├──
history
.sls
│ ├── sysctl.sls
│ └── zabbix-agent.sls
├── prod
└──
top
.sls
|
可以编写一个基础的初始化配置文件,include所有基础的配置:
1
2
3
4
5
6
7
8
|
[root@node1
/srv/salt/base/init
]
# cat init.sls
include:
- init.dns
- init.
history
- init.audit
- init.sysctl
- init.epel
- init.zabbix-agent
|
然后执行这个主配置文件即可:
1
|
# salt '*' state.sls init.init
|
如果定义高级状态进行执行,就要定义使用top file:
1
2
3
4
|
[root@node1
/srv/salt/base
]
# cat top.sls
base:
'*'
:
- init.init
|
执行高级状态:
1
2
|
# salt '*' state.highstate test=True 验证结果
# salt '*' state.highstate 确认执行
|
提示:
-
在对文件进行操作时,为了避免误操作而破坏源文件,生产上所有涉及到文件的管理都要加上"- backup:minion" 参数,自动备份文件,备份的文件默认在/var/cache/salt/minion/file_backup目录。
-
在对文件执行salt 高级状态时,选对文件进行测试,加 test=True,确认无误后再执行。
Prod环境配置
Haproxy基础环境配置
首先对负载均衡进行一个初始化环境的配置,由于使用haproxy的源码安装方式,所以对prod的基础环境进行配置。
创建分类目录:
1
2
3
4
5
6
|
[root@node1
/srv/salt/prod
]
# mkdir haproxy
[root@node1
/srv/salt/prod
]
# mkdir keepalived
[root@node1
/srv/salt/prod
]
# mkdir nginx
[root@node1
/srv/salt/prod
]
# mkdir php
[root@node1
/srv/salt/prod
]
# mkdir memcached
[root@node1
/srv/salt/prod
]
# mkdir pkg
|
编写与编译相关的安装包文件参数:
1
|
[root@node1
/srv/salt/prod
]
# vim pkg/make.sls
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[root@node1
/srv/salt/prod
]
# cat pkg/make.sls
make
-pkg:
pkg.installed:
- pkgs:
- gcc
- gcc-c++
- glibc
-
make
- autoconf
- openssl
- openssl-devel
- pcre
- pcre-devel
|
对于haproxy需要下载源码进行安装,对于安装的编译参数等可以在一台机器上安装验证。同时,需要将安装包和所需要启动脚本的文件放在files文件目录中。
1
|
[root@node1
/srv/salt/prod/haproxy/files
]
# cp /software/haproxy-1.6.6/examples/haproxy.init ./
|
修改启动脚本haproxy.init中的默认BIN路径:
1
|
BIN=
/usr/local/haproxy/sbin/
$BASENAME
|
这样在/srv/salt/prod/haproxy/files目录下默认就会有两个文件:
1
2
|
[root@node1
/srv/salt/prod/haproxy/files
]
# ls
haproxy-1.6.6.
tar
.gz haproxy.init
|
编写sls文件,在文件编写haproxy的安装配置:
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
|
[root@node1
/srv/salt/prod/haproxy
]
# cat install.sls
include:
- pkg.
make
# 执行pkg/make.sls文件
haproxy-
install
:
file
.managed:
#salt状态模块,将source中的文件下载到ID(没有name参数则默认ID)指定的路径
- name:
/usr/local/src/haproxy-1
.6.6.
tar
.gz
-
source
: salt:
//haproxy/files/haproxy-1
.6.6.
tar
.gz
- mode: 644
- user: root
- group: root
cmd.run:
# cmd.run状态模块
- name:
cd
/usr/local/src
&&
tar
xvf haproxy-1.6.6.
tar
.gz && \
cd
haproxy-1.6.6 &&
make
TARGET=linux2628 PREFIX=
/usr/local/haproxy-1
.6.6 \
&&
make
install
PREFIX=
/usr/local/haproxy-1
.6.6 && \
ln
-s
/usr/local/haproxy-1
.6.6
/usr/local/haproxy
- unless:
test
-L
/usr/local/haproxy
#如果结果为True,则不执行name指向的命令
- require:
- pkg:
make
-pkg
-
file
: haproxy-
install
haproxy-init:
file
.managed:
- name:
/etc/init
.d
/haproxy
-
source
: salt:
//modules/haproxy/files/haproxy
.init
- mode: 755
- user: root
- group: root
- require_in:
-
file
: haproxy-
install
cmd.run:
- name: chkconfig --add haproxy
- unless: chkconfig --list|
grep
haproxy
#当结果为假就执行-添加自启动命令
net.ipv4.ip_nonlocal_bind:
# 设置允许linux监听VIP(非本机IP)
sysctl.present:
- value: 1
/etc/haproxy
:
file
.directory:
# 目录管理
- user: root
- group: root
- mode: 755
|
这里有补充两个状态关系:
unless: 用于检查的命令,仅当unless选项指向的命令返回false时才执行name指向的命令
onlyif: 检查的命令,近当onlyif选项指向的命令返回true时才执行name指向的命令
执行salt 命令,完成所有节点的安装,指定环境路径prod,默认为base环境:
1
|
# salt '*' state.sls haproxy.install saltenv=prod
|
业务引用haproxy
为了更加清晰的对服务模块和业务模块区分,可以在prod目录下分两个目录:cluster和modules ,分别对应业务和服务的各个模块,将所有prod下的目录服务包全部mv到modules目录中。
由于重建了目录,所以之前的/srv/salt/prod/modules/haproxy/install.sls 文件需要修改sourse file路径:
1
2
3
4
5
|
include:
- modules.pkg.
make
-
source
: salt:
//modules/haproxy/files/haproxy-1
.6.6.
tar
.gz
-
source
: salt:
//modules/haproxy/files/haproxy
.init
|
修改之后的目录:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
[root@node1
/srv/salt/prod
]
# tree
.
├── cluster
└── modules
├── haproxy
│ ├── files
│ │ ├── haproxy-1.6.6.
tar
.gz
│ │ └── haproxy.init
│ └──
install
.sls
├── keepalived
├── memcached
├── nginx
├── php
└── pkg
└──
make
.sls
|
执行salt 命令进行测试:
1
|
# salt '*' state.sls modules.haproxy.install saltenv=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
|
[root@node1
/srv/salt/prod/cluster/files
]
# cat 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 50000ms
timeout server 50000ms
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 172.16.10.62: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
source
server web-node1 172.16.10.60:8080 check inter 2000 rise 30 fall 15
server web-node2 172.16.10.61:8080 check inter 2000 rise 30 fall 15
|
修改/srv/salt/prod/modules/haproxy/install.sls 添加开启自启动行为(上面的文件已经添加)
创建haproxy的对外业务配置sls文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
[root@node1
/srv/salt/prod/cluster
]
# cat haproxy-outside.sls
include:
- modules.haproxy.
install
haproxy-service:
file
.managed:
- name:
/etc/haproxy/haproxy
.cfg
-
source
: salt:
//cluster/files/haproxy-outside
.cfg
- user: root
- group: root
- mode: 644
service.running:
- name: haproxy
-
enable
: True
- reload: True
- require:
- cmd: haproxy-
install
-
watch
:
-
file
: haproxy-service
|
同时,需要在base环境中修改top file:
1
2
3
4
5
6
7
|
[root@node1
/srv/salt/base
]
# cat top.sls
base:
'*'
:
- init.init
prod:
'node*'
:
- cluster.haproxy-outside
|
执行salt高级状态,由于haproxy监听80和8888端口,所以先确保这些端口不被占用:
1
2
|
# salt 'node1' state.highstate test=True #高级状态指定top file运行
# salt '*' state.highstate
|
访问监听的8888监控端口:
http://172.16.10.60:8888/haproxy-status
访问两个节点成功,说明配置成功。
本文转自 酥心糖 51CTO博客,原文链接:http://blog.51cto.com/tryingstuff/1873040