简介

Puppet也许是四款工具中最深入人心的。就可用操作、模块和用户界面而言,它是最全面的。Puppet呈现了数据中心协调的全貌,几乎涵盖每一个运行系统,为各大操作系统提供了深入的工具。初始设置比较简单,只需要在需要加以管理的每个系统上安装主服务器和客户端代理软件。命令行接口(CLI)简单直观,允许通过puppet命令下载和安装模块。然后,需要对配置文件进行更改,好让模块适合所需的任务;应接到指令的客户端与主服务器联系时,会更改配置文件,或者客户端通过立即触发更改配置文件的推送(push)来进行更改。

Ansible关注的重点是力求精简和快速,而且不需要在节点上安装代理软件。因此,Ansible通过SSH执行所有功能。需要管理的节点被添加到Ansible配置环境,SSH授权密钥被附加到每个节点上,这与运行Ansible的用户有关。一旦完成了这步,Ansible主服务器可以通过SSH与节点进行通信,执行所有必要的任务。Ansible可以使用Paramiko(基于SSH2协议的Python实现)或标准SSH用于通信,不过还有一种加速模式,允许更快速、更大规模的通信。

Salt类似Ansible,因为它也是基于CLI的工具,采用了推送方法实现客户端通信。它可以通过Git或通过程序包管理系统安装到主服务器和客户端上。客户端会向主服务器提出请求,请求在主服务器上得到接受后,就可以控制该客户端了。Salt可以通过普通的SSH与客户端进行通信,但如果使用名为minion的客户端代理软件,可以大大增强可扩展性。此外,Salt含有一个异步文件服务器,可以为客户端加快文件服务速度,这完全是Salt注重高扩展性的一个体现。与Ansible一样,你可以直接通过CLI,向客户端发出命令,比如启动服务或安装程序包;你也可以使用名为state的YAML配置文件,处理比较复杂的任务。还有“pillar”,这些是放在集中地方的数据集,YAML配置文件可以在运行期间访问它们。

总结:个人观点puppet最大缺点就是默认情况下Agent每隔30分钟向master同步状态,master主动推送功能比较薄弱(2.7版本),ansible基于SSH服务执行,如果服务器过多不建议使用,他是使用轮训的方式。Salt基于消息队列。性能相当好,适合大量生产环境。

SaltStack简介与特性
SaltStack 是一种基于 C/S 架构的服务器基础架构集中化管理平台,管理端称为 Master,客户端称为 Minion。SaltStack 具备配置管理、远程执行、监控等功能,一般可以理解为是简化版的 Puppet 和加强版的 Func。SaltStack 本身是基于 Python 语言开发实现,结合了轻量级的消息队列软件 ZeroMQ 与 Python 第三方模块(Pyzmq、PyCrypto、Pyjinjia2、python-msgpack 和 PyYAML 等)构建。

通过部署 SaltStack 环境,运维人员可以在成千上万台服务器上做到批量执行命令,根据不同的业务特性进行配置集中化管理、分发文件、采集系统数据及软件包的安装与管理等。

SaltStack 具有以下特性

  • 1、部署简单、方便;
  • 2、支持大部分UNIX/Linux及Windows环境;
  • 3、主从集中化管理;
  • 4、配置简单、功能强大、扩展性强;
  • 5、主控端(master)和被控端(minion)基于证书认证,安全可靠。
  • 6、支持API及自定义模块,可通过Python轻松扩展。

SaltStack 的工作原理
SaltStack 采用 C/S 结构来对云环境内的服务器操作管理及配置管理。为了更好的理解它的工作方式及管理模型,将通过图形方式对其原理进行阐述。

SaltStack 客户端(Minion)在启动时,会自动生成一套密钥,包含私钥和公钥。之后将公钥发送给服务器端,服务器端验证并接受公钥,以此来建立可靠且加密的通信连接。同时通过消息队列 ZeroMQ 在客户端与服务端之间建立消息发布连接。具体通信原理图,如图 1 所示,命令执行如图 2 所示:
mark

专业术语说明

