一. SaltStack简介
Salt,一种全新的基础设施管理方式,部署轻松,在几分钟内可运行起来,扩展性好,很容易管理上万台服务器,速度够快,服务器之间秒级通讯。
SaltStack是使用Python语言开发,支持Rest API
官方网站:http://www.saltstack.com
官方文档:http://docs.saltstack.com
二. SaltStack运行方式
1. local
2. Minion/Master
3. Syndic
4. Salt SSH
三. SaltStack三大功能
- 远程执行
- 配置管理
- 云管理
四. SaltStack安装和配置
官方存储库:
https://repo.saltstack.com/
提供了各种系统的安装部署方式
4.1 环境
节点名称 主机名 IP地址 系统环境
node1 master-node1 192.168.3.100 CentOS7.7
node2 minion-node2 192.168.3.101 CentOS7.7
4.1.2 安装存储库和密匙
node1节点和node2节点
sudo yum install https://repo.saltstack.com/yum/redhat/salt‐repo‐latest.el7.noarch.rpm
4.1.3 安装slat服务
node1节点
yum install salt‐master salt‐minion
node2节点
yum install salt‐minion
4.2 配置
salt配置文件都存放在/etc/salt中。
master相应的组件在/etc/salt/master中。
minion相应的组件在/etc/salt/minion中。
4.2.1 master配置
默认情况下,Salt主服务器侦听所有接口(0.0.0.0)上的端口4505和4506。要将Salt绑定到特定IP,在主配置文件(通常是)中重新定义" interface"指令 /etc/salt/master,如下所示:
- #interface: 0.0.0.0
+ interface: 192.168.3.100
- 4505(publish_port)端口:salt的消息发布端口
- 4506(ret_port)端口:salt 客户端与服务端通信的端口
4.2.2 minion配置
默认情况下,Salt Minion将尝试连接到DNS名称"salt";如果Minion能够正确解析该名称,则无需进行配置。 如果DNS名称"salt"不能解析为指向Master的正确位置,在minion配置文件中重新定义"master"指令,通常/etc/salt/minion如下所示:
- #master: salt
+ master: 192.168.3.100
- master最佳选择是配置成主机名,前提是内网有可以解析主机名的DNS
4.2.3 minion id配置
每个minion都需要一个唯一的标识符。默认情况下,它会选择fqdn作为该标识符。可以通过minion配置文件(/etc/salt/minion)中的id指令配置设置覆盖minion id。
注意:如果id已经配置好不建议更改,因为更改会有很多问题。如果非要更改,应先删除minion_id文件,这是因为minion服务启动会先读取minion_id文件内容,如果不删掉此文件,不管怎么更改配置文件都不会生效
我选择不配置id指令,两个节点的minion id为master-node1和minion-node2
[root@master-node1 ~]# hostname
master-node1
[root@minion-node2 ~]# hostname
minion-node2
4.3 启动
node1节点
systemctl start salt-master
systemctl start salt-minion
node2节点
systemctl start salt-minion
4.4 检查
[root@master-node1 ~]# salt-key
Accepted Keys:
Denied Keys:
Unaccepted Keys:
master-node1
minion-node2
Rejected Keys:
- node1节点minion id和node2节点的minion id都处于未认证状态,可知已经Salt安装成功。
- 这里的master-node1和minion-node2都是Minion_id
- minion id可以在/etc/salt/minion_id文件中查看,minion_id文件是minion启动后生成的
5. salt认证
在初始密钥交换之前,Salt提供了一些命令来验证Salt Master和Salt Minions的身份。验证密钥身份有助于避免无意中连接到错误的Salt主设备,并有助于防止在建立初始连接时潜在的MiTM攻击。
PKI_DIR是存储pki身份验证密钥的目录。该指令存在于master和minion的配置文件中,默认情况下是/etc/salt/pki/(master或minion)。该目录在第一次启动时会自动生成,里面存放在认证所需的密匙。
[root@master-node1 ~]# tree /etc/salt/pki/
/etc/salt/pki/
├── master
│ ├── master.pem
│ ├── master.pub
│ ├── minions
│ ├── minions_autosign
│ ├── minions_denied
│ ├── minions_pre
│ │ ├── master-node1
│ │ └── minion-node2
│ └── minions_rejected
└── minion
├── minion.pem
└── minion.pub
7 directories, 6 files
上面代码块中是node1节点的/etc/salt/pki/目录,之所以选择node1节点执行展示,因为该节点上既有master又有minion:
5.1 身份认证
salt master上执行,如下命令打印密匙:
salt‐key ‐F master
salt minion上执行,如下命令打印密匙:
salt‐call ‐‐local key.finger
将此值(salt-call --local key.finger)与在Salt master上运行命令时显示的值进行比较
[root@master-node1 ~]# salt-key -F master
Local Keys:
master.pem: 2b:01:e4:fd:96:d0:56:19:e5:60:8d:e6:77:a8:1a:02:d9:ac:f3:c5:6b:63:4d:5c:3e:0a:c2:47:bd:87:ec:28
master.pub: a8:44:84:a7:af:43:75:4f:c1:a9:3c:95:29:f5:fc:fb:1b:00:a3:5d:30:73:81:3a:46:4a:1f:62:45:8a:48:73
Unaccepted Keys:
master-node1: 67:b9:73:8e:9a:cc:7c:26:51:a7:6c:24:bc:b3:90:21:05:c5:2f:2c:57:2a:9b:72:73:b0:5e:a0:e3:81:92:38
minion-node2: ae:99:70:63:5c:e2:85:5e:b8:c1:a6:07:a7:8f:97:bb:e1:43:2e:67:b1:99:5e:8a:56:9c:b9:54:aa:a4:68:cd
[root@master-node1 ~]# salt-call --local key.finger
local:
67:b9:73:8e:9a:cc:7c:26:51:a7:6c:24:bc:b3:90:21:05:c5:2f:2c:57:2a:9b:72:73:b0:5e:a0:e3:81:92:38
[root@minion-node2 ~]# salt-call --local key.finger
local:
ae:99:70:63:5c:e2:85:5e:b8:c1:a6:07:a7:8f:97:bb:e1:43:2e:67:b1:99:5e:8a:56:9c:b9:54:aa:a4:68:cd
5.2 认证原理
1. minion将自己的公钥发送给master
2. master认证后再将自己的公钥发送给minion端
5.3 开始认证
Salt使用Master和Minion之间的所有通信进行AES加密。这样可以确保发送到Minions的命令不会被篡改,并且Master和Minion之间的通信是通过受信任的,可接受的密钥进行身份验证的。
[root@master-node1 ~]# salt-key
Accepted Keys:
Denied Keys:
Unaccepted Keys:
master-node1
minion-node2
Rejected Keys:
- Salt-key对用于身份验证的Salt服务器公共密钥执行简单的管理。
- 执行salt-key命令会列出Salt Master已知的键
- 从上面代码块中可以看出Master识别出两个Minion,但是没有一个被Master接受。Minion要想Master接受并控制,需要执行特定的命令
下面代码块中是salt-key常用参数
[root@salt-master ~]# salt-key
Accepted Keys: #已经接受的key
Denied Keys: #拒绝的key
Unaccepted Keys: #未加入的key
Rejected Keys: #吊销的key
#常用参数
-L # 查看KEY状态
-a # 认证指定的key
-A # 允许所有
-d # 删除指定的key
-D # 删除所有
-r # 注销掉指定key(该状态为未被认证)
我想控制所有主机,我的命令为:
[root@master-node1 ~]# salt-key -A
The following keys are going to be accepted:
Unaccepted Keys:
master-node1
minion-node2
Proceed? [n/Y] y
Key for minion master-node1 accepted.
Key for minion minion-node2 accepted.
到这里认证已经完成了。根据原理Master和Minion的公匙已经发送给了对方,使用tree看一下PKI_DIR是否有变化
[root@master-node1 ~]# tree /etc/salt/pki/
/etc/salt/pki/
├── master
│ ├── master.pem
│ ├── master.pub
│ ├── minions
│ │ ├── master-node1
│ │ └── minion-node2
│ ├── minions_autosign
│ ├── minions_denied
│ ├── minions_pre
│ └── minions_rejected
└── minion
├── minion_master.pub
├── minion.pem
└── minion.pub
7 directories, 7 files
[root@minion-node2 ~]# tree /etc/salt/pki/
/etc/salt/pki/
├── master
└── minion
├── minion_master.pub
├── minion.pem
└── minion.pub
2 directories, 3 files
根据上面代码块中的信息可以看出,Master认证了minion,而Minion中多出了master公匙
5.4 验证
在Master发送命令来验证Mater与Minion之间的通信
salt minion_id cmd.run "w" # 单个Minion执行w命令
salt "*" cmd.run "w" # 所有Minion执行w命令
[root@master-node1 ~]# salt master-node1 cmd.run "w"
master-node1:
00:49:54 up 13:04, 1 user, load average: 0.00, 0.02, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/1 192.168.3.2 23:10 2.00s 0.50s 0.42s /usr/bin/python /usr/bin/salt master-node1 cmd.run w
[root@master-node1 ~]# salt minion-node2 cmd.run "w"
minion-node2:
08:50:05 up 1:26, 1 user, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.3.2 07:23 11:09 0.06s 0.06s -bash
[root@master-node1 ~]# salt "*" cmd.run "w"
minion-node2:
08:50:14 up 1:26, 1 user, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.3.2 07:23 11:18 0.06s 0.06s -bash
master-node1:
00:50:14 up 13:05, 1 user, load average: 0.15, 0.05, 0.06
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/1 192.168.3.2 23:10 6.00s 0.51s 0.43s /usr/bin/python /usr/bin/salt * cmd.run w