saltstack介绍

1、 saltstack是使用python语言开发的;
2、 轻量级的管理工具,批量执行命令;
3、常用模块:pkg(包)、file(文件)、cmd(执行命令或脚本)、user、 service、cron
4、saltstack数据系统
Grains (静态数据)
pillar (动态数据)

saltstack三大功能,远程执行,配置管理,云管理

SaltStack是一个服务器基础架构集中化管理平台,具备配置管理、远程执行、监控等功能,基于Python语言实现,结合轻量级消息队列(ZeroMQ)与Python第三方模块(Pyzmq、PyCrypto、Pyjinjia2、python-msgpack和PyYAML等)构建。

通过部署SaltStack,我们可以在成千万台服务器上做到批量执行命令,根据不同业务进行配置集中化管理、分发文件、采集服务器数据、操作系统基础及软件包管理等,SaltStack是运维人员提高工作效率、规范业务配置与操作的利器。

saltstack基本原理

SaltStack 采用 C/S模式,server端就是salt的master,client端就是minion,minion与master之间通过ZeroMQ消息队列通信

minion上线后先与master端联系,把自己的pub key发过去,这时master端通过salt-key -L命令就会看到minion的key,接受该minion-key后,也就是master与minion已经互信

master可以发送任何指令让minion执行了,salt有很多可执行模块,比如说cmd模块,在安装minion的时候已经自带了,它们通常位于你的python库中,locate salt | grep /usr/可以看到salt自带的所有东西。

这些模块是python写成的文件,里面会有好多函数,如cmd.run,当我们执行salt '*' cmd.run 'uptime'的时候,master下发任务匹配到的minion上去,minion执行模块函数,并返回结果。master监听4505和4506端口,4505对应的是ZMQ的PUB system,用来发送消息,4506对应的是REP system是来接受消息的。

具体步骤如下

Salt stack的Master与Minion之间通过ZeroMq进行消息传递,使用了ZeroMq的发布-订阅模式,连接方式包括tcp,ipc
salt命令,将cmd.run ls命令从salt.client.LocalClient.cmd_cli发布到master,获取一个Jodid,根据jobid获取命令执行结果。
master接收到命令后,将要执行的命令发送给客户端minion。
minion从消息总线上接收到要处理的命令,交给minion._handle_aes处理
minion._handle_aes发起一个本地线程调用cmdmod执行ls命令。线程执行完ls后,调用minion._return_pub方法,将执行结果通过消息总线返回给master
master接收到客户端返回的结果,调用master._handle_aes方法,将结果写的文件中
salt.client.LocalClient.cmd_cli通过轮询获取Job执行结果,将结果输出到终端。

saltstack详解+部署apache服务

优点:

首先,他速度快,基于消息队列+线程,跑完多台设备,都是毫秒级别的
其次,非常灵活,源码是python,方便理解和自定义模块(python 语言相对于其他的perl、ruby等还是很好理解的)
命令简单,功能强大

缺点:部署minion端较为不便

saltstack几个重要的组件
grains grains 是在 minion(客户端)启动时收集到的一些信息,比如操作系统类型、网卡ip等静态信息。
grains的信息并不是动态的,并不会时时变更,它只是在 minion 启动时收集到的

pillar pillar 和 grains 不一样,是在 master 上定义的,并且是针对 minion 定义的一些信息。像一些比较重要的数据(密码)可以存在 pillar 里,还可以定义变量等。

State
他是saltstack的最核心功能,通过预先指定好的sls文件对被控主机进行管理:包/文件/网络配置/系统服务/系统用户等。

Saltstack 批量部署apache

实验环境:
master:192.168.136.167
web01:192.168.136.168
web02:192.168.136.185

#添加主机名,三台机器都要添加,并且主机要改成相应的名称
[root@master ~]# vim /etc/hosts
192.168.136.167 master.saltstack.com
192.168.136.168 web01.saltstack.com
192.168.136.185 web02.saltstack.com

#每台都需要关闭防火墙
[root@master ~]# vim /etc/hostname 
master.saltstack.com

[root@web01 ~]# vim /etc/hostname 
web01.saltstack.com

[root@web02 ~]# vim /etc/hostname 
web02.saltstack.com

#安装epel源(三台都要装)
[root@master ~]# yum install -y epel-release
[root@master ~]# yum -y install salt-master

[root@master ~]# vim /etc/salt/master 
15行 interface: 192.168.175.132   //监听地址
215行 auto_accept: True        //避免要运行salt-key来确认证书认证
416行 file_roots:
base:
- /srv/salt           //saltstack文件根目录位置,目录需要创建
710行组分类:
nodegroups:
group1: 'web01.saltstack.com'
group2: 'web02.saltstack.com'

552行 pillar_opts: True        //开启pillar功能,同步文件功能
529行 
pillar_roots:
base:
- /srv/pillar         //pillar的主目录,需要创建

创建salt与pillar文件根目录:
mkdir /srv/salt
mkdir /srv/pillar

启动服务器:
systemctl start salt-master
systemctl enable salt-master

netstat -anpt | egrep '4505|4506'

创建salt与pillar文件根目录:
mkdir /srv/salt
mkdir /srv/pillar

--------------------以下在被控端上操作-------------------

在两台上分别配置:
yum -y install salt-minion

vi /etc/salt/minion
修改配置如下:
16行 master: 192.168.175.132     //指定主控端IP
78行 id: web01.saltstack.com     //指定被控端主机名

启动被控端服务
systemctl start salt-minion

在主控端测试与被控端的通信状态!
salt '*' test.ping

web01.saltstack.com:
True
web02.saltstack.com:
True

salt '*' cmd.run 'df -h'   //远程执行命令

salt-key   //查看在 master 上已经被接受过的客户端

查看被控主机上grains所有值:(每次minion在启动是都会获取客户端信息)
salt 'web01.saltstack.com' grains.items (静态数据)
salt 'web01.saltstack.com' pillar.items  (动态数据)

配置管理安装Apache
下面进行的演示是远程通过 yum 方式安装 Apache。步骤如下:
修改配置文件
vi /etc/salt/master     // 打开如下内容的注释
file_roots:
base:
- /srv/salt/
注意:环境: base、dev(开发环境)、test(测试环境)、prod(生产环境)。

mkdir /srv/salt
vi /srv/salt/top.sls
base:
'*':
- apache
注意:'*',则表示在所有的客户端执行 apache 模块。

vi /srv/salt/apache.sls
apache-service:
pkg.installed:
- names:                // 如果只有一个服务,那么就可以写成 –name: httpd 不用再换一行
- httpd
- httpd-devel
service.running:
- name: httpd
- enable: True
注意:apache-service 是自定义的 id 名。pkg.installed 为包安装函数,下面是要安装的包的名字。service.running 也是一个函数,来保证指定的服务启动,enable 表示开机启动。

重启服务
#systemctl restart salt-master
执行命令
#salt '*' state.highstate