SaltStack、Ansible、Puppet比较
1、SaltStack(一般用于大于1000台服务器的公司环境)
saltStack由Python编写,为server-client模式的系统,自己本身支持多master。
运行模式为master端下发指令,客户端接收指令执行。
saltstack依赖于zeromq消息队列,采用yaml格式编写配置文件,比较简单。
支持api及自定义python模块,能轻松实现功能扩展。
2、Ansible(应用于1000台以下服务器的环境)
类似与saltstack,基于python开发,关注的重点是精简和快速。
不需要在节点安装代理软件,通过ssh执行所有功能,安装运行简单。
其模块可以用任何语言开发,采用yaml格式编写配置文件。
没有客户端,较难扩展。
3、Puppet(慢慢的被市场淘汰)
puppet由Ruby编写,为server-client模式的系统。
运行时由客户端定时去获取自己的配置文件进而应用更改。
也可以通过master的push命令即可触发变更。
将命令,文件,服务等抽象成资源,概念比较统一,时间悠久,文档较多。
就可用操作,模块,用户界面等等功能而言,是三者之中最全面的。
安装部署难度一般,配置清单相对于其他工具较复杂。
saltstack官网:www.saltstack.com
saltstack安装:repo.saltstack.com
saltstack文档:docs.saltstack.com
saltstack国内:www.saltstack.cn
saltstack是由thomas Hatch于2011年创建的一个开源项目,设计初衷是为了实现一个快速的远程执行系统。
Salt是python编写的,支持用户通过python自定义功能模块,也提供了大量的python API接口,用户可以根据需要进行简单快速的扩展。
Local 本地运行,交付管理
Master/Minion <<< 常用方式
Salt SSH 不需要客户端
在安装salt之前,先理解salt架构中各个角色,主要区分是salt-master和salt-minion,顾名思义master是中心控制系统,minion是被管理的客户端。
salt架构中的一种就是master > minion。
在远程执行系统中,salt用python通过函数调用完成任务。
运行salt所需依赖包:
python
zeromq
pyzmp
pycrypto
msgpack-python
yaml
jinja2
master(本机也有minion) | 192.168.1.128 |
---|---|
minion | 192.168.1.129 |
[root@master ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@master ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@master ~]# yum clean all #清空缓存
[root@master ~]# yum makecache #生成yum缓存
[root@master ~]# yum list salt #查看salt包
[root@master ~]# yum install salt-master -y #安装salt-master
[root@master ~]# yum install salt-minion -y #安装salt-minion
安装好salt之后开始配置,salt-master默认监听两个端口:
4505 | publish_port 提供远程命令发送功能 |
---|---|
4506 | ret_port 提供认证,文件服务,结果收集等功能 |
确保客户端可以通信服务器的此2个端口,保证防火墙允许端口通过。本例环境直接关闭了防火墙。
salt-master的配置文件 | /etc/salt/master |
---|---|
salt-minion的配置文件 | /etc/salt/minion |
配置文件中包含了大量可调整的参数,这些参数控制master和minion各个方面
[root@master ~]# vim /etc/salt/master
interface: 0.0.0.0 #绑定到本地的0.0.0.0地址
publish_port: 4505 #管理端口,命令发送
user: root #运行salt进程的用户
worker_threads: 5 #salt运行线程数,线程越多处理速度越快,不要超过cpu个数
ret_port: 4506 #执行结果返回端口
pidfile: /var/run/salt-master.pid #pid文件位置
log_file: /var/log/salt/master #日志文件地址
auto_accept: False #自动接收minion的key
[root@master ~]# vim /etc/salt/minion
master: 192.168.1.128
master_port: 4506
user: root
id: master
acceptance_wait_time: 10
log_file: /var/log/salt/minion
[root@master ~]# systemctl start salt-minion
[root@master ~]# systemctl start salt-master
检查salt状态
[root@master ~]# systemctl status salt-minion
[root@master ~]# systemctl status salt-master
[root@minion ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@minion ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@minion ~]# yum clean all #清空缓存
[root@minion ~]# yum makecache #生成yum缓存
[root@minion ~]# yum install salt-minion -y #安装salt-minion
[root@minion ~]# vim /etc/salt/minion
master: 192.168.1.128
master_port: 4506
user: root
id: minion
acceptance_wait_time: 10
log_file: /var/log/salt/minion
[root@minion ~]# systemctl start salt-minion #启动salt-minion
[root@minion ~]# systemctl status salt-minion #检查salt状态
在minion启动后连接master会请求master为其签发证书,等待证书签发完成后,master可以信任minion,并且minion和master之间的通信是加密的。
[root@master ~]# salt-key -L #salt-key命令用于管理mionion秘钥
Accepted Keys:
Denied Keys:
Unaccepted Keys:
master #此时已经出现master(本机的master)
minion #此时已经出现minion(minion的minion)
Rejected Keys:
此时slave已经出现在unaccepted keys中,说明minion已经和master联系,并且master已经获取了minion的公钥,等待下一步指令。
在master上执行
[root@master ~]# salt-key -f master
Unaccepted Keys:
master: dc:58:23:ea:81:16:73:ce:64:11:0e:d0:ef:07:48:d0
[root@master ~]# salt-key -f minion
Unaccepted Keys:
minion: 6f:87:18:3d:08:dc:e2:8d:d5:1e:fc:1a:16:9a:01:da
然后可以在master和minion上获取两个minion的秘钥
[root@master ~]# salt-call --local key.finger
local:
dc:58:23:ea:81:16:73:ce:64:11:0e:d0:ef:07:48:d0
[root@minion ~]# salt-call --local key.finger
local:
6f:87:18:3d:08:dc:e2:8d:d5:1e:fc:1a:16:9a:01:da
因此可确认秘钥匹配,在master上接收秘钥
[root@master ~]# salt-key -a master
The following keys are going to be accepted:
Unaccepted Keys:
master
Proceed? [n/Y] y
Key for minion master accepted.
[root@master ~]# salt-key -a minion
The following keys are going to be accepted:
Unaccepted Keys:
minion
Proceed? [n/Y] y
Key for minion minion accepted.
确认接收秘钥后,检验minion秘钥是否被接收
[root@master ~]# salt-key -L
Accepted Keys:
master
minion
Denied Keys:
Unaccepted Keys:
Rejected Keys:
秘钥接收完成后,就可以执行第一条salt啦
[root@linux-node1 ~]# salt-key -L #查看KEY状态
Accepted Keys: #已经接受的key
Denied Keys: #拒绝的key
Unaccepted Keys: #未加入的key
Rejected Keys: #吊销的key
常用参数:
-L #查看KEY状态
-A #允许所有
-D #删除所有
-a #认证指定的key
-d #删除指定的key
-r #注销掉指定key(该状态为未被认证)
#在master端/etc/salt/master配置
auto_accept: True #如果对所有Minion信任,可以配置master自动接受请求
[root@master ~]# rpm -ql salt-master
/etc/salt/master # salt master主配置文件
/usr/bin/salt #salt master 核心操作命令
/usr/bin/salt-cp #salt 文件传输命令
/usr/bin/salt-key #salt证书管理
/usr/bin/salt-master #salt master 服务命令
/usr/bin/salt-run #salt master runner命令
[root@minion ~]# rpm -ql salt-minion
/etc/salt/minion #minion配置文件
/usr/bin/salt-call #拉取命令
/usr/bin/salt-minion #minion服务命令
/usr/lib/systemd/system/salt-minion.service #minion启动脚本
[root@master ~]# salt '*' test.ping
minion:
True
master:
True
注释:
salt 是一个命令
* 表示目标主机, 在这里代表所有目标主机
test.ping是salt远程执行的一个模块下面的方法。
这是条很简单的探测minion主机存活命令,也是远程执行命令,我们通过master发送消息给"*"所有的minion,并且告诉他们运行salt内置的命令(也是python模块中的一个函数),返回true表示slave机器监控存活。
[root@master ~]# salt '*' test.echo 'hello'
master:
hello
minion:
hello
test.fib生成斐波那契数列(菲波那切数列定义是第0项是0,第1项是1,数列从第3项开始,每一项等于前两项之和)
[root@master ~]# salt 'minion' test.fib 50
minion:
|_
- 0
- 1
- 1
- 2
- 3
- 5
- 8
- 13
- 21
- 34
- 6.91413879395e-06
小结:此前在机器上安装了salt minion和salt master,进行了最简单的连接,然后master接受了minion的秘钥,运行了第几条test模块的命令
在命令行输入的命令都是 执行模块
等到命令写入到文件中就叫做 状态模块
[root@master ~]# salt --help #即可查看salt帮助
Usage: salt [options] '' <function> [arguments]
salt命令 参数 目标 salt模块的函数 远程执行的参数
[root@master ~]# salt --summary '*' cmd.run 'hostname' #summary参数显示salt命令的概要
master:
master
minion:
minion
-------------------------------------------
Summary
-------------------------------------------
# of Minions Targeted: 2
# of Minions Returned: 2
# of Minions Did Not Return: 0
-------------------------------------------
[root@master ~]# salt 'minion' sys.list_modules #与系统交互的sys模块
[root@master ~]# salt 'minion' cmd.run 'ps -ef | grep python'
minion:
root 938 1 0 Aug07 ? 00:00:02 /usr/bin/python -Es /usr/sbin/tuned -l -P
root 2945 1 0 Aug07 ? 00:00:00 /usr/bin/python /usr/bin/salt-minion
root 2951 2945 0 Aug07 ? 00:00:06 /usr/bin/python /usr/bin/salt-minion
root 42862 1 0 02:46 ? 00:00:00 /usr/bin/python /usr/bin/salt-minion
root 42863 42862 0 02:46 ? 00:00:00 /bin/sh -c ps -ef | grep python
root 42865 42863 0 02:46 ? 00:00:00 grep python
[root@master ~]# salt '*' pkg.install "nginx" #在minion上安装nginx
[root@master ~]# salt 'master' pkg.remove "nginx" #卸载minion上的nginx
[root@master ~]# salt 'minion' pkg.version "nginx" #检查pkg包的版本
minion:
1:1.16.1-1.el7
管理服务是系统管理员的重要任务,通过salt管理minion服务会很简单,使用service模块
[root@master ~]# salt 'minion' service.start "nginx"
minion:
True
[root@master ~]# salt 'minion' service.status "nginx"
minion:
True
[root@master ~]# salt 'minion' service.stop "nginx"
minion:
True
[root@master ~]# salt --out=json '*' cmd.run_all 'hostname'
{
"master": {
"pid": 49012,
"retcode": 0,
"stderr": "",
"stdout": "master"
}
}
{
"minion": {
"pid": 43028,
"retcode": 0,
"stderr": "",
"stdout": "minion"
}
}
[root@master ~]# salt --out=yaml '*' cmd.run_all 'hostname'
minion:
pid: 43034
retcode: 0
stderr: ''
stdout: minion
master:
pid: 49063
retcode: 0
stderr: ''
stdout: master
在学习saltstack过程中,第一要点就是States编写技巧,简称SLS文件。这个文件遵循YAML语法。
json xml yaml 数据序列化格式
yaml容易被解析,应用于配置文件
salt的配置文件是yaml配置文件,不能用tab
saltstack,k8s,ansible都用的yaml格式配置文件
语法规则:
大小写敏感
使用缩进表示层级关系
缩进时禁止tab键,只能空格
缩进的空格数不重要,相同层级的元素左侧对其即可
# 表示注释行
yaml支持的数据结构:
对象: 键值对,也称作映射 mapping 哈希hashes 字典 dict 冒号表示 key: value key冒号后必须有空格
数组: 一组按次序排列的值,又称为序列sequence 列表list 短横线 - list1
纯量: 单个不可再分的值
对象:键值对
yaml
first_key:
second_key:second_value
python
{
'first_key':{
'second_key':'second_value',
}
}
YAML是YAML Ain’t Markup Language的首字母缩写,YAML的语法简单,结构体通过空格展示
项目使用 ‘-’ 代表
键值对通过 ‘:’ 分割
YAML语法遵循固定的缩进风格,表示数据层级结构关系,saltstack需要每个缩进级别由2个空格组成,禁止用tabs!!!
Python中的字典是简单的键值对,go语言中称作哈希表map
字典的key通过冒号分割
key在YAML中表现形式是一个冒号结果的字符串
my_key: my_value
转化到python语法中,上述命令为
{'my_key':'my_value'}
value还可以通过缩进和key关联,四个空格!!
my_key:
my_value
转化为python语法同样的
{'my_key':'my_value'}
YAML语法中字典是可以嵌套的
one_dict_key:
two_dict_key:value_dict
转化为python语法
{
'one_dict_key':{
'two_dict_key':'value_dict'
}
}
短横杠
YAML语法表示列表,使用一个横杠加一个空格,多个项使用同样的缩进级别作为同一个列表的部分
- list_value_one
- list_value_two
- list_value_three
列表可以作为一个键值对的value,例如一次性要安装多个软件
my_dict:
- l1
- l2
- l3
转化为python代码理解就是
{
'my_dict':['l1','l2',;l3]
}
之前执行的远程命令,都是一个过程式的,类似一段shell或者python脚本执行,执行一次触发一次相同的功能。那么大量的minion上运行远程命令就必须使用salt提供的“状态管理”了,状态是对minion的一种描述和定义,运维不需要关心部署是如何完成的,只需要描述minion需要达到什么状态。
[root@master ~]# vim /etc/salt/master
file_roots:
base:
- /srv/salt/base
dev:
- /srv/salt/dev
test:
- /srv/salt/test
prod:
- /srv/salt/prod
[root@master ~]# systemctl restart salt-master #重启服务
[root@master ~]# mkdir -p /srv/salt/{base,dev,test,prod}
[root@minion ~]# mkdir -p /srv/salt/{base,dev,test,prod}
[root@master ~]# vim /srv/salt/base/nginx.sls
nginx-install:
pkg.installed:
- name: nginx
nginx-service:
service.running:
- name: nginx
- enable: True
nginx.sls文件解释:
sls配置文件都遵循YAML语言描述
第一条命令使用了pkg.install安装命令,相对于运行了yum install,而此时state模块会判断nginx是否安装了,如果没有安装就进行安装,安装了就什么都不做。
状态描述都会遵循这个原则,只有检测到真实状态和所需状态不一就会执行此功能,这种性质叫做幂等性。
此时用state模块部署nginx软件,通过我们编写的nginx.sls描述性配置文件,命令行调用state模块的sls函数。
[root@master ~]# salt 'minion' state.sls nginx
可以去minion测试关闭nginx,删除nginx,重新执行命令,一样可以安装启动nginx
[root@master ~]# salt 'minion' cmd.run 'ps -ef | grep nginx'
minion:
root 42978 1 0 02:49 ? 00:00:00 nginx: master process /usr/sbin/nginx
nginx 42979 42978 0 02:49 ? 00:00:00 nginx: worker process
root 43255 43254 0 03:04 ? 00:00:00 /bin/sh -c ps -ef | grep nginx
root 43257 43255 0 03:04 ? 00:00:00 /bin/sh -c ps -ef | grep nginx
老板让你收集公司300台服务器的相关硬件信息,你是一台台登录呢?还是选择用salt收集呢?又或者用python的salt-api写脚本呢
Grains 是saltstack组件中非常重要之一,在配置部署时候经常使用,Grains记录minion的静态信息,比如常用属性,CPU、内存、磁盘、网络信息等。
Minions的Grains信息是Minion启动时采集汇报给Master的
Grains是以 key value形式存储的数据库,可以看做Host的元数据(metadata)
Grains保存着收集到的客户端的详细信息
如果slave机器数据变化,grains就过期了
在生产环境中需要自定义Grains,可以通过:
Minion配置文件
Grains相关模块定义
Python脚本定义
[root@master ~]# salt 'minion' sys.doc grains #查看grains的命令用法
Grains人为是描述minion本身固有的静态属性数据,列出主机所有Grains数据
[root@master ~]# salt 'minion' grains.items
[root@master ~]# salt 'minion' grains.ls #列出所有grains方法
[root@master ~]# salt 'minion' grains.item os id host
minion:
----------
host:
minion
id:
minion
os:
CentOS
利用Grains静态信息定位主机
[root@master ~]# salt '*' grains.item key1 key2 key3
minion:
----------
key1:
key2:
key3:
master:
----------
key1:
key2:
key3:
salt ‘*’ -G
定位Cenots的机器
[root@master ~]# salt -G 'os:CentOS' test.ping
master:
True
minion:
True
定位操作系统系统是7系列的机器
[root@master ~]# salt -G 'osrelease:7*' test.ping
minion:
True
master:
True
找出ip地址
[root@master ~]# salt '*' grains.item fqdn_ip4
master:
----------
fqdn_ip4:
- 192.168.1.128
- 192.168.122.1
minion:
----------
fqdn_ip4:
- 192.168.1.129
- 192.168.122.1
因此用grains.items列出所有的数据匹配主机,以及根据单一信息定位数据,Grains还可以自定义来满足不同的需求。
设置数据
[root@master ~]# salt 'minion' grains.setval cpu_num 8
minion:
----------
cpu_num:
8
查询数据
[root@master ~]# salt 'minion' grains.item cpu_num
minion:
----------
cpu_num:
8
在master端设置Grains静态数据,原理会将此数据添加到minion服务器的配置文件的/etc/salt/grains
[root@minion ~]# cat /etc/salt/grains
cpu_num: 8
对于复杂的数据结构,可以添加灵活的JSON语法
[root@master ~]# salt 'minion' grains.setval cpu_info '["Intel","Xeon","10"]'
minion:
----------
cpu_info:
- Intel
- Xeon
- 10
[root@master ~]# salt 'minion' grains.item cpu_info
minion:
----------
cpu_info:
- Intel
- Xeon
- 10
此时可以检查minion服务器上的grains文件
[root@minion ~]# cat /etc/salt/grains
cpu_info:
- Intel
- Xeon
- '10'
cpu_num: 8
因此Grains数据写入配置文件后,重启salt-minion服务,数据也不会丢失
#想要删除可以通过grains.delval命令删除,或者去minion的配置文件删除配置一样完成操作(或者删除文件)
方法一:清空值
[root@master ~]# salt 'minion' grains.delval cpu_info
minion:
None
[root@master ~]# salt 'minion' grains.delval cpu_num
minion:
None
方法二:删除minion的grains配置文件,重启服务
[root@minion ~]# rm -rf /etc/salt/grains
[root@minion ~]# systemctl restart salt-minion
检查结果删除成功
#############################################################
Pillar也是saltstack组件中非常重要的组件之一,称作数据管理中心,经常配合states在大规模的配置管理中使用。
Pillar是动态的,存储在master端,提供和给minion端
Pillar在SaltStack中主要的作用是存储和定义配置管理中需要的一些数据,比如软件版本号,用户账号密码等,保证敏感数据不被其他minion看到
存储格式与Grains类似,都是YAML格式
在master配置文件中有一段Pillar settings选项专门定义Pillar的参数
cat /etc/salt/master
此配置代表pillar的工作根目录,在/srv/pillar下,然后可以新建sls文件
#pillar_roots:
# base:
# - /srv/pillar
默认pillar的工作目录在/srv/pillar目录下,执行如下代码
[root@master ~]# mkdir -p /srv/pillar
指定环境,标记,引用packages.sls和services.sls
[root@master ~]# vim /srv/pillar/top.sls
base:
'*':
- packages
- services
[root@master ~]# vim /srv/pillar/packages.sls
nginx:
packages-name: nginx
version: 1.12.2
[root@master ~]# vim /srv/pillar/services.sls
nginx:
port: 80
user: root
检查我们设置的pillar值
[root@master ~]# salt '*' pillar.item nginx
master:
----------
nginx:
----------
packages-name:
nginx
port:
80
user:
root
version:
1.12.2
minion:
----------
nginx:
----------
packages-name:
nginx
port:
80
user:
root
version:
1.12.2
pillar与Grains对比:
类型 | 数据采集方式 | 应用场景 | 定义位置 |
---|---|---|---|
Grains | 静态 | minion启动时收集 数据查询 目标选择 配置管理 | minion |
Pillar | 动态 | master进行自定义 目标选择 配置管理 敏感数据 | master |