Minion :是 SaltStack 需要管理的客户端安装组件,会主动去连接 Master 端,并从 Master 端得到资源状态信息,同步资源管理信息。
Master :作为控制中心运行在主机服务器上,负责 Salt 命令运行和资源状态的管理。
ZeroMQ :是一款开源的消息队列软件,用于在 Minion 端与 Master 端建立系统通信桥梁。
Daemon :是运行于每一个成员内的守护进程,承担着发布消息及通信端口监听的功能。

mark

原理图说明:

Minion :是 SaltStack 需要管理的客户端安装组件,会主动去连接 Master 端,并从 Master 端得到资源状态信息,同步资源管理信息。
Master :作为控制中心运行在主机服务器上,负责 Salt 命令运行和资源状态的管理。
Master :上执行某条指令通过队列下发到各个 Minions 去执行,并返回结果。

SaltStack 的架构设计
为了让大家更好的理解 SaltStack 集中化管理方面的优势,因此,根据项目的实际情况绘制了部署架构图,并在文中对架构图进行了详细说明。如图 3 所示:

mark

说明
SaltStack 的所有被管理客户端节点(如图 3 所示 DB 和 Web),都是通过密钥进行加密通信,使用端口为 4506。客户端与服务器端的内容传输,是通过消息队列完成,使用端口为 4505。Master 可以发送任何指令让 Minion 执行,salt 有很多可执行模块,比如说 CMD 模块,在安装 minion 的时候已经自带了,它们通常位于你的 python 库中,locate salt | grep /usr/ 可以看到 salt 自带的所有东西。

为了更好的理解架构用意,以下将展示主要的命令发布过程:

SaltStack 的 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数据系统区别介绍

|--|--|--|--|--|
|名称|存储位置|数据类型|数据采集更新方式|应用|
|Grains|minion端|静态数据|minion启动时收集,也可以使用saltutil.sync_grains进行刷新。|存储minion基本数据,比如用于匹配minion,自身数据可以用来做资产管理等。|
|Pillar|master端|动态数据|在master端定义,指定给对应的minion,可以使用saltutil.refresh_pillar刷新|存储Master指定的数据,只有指定的minion可以看到,用于敏感数据保存。|


安装、配置

saltstack 是使用python2的语言编写,对python3的兼容性不好,请使用python2的环境。

# 服务端
yum install epel-release
yum -y install salt-master


####################################################################
# 客户端
yum install epel-release
yum -y install salt-minion

# 配置master
vim /etc/salt/master

# salt运行的用户,影响到salt的执行权限
user: root

#salt的运行线程,开的线程越多一般处理的速度越快,不要超过CPU的个数
worker_threads: 10

# master的管理端口
publish_port : 4505

# master跟minion的通讯端口,用于文件服务,认证,接受返回结果等
ret_port : 4506

# 如果这个master运行的salt-syndic连接到了一个更高层级的master,那么这个参数需要配置成连接到的这个高层级master的监听端口
syndic_master_port : 4506

# 指定pid文件位置
pidfile: /var/run/salt-master.pid

# saltstack 可以控制的文件系统的开始位置
root_dir: /

# 日志文件地址
log_file: /var/log/salt_master.log

# 分组设置(注意第一行前面不能有空格)
nodegroups:
   group_all: '*'

# salt state执行时候的根目录(注意第一行前面不能有空格)
file_roots:
    base:
        - /etc/salt/file

# 设置pillar 的根目录(注意第一行前面不能有空格)
pillar_roots:
    base:
        - /etc/salt/pillar

# 启动master(先启动master,再启动minion)
systemctl start salt-master
systemctl enable salt-master
systemctl status salt-master
firewall-cmd --zone=public --add-port=4505/tcp --permanent
firewall-cmd --zone=public --add-port=4506/tcp --permanent
firewall-cmd --reload

####################################################################
# 配置minion
vim /etc/salt/minion
# 修改以下两个值就可以使用了,如果在/etc/hosts文件中定义了主机名,也可以直接写主机名。
# 注意“:”后面有空格。
# 指定master地址
master: 192.168.10.35

# 节点名
id: node001

# salt运行的用户权限
user: root

# 以下配置可以不用设置
# master通讯端口
master_port: 4506

