Saltstack 介绍
一、SaltStack是什么
SaltStack是一个配置管理系统,能够维护预定义状态的远程节点
SaltStack是一个分布式远程执行系统,用来在远程节点上执行命令和查询数据
二、saltstack说明
-
salt是一个异构平台基础设置管理工具(虽然我们通常只用在Linux上),使用轻量级的通讯器ZMQ
-
用Python写成的批量管理工具,完全开源,遵守Apache2协议,与Puppet,Chef功能类似,有一个强大的远程执行命令引擎
-
也有一个强大的配置管理系统,通常叫做Salt State System。
-
主要作用: 远程执行、配置管理、事件驱动
a. 远程执行: 及支持 使用agent 支持 使用ssh远程执行
b. 配置管理: 如果用salt描述nginx,没有就会帮你安装,如果nginx配置不对就会帮你改对(保证机器状态和你描述一致)
-
特点:即可支持 agent 方式,也支持 ssh方式
三、SaltStack的服务架构
-
Master:负责管理所有节点
-
Minion:(相当于客户端)节点服务
-
ZeroMQ:通信服务
-
AES:数据加密方法
四、基本原理
-
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库中
五、SaltStack的优缺点
-
SaltStack特点:
1. 简单(相对于Puppet) 2. 并行执行 3. 基于成熟的技术(ZeroMQ(通信),AES(数据加密)) 4. Python API 5. 灵活,开放
-
SaltStack的缺点:
1. 需要单独安装客户端 2. 安全隐患大
六、了解ZeroMQ
ZeroMQ以嵌入式网络编程库的形式实现了一个并行开发框架,能够提供进程内,进程间,网络和广播方式的消息信道,并支持扇出、发布—订阅,任务分发、请求/响应等通信模式。
saltstack具体步骤如下
-
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认证原理
- salt-master和salt-minion第一次启动时会在 /etc/salt/pki/master目录下生成公钥和私钥用于身份验证
[root@linux-node1 master]# cd /etc/salt/pki/master
[root@linux-node1 master]# ll -lh
-r-------- 1 root root 1.7K Jan 7 05:36 master.pem
-rw-r--r-- 1 root root 450 Jan 7 05:36 master.pub
-
所有未认证minion的私钥都会放到master的 /etc/salt/pki/master/minions_pre/ 文件夹下
-
当minion通过认证后就会放到 /etc/salt/pki/master/minions 文件夹下
-
master通过在认证的同时会把自己的公钥发送给minion, minion会放到 /etc/salt/pki/minion/minion_master.pub
-
这样就实现了双向密钥交换
开工
我们接下来用两台服务器简单的来测试一下
一、环境部署好
第一台机配置
-
配置网卡
vi /etc/sysconfig/network-scripts/ifcfg-eth0
如果是阿里云这里就不用了
systemctl restart network # 重启网络 systemctl disable firewalld # 关闭防火墙 systemctl disable NetworkManager # 关闭网络管理器
-
设置主机名
# 我们第一台主机 vi /etc/hostname linux-node1.example.com
-
设置主机名解析
vi /etc/hosts 192.168.56.11 linux-node1 linux-node1.example.com # 第一台机器 192.168.56.12 linux-node2 linux-node2.example.com # 第二台机器
-
设置DNS
如果是阿里云,这步也不用弄了
vi /etc/resolv.conf nameserver 192.168.56.2
-
安装最新epel yum源
注:此地址中有各种源(https://opsx.alibaba.com/mirror)
rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
-
yum安装 一些基础包
yum -y install net-tools vim lrzsz tree screen lsof tcpdump nc mtr nmap
-
关闭selinux
vim /etc/selinux/config SELINUX=disabled
-
重启系统
yum update -y && reboot # 升级所有包同时也升级软件和系统内核, 并重启
-
确认是否一些服务是否已按计划关闭
getenforce # selinux是否关闭 firewall-cmd --state # 防火墙是否关闭
第二台机器 按照上面的步骤 配置就ok了,当然 主机名和 IP别写一样的就好
- 如:
vim /etc/hostname # 1、修改主机名 linux-node2.example.com vi /etc/sysconfig/network-scripts/ifcfg-eth0 IPADDR=192.168.56.12
Saltstack 的安装
注:saltstack官方提供了各种版本系统安装方法(地址:http://repo.saltstack.com/#rhel)
-
在linux-node1 中安装saltstack master 和 minion
yum -y install https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm yum -y install salt-master salt-minion /etc/salt/master(master配置文件) /etc/salt/minion(minion配置文件)
-
在linux-node2 中安装saltstack minion
yum -y install https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm
yum -y install salt-minion
/etc/salt/minion(minion配置文件)
-
在linux-node1中配置 salt-minion
vim /etc/salt/minion # master: salt 修改为(master: 192.168.56.11) ----》配置master IP # id: 修改为(id: linux-node1.example.com) ---》告诉master自己是谁,默认会读取当前主机名
注:saltstack是以主机名区分不同 agent 需保证主机名唯一
-
在linux-node2中配置 salt-minion
vim /etc/salt/minion #master: salt 修改为(master: 192.168.56.11) ----》配置master IP #id: 修改为(id: linux-node2.example.com) ---》告诉master自己是谁,默认会读取当前主机名
-
启动linux-node1中salt-maser 和 salt-minion
systemctl start salt-master # 启动salt-master systemctl enable salt-master # 设置salt-master开机自启动 systemctl start salt-minion # 启动 systemctl enable salt-minion # 开机自启动
-
启动linux-node2中salt-minion
systemctl start salt-minion # 启动 systemctl enable salt-minion # 开机自启动
-
认证
salt-key # 在master中查看所有key的状态 salt-key -a linux-node1.example.com # 认证 linux-node1.example.com的key salt-key -A # 一次性认证所有key
-
远程执行测试
salt \* test.ping # 测试saltstack minion与master的连通性 salt \* cmd.run 'df -h' # 在所有minion中批量执行 df -h 命令
如果此时 能看到这两个服务器的名字,就代表完成了。
常用 的命令会在下篇文章介绍