基础篇
--------------------------------------------------------------------------------------------------------
概述:SaltStack简单来说是一个基础架构管理工具,这个比较抽象,说白就是一个运维管理工具,底层是使用python实现,C/S架构,支持分布式部署,据说可以轻松管理上W台服务器,和Puppet这类工具很类似,其主要的功能:
-
基于Key的远程连接并执行命令;
-
强大的搜索器,多种方式过滤服务器;
-
灵活的远程部署实现方式;
-
基于YMAL格式对文件,用户,用户组及服务等资源灵活管理;
极简易安装
本实例采用CentOS6.5_x86_64操作系统,在安装之前请先配置好Yum源
salt-master服务端安装
1
2
3
|
yum
-
y install salt
-
master
/
安装
rpm
-
aq|grep salt
-
master
/
检测
salt
-
master配置文件:
/
etc
/
salt
/
master
|
salt-minion客户端安装
1
2
3
|
yum
-
y install salt
-
minion
/
安装
rpm
-
aq|grep salt
-
minion
/
检测
salt
-
minion配置文件:
/
etc
/
salt
/
minion
|
添加客户端
1
2
3
4
5
6
|
salt
-
key
-
L
/
列出所有key,key格式是minion
-
id
,如果没有配置minion
-
id
,则是主机名
salt
-
key
-
A
/
接受所有key
salt
-
key
-
a “ZK
-
YJY
-
APP
-
01
”
/
接受指定的key
salt
-
key
-
R
/
拒绝所有未接受的key
salt
-
key
-
D
/
删除所有key
salt
-
key
-
d “ZK
-
YJY
-
APP
-
01
”
/
删除指定的key
|
Target搜索器
添加了minion的key后就可以免密码将命令传输到minion,并把执行结果返回来,方便的进行批量操作了,想象一下,如果有上W台服务器,而只想查看某些服务器的配置信息,怎么实现 ? 当然要有一个目标搜索器才行,saltstack的target搜索器非常强大,基于minion的id进行匹配,所以我们在部署minion之前要事先对minion的id做好规划(如果不配置minion的id,则默认是使用主机名,也要对主机名做好规划)
glob方式
1
2
|
salt “
*
” test.ping
salt “ZK
-
YJY
-
APP
-
01
” test.ping
|
正则表达式
1
2
3
|
salt “web
*
” test.ping
salt “web[
0
-
9
]NaNdb?” test.ping
salt “web
-
[x
-
z]” test.ping
|
grains类
1
2
|
salt
-
G “os:CentOS” test.ping
salt
-
G
"cpuarch:x86_64"
test.ping
|
基于IP
1
2
|
salt
-
S
"192.168.153.130"
test.ping
salt
-
S
"192.168.153.0/24"
test.ping
|
基于节点组
需要先在/etc/salt/master中定义nodegroups,如下:
1
2
3
4
|
nodegroups:
group1: 'L@foo.domain.com,bar.domain.com,baz.domain.com’
group2:
'G@os:Debian and foo.domain.com'
group3:
'L@webserver01,webserver02'
|
1
|
salt
-
Ngroup3 test.ping
|
复合方式
本质是上面的方式结合在一起,形成更为复杂的条件:
1
|
salt
-
C
'webserv* and G@os:Debian orE@web-dc1-srv.*'
test.ping
|
Grains是啥
grains简单来说就是一个字典,{“os”:CentOS, “num_cpus”:8},字典就是这样的key-value的键值对的一个无序集合,里面存放着minion端的所有配置信息,
列出配置信息的分类,其实就是查看有哪些key
1
|
salt “
*
” grains.ls
|
列出配置信息的分类和具体分类信息,其实就是查看key-value
1
|
salt “
*
” grains.items
|
列出某个配置信息项的具体信息
1
|
salt “
*
” grains.item cpu_model
|
==========================================================================================
进阶篇States
-------------------------------------------------------------------------------------------------------
这篇是为自动化部署作准备的,核心就是弄清楚States的使用技巧
YAML基本格式
1
2
3
4
|
nginx_package:
/
/
声明
id
file
.managed:
/
/
文件模板的managed函数,作用是实现从master下载文件
-
name:
/
tmp
/
nginx
-
1.8
.
0.tar
.gz
/
/
定义名称空间
-
source: salt:
/
/
nginx
/
files
/
nginx
-
1.8
.
0.tar
.gz
/
/
指定文件在master上的位置
|
难点说明:
saltstack的YMAL格式通常以声明id开始,名称空间会覆盖id,也就是说,如果没有name,则id就是name,如果有name,id只作为标识,且在一个sls文件中,id不能重复,在states中有很多模块函数,可以对文件,用户,用户组,服务,定时任务等资源进行操作,我们只要调用并定义一些参数即可。
这里要注意下缩进和空间,仔细观察就明白了
条件判断和先决条件
1
2
3
4
5
6
7
8
|
extract_nginx:
/
/
声明
id
cmd.run:
/
/
这个模块是表示要执行一些系统命令
-
cwd:
/
tmp
/
/
切换到指定目录下
-
names:
/
/
具体的命令,如果有多条可依次向下排列
-
tar zxf nginx
-
1.8
.
0.tar
.gz
-
unless: test
-
d
/
tmp
/
nginx
-
1.8
.
0
/
/
这里是一个条件判断
-
require:
/
/
先决条件
-
file
: nginx_source
/
/
具体条件
|
难点说明:
第一个要注意的地方是unless这个判断条件,这个条件如果返回false,cmd.run才执行,否则不执行,unless可以很好的控制同步配置后重复执行某些命令
第二个需要注意的地方是先决条件require,先决条件除了require之外还是watch,但require可以用在任何模块中,watch只能用在service.running模块中
用户和组模块
1
2
3
4
5
6
7
8
9
10
11
12
|
nginx_user:
/
/
声明
id
user.present:
/
/
用户管理模块,以下是一些参数
-
name: nginx
-
uid:
121
-
gid:
121
-
createhome: false
-
shell:
/
sbin
/
nologin
-
require:
/
/
先决条件,表示要创建nginx用户先创建nginx这个组
-
group: nginx
group.present:
-
name: nginx
-
gid:
121
|
服务模块
1
2
3
4
5
6
7
|
nginx_service:
/
/
声明
id
service.running:
/
/
服务运行模块
-
name: nginx
-
enable:
True
-
reload
:
True
-
watch:
/
/
监测以下条件是否变化,如果改变则重启服务
-
file
:
/
usr
/
local
/
nginx
/
conf
/
nginx.conf
|
我开始以为是修改minion的nginx配置会自动重启,后面验证不对,应该是修改了master上nginx的配置源文件,执行同步才会重启,使minion的nginx配置文件始终与master配置文件保持一致,这个是我测试的结果,也可能理解有误,后面再去研究吧。
Template模板
1
2
3
4
|
{
%
for
usr
in
[
'moe'
,
'larry'
,
'curly'
]
%
}
{{ usr }}:
user.present
{
%
endfor
%
}
|
这个就是python中的模板标签的定义{%%},{{}}在,sls中,或者在配置源文件中都可以使用模板标签。
1
2
3
4
5
6
7
|
apache:
pkg.installed:
{
%
if
grains[
'os'
]
=
=
'RedHat'
%
}
-
name: httpd
{
%
elif
grains[
'os'
]
=
=
'Ubuntu'
%
}
-
name: apache2
{
%
endif
%
}
|
使用模板可以比较灵活的对可变的部分进行控制
include引入
如果有多个sls文件,我们可以在一个sls文件中引入另一个sls,在init.sls文件顶部添加如下内容:
1
2
3
|
include:
-
install.sls
-
conf.sls
|
批量部署nginx
有了以上的基础,就可以很方便的部署任何软件包了,这里重点讲下步骤:
编辑master配置文件,将如下内容注释去掉
1
2
3
|
file_roots:
base:
/
/
此处的base标识在top.sls文件中引用
-
/
srv
/
salt
/
/
配置管理文件存放的root目录
|
当然,这里可以根据需要创建多个不同的file_roots目录
创建指定的目录
默认/srv目录下是空的,需要创建salt目录
创建top.sls文件
在/srv/salt目录下创建top.sls文件
1
2
3
4
|
base:
/
/
此处的base即在file_roots中定义的base
'*'
:
/
/
这里是表示target目标,可以使用搜索器定义
-
nginx.install
/
/
表示file_roots目录下的nginx目录下的install.sls
-
nginx.conf
/
/
表示file_roots目录下的nginx目录下的conf.sls
|
top.sls是一个入口文件,master同步时首先会去读取top.sls ,通过top.sls去找对应目录下的其它sls文件
编写install.sls和conf.sls
此处略去无数行
将软件包和配置文件和启动脚本放到指定目录
你懂的
网上有大量的部署配置,推荐一些比较好的网址,个人建议学saltstack之前最好有一些python基础,毕竟是python写的