1. SaltStack简介

       Salt,一种全新的基础设施管理方式,部署轻松,在几分钟内可运行起来,扩展性好,很容易管理上万台服务器,速度够快,服务器之间秒级通讯。

       SaltStack是使用Python语言开发,支持Rest API

2. SaltStack运行方式

  1. local
  2. Minion/Master
  3. Syndic
  4. Salt SSH

3. SaltStack三大功能

  • 远程执行
  • 配置管理
  • 云管理

4. SaltStack安装和配置

       Salt官方存储库提供了大多数系统版本的安装方式,我们只需要保证在专用的服务器上安装Salt Master,在Salt管理的每个系统上安装Salt Minion

4.1 安装

       Salt时Python编写的,在安装时要注意Python版本和系统版本。不建议使用源码包安装,依赖太多。若服务器网络环境受限,不能连接互联网时,可以在上网机使用reposync同步镜像源库到本地,然后搭建局域网(包括本地)YUM源就可以使用YUM安装Salt了。

       下面代码块中是Salt依赖关系。只要满足依赖关系,Salt就可以在任何类Unix平台上运行。

- Python - Python2 >= 2.7, Python3 >= 3.4
- msgpack-python - High-performance message interchange format
- YAML - Python YAML bindings
- Jinja2 - parsing Salt States (configurable in the master settings)
- MarkupSafe - Implements a XML/HTML/XHTML Markup safe string for Python
- apache-libcloud - Python lib for interacting with many of the popular cloud service providers using a unified API
- Requests - HTTP library
- Tornado - Web framework and asynchronous networking library
- futures - Python2 only dependency. Backport of the concurrent.futures package from Python 3.2
- ZeroMQ:
     - ZeroMQ >= 3.2.0
     - pyzmq >= 2.2.0 - ZeroMQ Python bindings
     - PyCrypto - The Python cryptography toolkit

       更多的信息可以在Salt官方安装文档中找到

4.1.1 环境

节点名称

主机名

IP地址

系统环境

Python版本

node1

master-node1

192.168.3.100

CentOS7.7

Python 2.7.5

node2

minion-node2

192.168.3.101

CentOS7.7

Python 2.7.5

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中,并以相应的组件/etc/salt/master和/etc/salt/minion命名

4.2.1 master配置

       默认情况下,Salt Master侦听所有接口(0.0.0.0)上的端口4505和4506。要将Salt绑定到特定IP,在Master配置文件(/etc/salt/master)中重新定义“ interface”指令,如下所示:

- #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配置文件(/etc/salt/minion)中重新定义“ master”指令,如下所示:

- #master: salt
+ master: 192.168.3.100
  • master最佳选择是配置成主机名,前提是内网有可以解析主机名的DNS

4.2.3 Minion ID配置

       每个Minion都需要一个唯一的标识符。默认情况下,在第一次启动时,它会选择FQDN作为该标识符。可以通过Minion配置文件(/etc/salt/minion)中的"id"指令覆盖Minion ID。

       Minion ID存在于/etc/salt/minion_id文件内,该文件是第一次启动时自动生成。

注意:

  • 如果id已经配置好不建议更改,因为更改会有很多问题,比如后面认证时所需的公共/私有密钥,就是根据Minion ID生成。如果它发生了改变,Master必须重新接受Minion认证,就像一个新的机器一样。
  • 若非要更改Minion ID应先删除minion_id文件(/etc/salt/minion_id),这是因为minion服务启动会先读取minion_id文件内容,如果不删掉此文件,不管怎么更改配置文件都不会生效

       我选择不配置id指令,使用默认的FQDN作为标识符

[root@master-node1 ~]# hostname
master-node1
[root@minion-node2 ~]# hostname
minion-node2

4.3.4 防火墙配置

firewall-cmd --permanent --zone=<zone> --add-port=4505-4506/tcp

根据你的设置选择所需的区域。进行更改后,重新加载

firewall-cmd --reload

4.3 启动

node1节点

systemctl start salt-master
systemctl start salt-minion

node2节点

systemctl start salt-minion

4.4 检查

在node1节点上使用tree命令查看/etc/salt/pki目录

[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
  • PKI_DIR是存储pki身份验证密钥的目录。该指令存在于master/minion的配置文件中,默认情况下是/etc/salt/pki/(master或minion)。该目录在第一次启动时会自动生成,里面存放在认证所需的密匙。
  • minions_pre目录中存放着刚启动的Minion的Minion ID,它们待在被Master接受

5. salt认证

5.1 认证原理

  1. Minion将自己的公钥发送给Master
  2. Master认证后再将自己的公钥发送给Minion端

5.1 身份认证

       在初始密钥交换之前,Salt提供了一些命令来验证Salt Master和Salt Minions的身份。验证密钥身份有助于避免无意中连接到错误的Salt主设备,并有助于防止在建立初始连接时潜在的MiTM攻击。

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.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