# 备份模式,minion是本地备份,当进行文件管理时的文件备份模式
backup_mode: minion

# 执行salt-call时候的输出方式
output: nested

# minion等待master接受认证的时间
acceptance_wait_time: 10

# 失败重连次数,0表示无限次,非零会不断尝试到设置值后停止尝试
acceptance_wait_time_max: 0

# 重新认证延迟时间,可以避免因为master的key改变导致minion需要重新认证的syn风暴
random_reauth_delay: 60

# 日志文件位置
log_file: /var/logs/salt_minion.log

# 文件路径基本位置
file_roots:
  base:
    - /etc/salt/minion/file

# pillar基本位置
pillar_roots:
  base:
    - /data/salt/minion/pillar


# 启动salt(minion启动后会立即请求连接master)
systemctl start salt-minion
systemctl enable salt-minion
systemctl status salt-minion

认证命令

salt-key -L       #查看所有minion-key    
salt-key -a       #接受某个minion-key    
salt-key -A       #接受所有minion-key
salt-key -d       #删除某个minion-key
salt-key -D       #删除所有minion-key

mark

常用命令

命令格式:salt [options] [arguments]
minion匹配方式
1、 Glob(salt默认的target类型,使用shell的通配符来指定一个或多个Minion ID)

salt \* test.ping
或
salt "*" test.ping
或
salt '*' test.ping

2、pcre兼容正则表达式

salt -E '^[m|M]in.[e|o|u]n$' test.ping

3、Subnet(通过指定一个IPv4地址或一个CIDR的IPv4子网)

salt -s 192.168.0.42 test.ping
salt -s 192.168.0.0/16 test.ping

4、Grains(salt可以通过操作系统、CPU架构及自定义信息等机器特征进行target Minion)

salt -G 'os:Ubuntu' test.ping
salt -G 'os_family:Debian' test.ping

5、pillar(salt支持通过pillar数据进行匹配)

salt -I 'my_val:my_val' test.ping

6、混合(compound)

salt -C 'web* or G@os:Arch' test.ping

7、节点组(Nodegroup)

# 节点组需要事先定义,配置方法如下:
vim /etc/salt/master
# node前面两个空格,后面的值可以是ip,域,主机名等。
nodegroups:
  node: 'L@node01-34,node02-38'

salt -N node test.ping
# status模块(查看系统信息)
salt "*" status.loadavg       #查看负载信息
salt "*" status.cpuinfo       #查看CPU信息
salt "*" status.diskstats     #查看磁盘信息
salt "*" status.meminfo       #查看内存信息
salt "*" status.w             #w命令返回信息
salt '*' test.ping            #查看主机连通性

# 获取节点所有信息
salt 'node01-34(节点名)' grains.items

# 安装软件
salt [节点名或"*"全部节点] pkg.install htop

# 执行命令cmd.run(不用""可以用\转义*号)
salt "*" cmd.run "cat /etc/passwd|tail -n 10"
salt \* cmd.run "ifconfig"
salt '*' cmd.run 'uptime'

# 查看所有module列表
格式:salt [节点名] sys.list_modules
salt node02-38 sys.list_modules

# 查看指定module的所有function方法
格式:salt [节点名] sys.list_modules [模块名]
salt node02-38 sys.list_modules cmd

# 查看所有执行模块的doc
salt [节点名] sys.doc

# 查看test模块的帮助
salt [节点名] sys.doc test  

# 查看test.ping函数的帮助
salt [节点名] sys.doc test.ping

salt-run

salt-run [options] [runner.func]

#例如
salt-run manage.status   ##查看所有minion状态
salt-run manage.down     ##查看所有没在线minion
salt-run manged.up       ##查看所有在线minion

SaltStack也和Ansible一样可以使用yaml格式的文件进行批量操作。


参考:
http://blog.51cto.com/lwm666/2068833
http://www.it165.net/os/html/201406/8507.html
http://www.it165.net/os/html/201406/8508.html
http://www.it165.net/os/html/201406/8509.html
https://www.jianshu.com/p/624b9cf51c64

文章作者: Leo
本文链接:
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 LeoLan的小站
系统管理 自动化运维 SaltStack
喜欢就支持一下吧