一、环境准备
1、redhat6.7 3台(master1:172.17.25.15; master2 : 172.17.25.12 ; minion : 172.17.25.12 )
2、python2.7.14
3、anaconda5.1 下载路径:https://www.anaconda.com/download/#linux
二、SaltStack下载安装
下载地址:https://repo.saltstack.com/#rhel
运行以下命令以安装SaltStack存储库和密钥:
sudo yum install https://repo.saltstack.com/yum/redhat/salt-repo-2018.3-1.el6.noarch.rpm
安装salt主或其他salt组分:
sudo yum install salt-master -y
sudo yum install salt-minion -y
sudo yum install salt-ssh -y
sudo yum install salt-syndic -y
sudo yum install salt-cloud -y
sudo yum install salt-api -y
2.1 salt-master配置
更改配置 vim /etc/salt/master
interface: 172.17.25.15(冒号后一定要空格)
启动:/etc/init.d/salt-maser master
chkconfig salt-master on
2.2 salt-minion配置
更改配置 vim /etc/salt/minion (注意格式)
master:
- 172.17.25.12
- 172.17.25.15
master_shuffle: True (设置启动时随机选择一台)
master_type: failover
master_alive_interval: 10
retry_dns: 0
backup_mode: minion
auth_tries: 2
auth_safemode: True
log_level_logfile: debug
启动:service salt-minion restart
chkconfig salt-minion on
2.3 salt-api配置
2.3.1 安装salt api
yum -y install pyOpenSSL
2.3.2 生成公钥
salt-call --local tls.create_self_signed_cert
local:
Created Private Key: "/etc/pki/tls/certs/localhost.key." Created Certificate: "/etc/pki/tls/certs/localhost.crt."
问题:'tls' __virtual__ returned False: PyOpenSSL version 0.10 or later must be installed before this module can be used.
发现python版本不一致
[root@SX-25-15 soft]# python
Python 2.7.14 |Anaconda, Inc.| (default, Dec 7 2017, 17:05:42)
[GCC 7.2.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
/usr/bin/python2.7
Python 2.7.13 (default, Mar 30 2018, 15:31:59)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-18)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
salt-call 查看启动文件读取/usr/bin/python2.7文件
替换/usr/bin/python2.7文件
ln -s /tools/anaconda2/bin/python2.7 /usr/bin/python2.7
问题:[root@SX-25-15 tools]# salt-call --local tls.create_self_signed_cert
Traceback (most recent call last):
File "/usr/bin/salt-call", line 7, in <module>
from salt.scripts import salt_call
ImportError: No module named salt.scripts
解决:
pip install salt
pip install cherrypy
2.3.3 配置api
指定api主机地址及端口
vim /etc/salt/master.d/api.conf
rest_cherrypy:
host: 172.17.25.15
port: 8000
ssl_crt: /etc/pki/tls/certs/localhost.crt
ssl_key: /etc/pki/tls/certs/localhost.key
2.3.4 配置auth
vim auth.conf
external_auth:
pam:
saltapi:
- .*
- '@wheel'
- '@runner'
- '@jobs'
创建用户,saltapi认证使用
useradd -M -s /sbin/nologin saltapi
echo '123456' | passwd saltapi --stdin
启动 /etc/init.d/salt-api restart
验证login登陆,获取token字符串
curl -sSk https://172.17.25.15:8000/login \-H 'Accept: application/x-yaml' \
-d username='saltapi' \
-d password='saltapi' \
-d eauth='pam'
return:
- eauth: pam
expire: 1527622175.307136
perms:
- .*
- '@wheel'
- '@runner'
- '@jobs'
start: 1527578975.307132
token: fcd36c01cd4fbc6417b29b728a482b2b312dfd5f
user: saltapi
通过api执行test.ping测试连通性
-H 'Accept: application/x-yaml' \
-H 'X-Auth-Token:22e97bd3a4e62e374e23216532c17a9db8fca19c' \
-d client=local \
-d tgt='*' \
-d fun=test.ping
return:
- SX-25-12: true
执行cmd命令
curl -sSk https://172.17.25.12:8000 \
-H 'Accept: application/x-yaml' \
-H 'X-Auth-Token:2c4e5dbe2a4fbc30c225fc446598bfd9a7e0ca8d' \
-d client=local \
-d tgt='*' \
-d fun='cmd.run' -d arg='date'
return:
- SX-25-12: Tue May 29 17:51:10 CST 2018
工作流:
salt-master的工作方式是始终向所有连接的米您发送命令,minion通过检查自己是否符合命令目标来决定命令是否执行
- 命令在CLI上发出。例如,'salt my_minion test.ping'。
- 'salt'命令使用LocalClient通过连接到TCP:4506上的ReqServer 并发出作业来生成对salt master的请求。
- salt-master ReqServer看到请求并通过workers.ipc将它传递给可用的MWorker。
- 工作人员拿起请求并处理它。首先,它会检查以确保请求的用户有权发出命令。然后,它将发布命令发送给所有连接的小手。奇怪的是,这发生在ClearFuncs.publish()中。
- 工作人员在主事件公共汽车上宣布它将要发布一份工作给有联系的随从。发生这种情况时,将事件放在主事件总线(master_event_pull.ipc)上,EventPublisher将其拾取并将其分发到master_event_pub.ipc上所有连接的事件侦听器。
- 发送给minion的消息将通过publish_pull.ipc上的IPC加密并发送给发布者。
- 连接的小伙伴在TCP端口4505上与发布者建立一个TCP会话,并在那里等待命令。当发布者通过publish_pull接收到作业时,它通过网络将作业发送给作业进行处理。
- 在minion接到请求后,他们解密并执行任何请求的工作,如果他们确定他们的目标是这样做的话。
- 当minion准备响应时,它通过将加密结果发送回TCP 4506上的主机,将其作业结果发回给主机,再由主机服务器接收并转发给可用的MWorker进行处理。(再次,这是通过将这个消息传递给workers.ipc到一个可用的工作者。)
- 当MWorker收到作业时,它解密并将事件触发到主事件总线(master_event_pull.ipc)上。(对于好奇,这发生在AESFuncs._return()中。
- EventPublisher发现该事件并将其重新发布到总线上所有连接的监听器(在master_event_pub.ipc上)。这是LocalClient一直在等待的地方,正在监听事件总线的应答。它收集工作并存储结果。
- 当所有目标小众已经回复或超过超时时间后,盐客户端会在CLI上向用户显示作业结果。
Minion工作流程:
1、由master端发起请求
2、minion轮询连接到主发布者的接收套接字(主站上的TCP 4505)。当它检测到传入的消息时,它从套接字中取出并解密它
3、创建一个新的minion进程或线程,并提供解密消息的内容。_thread_return()方法与接收到的消息的内容一起提供。
4、创建新的minion线程。_thread_return()函数启动并实际调出作业中包含的请求的函数。
5、请求的函数运行并返回结果。[仍在线程中]
6、运行的函数的结果被加密并返回给主服务器的ReqServer(主服务器上的TCP 4506)。[仍在线程中。
7、线程退出。由于主线程仅在初始化工作线程时才被阻塞,因此在此期间可能会收到并处理很多其他请求。