一、SaltStack 安装

SaltStack 是基于 Python 开发的,也是基于 C/S 架构,通过服务端 ( master ) 控制多台客户端 ( minion ) 实现批量操作
这里我们使用 CentOS 7 安装一个服务端 ( 192.168.119.138 ) ,两个客户端 ( 192.168.119.140,192.168.119.142 ) 来进行实验

安装服务端:

[root@localhost ~]$ yum install -y https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm    # 安装 SaltStack yum 源
[root@localhost ~]$ yum install -y salt-master    # 安装 SaltStack 服务端
[root@localhost ~]$ systemctl start salt-master   # 启动 SaltStack 服务端

安装客户端:

[root@localhost ~]$ yum install -y https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm    # 安装 SaltStack yum 源
[root@localhost ~]$ yum install -y salt-minion    # 安装 SaltStack 客户端
[root@localhost ~]$ vim /etc/salt/minion          # 编辑配置文件,指定 SaltStack 服务端地址
master: 192.168.119.138
[root@localhost ~]$ systemctl start salt-minion   # 启动 SaltStack 客户端


 二、SaltStack 配置认证

(1) 上面我们已经安装好了 SaltStack 服务端和客户端,但是服务端和客户端之间相互通信,还需要配置认证,通信过程是通过密钥对来进行加解密的
(2) minion 在第一次启动时,会在 /etc/salt/pki/minion/ 目录下生成密钥对,其中 minion.pem 是私钥,minion.pub 是公钥,会把公钥传给 master
(3) master 接收到 minion 发来的公钥后,我们可以通过 salt-key 命令来查看有哪些 minion 公钥过来进行认证;
(4) 如果我们把该公钥视为可信的,认证通过,那么就会存放在 /etc/salt/pki/master/minions 目录中,然后 master 会把自身的公钥发送给 minion
(5) minion 接收到 master 发来的公钥后,会存储为 /etc/salt/pki/minion/minion_master.pub,实现服务端和客户端之间相互通信

[root@localhost ~]$ salt-key -L    # 查看有哪些minion公钥过来进行认证
Accepted Keys:      
Denied Keys:          # Accepted Keys 表示已经接受的公钥
Unaccepted Keys:      # Denied Keys 表示已经拒绝的公钥
192.168.119.140       # Unaccepted Keys 表示还没有被接受的公钥
192.168.119.142       # Rejected Keys 表示已经被拒绝的公钥
Rejected Keys:        # Deny 是直接把包丢掉,不会有任何回应,相对粗暴点,而 Reject 则是会通知对方你的包被我拒绝了
[root@localhost ~]$ salt-key -a 192.168.119.*    # 设置通过认证(Accept)

salt-key 常用参数:

-L    # 列出所有未被接受的公钥
-a    # 接受(Accept)指定的主机公钥,后面接主机名
-r    # 拒绝(Reject)指定的主机公钥,后面接主机名
-d    # 拒绝(Deny)指定的主机公钥,后面接主机名
-A    # 接受(Accept)所有的主机公钥
-R    # 拒绝(Reject)所有的主机公钥
-D    # 拒绝(Deny)所有的主机公钥
-y    # 我们在接受主机公钥时需要按y确认,加上该参数可以省略交互


三、SaltStack 远程执行命令

设置认证通过后,就可以使用 master 对多个 minion 远程执行命令了:

[root@localhost ~]$ salt '*' test.ping             # 检查所有主机是否存活
[root@localhost ~]$ salt '*' cmd.run "hostname"    # 对所有主机执行hostname命令