使用 SaltStack 进行集群管理

Saltstack 是一个使用 Python 编写的开源项目 扩展性很好 可以方便快速的管理大量服务器 它使用了 ZeroMQ 消息队列实现服务端之间的秒级通讯

实在是厌倦了对大量服务器日复一日的重复操作。尤其是在虚拟化的时代,系统的每个组件都有很多个相同的节点在运行,更让重复的次数再乘以N。 当我发现Salt的时候,我的眼前一亮:这正是我所需要的东西。

我现在在使用 Saltstack (以下简称salt) 进行我的服务管理 因为我的有些服务并不能 Docker 化而是要统一部署和管理 (比如各个Rancher的Node管理什么的)

概念

salt 在部署上可分为

master
minion
master 负责下发指令和配置文件之类的消息 minion 负责执行命令并返回消息

salt 提供了文件配置和命令行管理两种主机管理方式

salt 在配置文件的储存方式上使用了便于读写的

YAML 主要使用了空格和缩进来表达语义 上手也挺快的 看完 Wikipedia 上的介绍就基本上可以使用 YAML 了

Grains

grains
相当于各个节点独立的配置文件

储存在每个节点的

/etc/salt/grains
当中 使用
YAML
格式储存

Salt 文件系统

Salt 中的文件以

salt://
开头 指 saltstack 主目录(默认为
/srv/salt
可在 master 的设定中更改)的相对路径

安装

Salt Bootstrap

salt官方有提供一个通用的 安装脚本 通常来说 我们只需要

curl -L http://bootstrap.saltstack.org | sudo sh -s -- -M -N  # 仅安装Master
wget -O - http://bootstrap.saltstack.org | sudo sh            # 安装 Minion

包管理安装

salt 在各个 Linux 发行版的软件包管理器中应该都提供了现成的软件包

apt-get install salt-master         # Ubuntu
yum install salt-master             # Centos, require epel

修改配置文件

在 minion 端执行

sed -i 's/#master: salt/master: Master主控IP/g' /etc/salt/minion
systemctl restart salt-minion

接受Key

salt 使用AES加密消息来保障信息传输的安全性 因此 master 首先应该接受 minion 的密匙才能完成配对

salt-key -L

你应该可以看到如下提示消息

Accepted Keys:
Denied Keys:
Unaccepted Keys:
salt-minion-1
Rejected Keys:

使用 以下指令接受

salt-minion-1
的密匙

salt-key -a salt-minion-1

当然 你也可以 用以下指令接受全部的密匙

salt-key -A

开始使用

下发指令

常用指令

测试所有节点的连通性
salt '*' test.ping
删除已离线的 minion
salt-run manage.down removekeys=True
测试网络连通性
salt '*' cmd.run 'ping google.com -c 4'

Minion选择器

在上面的几个常用的指令中 使用了

salt '*'
来选择所有节点 那么 还有没有别的选择方式么 那当然是有的

根据节点ID选择
salt 'salt-minion-1' test.ping
根据 grains 是否存在选择
salt -G 'flag:1' test.ping           # Flag 是一个为 1 的 grains属性

因为 grains 预处理了一些变量 所以我们可以

salt -G 'os:CentOS' test.ping        # 在所有 CentOS 系统的 minion 上执行

常用Execution

官方其实有个 Execution的列表 在这也讲一下常用的几个常用Execution好了

运行命令
salt '*' cmd.run '{command}'        # 替换 Command 为你的命令
服务操作
salt '*' service.status {service}   # 查看服务状态
salt '*' service.restart {service}  # 重启服务
salt '*' service.start {service}    # 启动服务
salt '*' service.stop {service}     # 停止服务
文件分发
salt '*' cp.get_file salt://{file} /to/path/{file}

追加到文件尾

salt '*' file.append /to/file "{data}"

标题:使用 SaltStack 进行集群管理

许可协议:知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

作者: Indexyz