saltstack介绍https://docs.saltstack.com/en/latest/topics/index.html
可以使用salt-ssh远程执行,类似ansible,
也支持c/s模式,下面我将使用该种模式,需要准备两台机器
192.168.1.39为服务端,192.168.1.9为客户端
设置hostname以及hosts,master,master02
两台机器全部安装saltstack yum源
下载链接参考:https://docs.saltstack.com/en/latest/topics/installation/rhel.html
yum install -y https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm
注意以上是官网链接,官网下不了用下面的国内源,如果链接失效顺藤摸瓜就行:
centos7:
rpm -ivh http://mirrors.ustc.edu.cn/centos/7/extras/x86_64/Packages/epel-release-7-11.noarch.rpm
centos6:
rpm -ivh http://mirrors.ustc.edu.cn/centos/6/extras/x86_64/Packages/epel-release-6-8.noarch.rpm
39上执行
yum install -y salt-master salt-minion
9上执行
yum install -y salt-minion
配置:
39上编辑配置文件
注意,master后面接得是主机名,或者是master的ip,id可用于主机认证,后面slat可以直接接id名称就行,用主机名认证的话可以注释掉id这行
vi /etc/salt/minion //增加
master: master01
id: cmdb_master
启动服务:
systemctl start salt-master; systemctl start salt-minion
9上编辑配置文件
vi /etc/salt/minion //增加
master: master01
id: cmdb_salve
启动服务:
systemctl start salt-minion
服务端监听4505和4506两个端口,4505为消息发布的端口,4506为和客户端通信的端口
master端和minion端通信需要建立一个安全通道,传输过程需要加密,所以得配置认证,也是通过密钥对来加密解密的
minion在第一次启动时会在/etc/salt/pki/minion/下生成minion.pem和minion.pub,其中.pub为公钥,它会把公钥传输给master
[root@master02 minion]# ls /etc/salt/pki/minion/
minion.pem minion.pub
master第一次启动时也会在/etc/salt/pki/master下生成密钥对,当master接收到minion传过来的公钥后,通过salt-key工具接受这个公钥,一旦接受后就会在/etc/salt/pki/master/minions/目录里存放刚刚接受的公钥,同时客户端也会接受master传过去的公钥,把它放在/etc/salt/pki/minion目录下,并命名为minion_master.pub
以上过程需要借助salt-key工具来实现
执行如下命令 salt-key -a master02// -a后面跟主机名,可以认证指定主机
salt-key -a master02
salt-key命令用法:
-a 后面跟主机名,认证指定主机
-A 认证所有主机
-r 跟主机名,拒绝指定主机
-R 拒绝所有主机
-d 跟主机名,删除指定主机认证
-D 删除全部主机认证
-y 省略掉交互,相当于直接按了y
-L 查询所有主机的认证信息
saltstack远程执行命令
salt '’ test.ping //这里的表示所有已经签名的minion端,也可以指定一个主机名
salt 'master' test.ping
salt '*' cmd.run "hostname" //执行shell命令 hostname
salt '*' grains.items //查询机器的基本信息
说明: 这里的必须是在master上已经被接受过认证的客户端,可以通过salt-key查到,通常是我们已经设定的id值。关于这部分内容,它支持通配、列表以及正则。 比如两台客户端aming-01,aming-02, 那我们可以写成salt 'aming-’, salt ‘aming-0[12]’ salt -L ‘aming-01,aming-02’ salt -E 'aming-(01|02)'等形式,使用列表,即多个机器用逗号分隔,而且需要加-L,使用正则必须要带-E选项。 它还支持grains,加-G选项,pillar 加-I选项。
具体命令使用可以参考:
https://blog.csdn.net/wh211212/article/details/77072799
安装:
yum install -y salt-api pyOpenSSL
配置证书签名:
cd /etc/pki/tls/certs/
make testcert
-->设置秘钥密码,(3次) ,剩下回车
cd /etc/pki/tls/private/
openssl rsa -in localhost.key -out localhost_nopass.key
授权:
chmod 755 /etc/pki/tls/certs/localhost.crt
chmod 755 /etc/pki/tls/private/localhost.key
chmod 755 /etc/pki/tls/private/localhost_nopass.key
创建用户:
useradd -M -s /sbin/nologin saltapi
passwd saltapi
配置salt-api,修改/etc/salt/master文件:
sed -i '/#default_include/s/#default/default/g' /etc/salt/master
配置salt-api,创建2个配置文件:
cd /etc/salt/master.d
[root@master master.d]# cat api.conf
rest_cherrypy:
port: 8001
ssl_crt: /etc/pki/tls/certs/localhost.crt
ssl_key: /etc/pki/tls/private/localhost_nopass.key
[root@master master.d]# cat eauch.conf
external_auth:
pam:
saltapi: # 用户
- .*
- '@runner'
- '@wheel'
注意: - .* # 该配置文件给予saltapi用户所有模块使用权限,出于安全考虑一般只给予特定模块使用权限
启动检测:
systemctl restart salt-master
systemctl enable salt-api
systemctl start salt-api
ps -ef|grep salt-api
netstat -lnput|grep 8001
能够监听到端口,即启动成功
命令行获得token:
[root@master master.d]# curl -k https://192.168.1.39:8001/login -H "Accept: application/x-yaml" -d username='saltapi' -d password='saltapi' -d eauth='pam'
return:
- eauth: pam
expire: 1547848684.96428
perms:
- .*
- '@runner'
- '@wheel'
start: 1547805484.964279
token: 705ae46866c67ce41183287ef30c12765ddbe42c
user: saltapi
命令行利用token来获取主机信息:
[root@master ~]# curl -k https://192.168.1.39:8001/ -H "Accept: application/x-yaml" -H "X-Auth-Token: 705ae46866c67ce41183287ef30c12765ddbe42c" -d client='local' -d tgt='*' -d fun='test.ping'
return:
- k8s-m1: true
master02: true
此处我们用python 调用salt-api
#!/usr/bin/python
# -*- coding:utf-8 -*-
# @Time : 2019/1/18 17:54
# @Author : liaochao
# @File : salt_test.py
import requests
import json
try:
import cookielib
except:
import http.cookiejar as cookielib
# 使用urllib2请求https出错,做的设置
import ssl
context = ssl._create_unverified_context()
# 使用requests请求https出现警告,做的设置
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
salt_api = "https://192.168.1.39:8001/"
class SaltApi:
"""
定义salt api接口的类
初始化获得token
"""
def __init__(self, url):
self.url = url
self.username = "saltapi"
self.password = "saltapi"
self.headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36",
"Content-type": "application/json"
# "Content-type": "application/x-yaml"
}
self.params = {'client': 'local', 'fun': '', 'tgt': ''}
self.login_url = salt_api + "login"
self.login_params = {'username': self.username, 'password': self.password, 'eauth': 'pam'}
#获取token
self.token = self.get_data(self.login_url, self.login_params).get('token')
self.headers['X-Auth-Token'] = self.token
def get_data(self, url, params):
send_data = json.dumps(params)
request = requests.post(url, data=send_data, headers=self.headers, verify=False)
response = request.json()
# print('----->>>>',response)
result = dict(response)
# print('result集合--->', result['return'][0])
return result['return'][0]
def salt_command(self, tgt, method, arg=None):
"""远程执行命令,相当于salt 'client1' cmd.run 'free -m'"""
if arg:
# salt内置key
params = {'client':'local', 'fun': method, 'tgt': tgt, 'arg': arg}
else:
#salt内置key,定义params参数
params = {'client':'local', 'fun': method, 'tgt': tgt}
# print ('命令参数: ', params)
result = self.get_data(self.url, params)
# print ('result--->',result)
return result
def main():
print ('==================')
print ('同步执行命令')
salt = SaltApi(salt_api)
# print('token-->',salt.token)
salt_client = '*'
salt_test = 'test.ping'
#salt_test ="grains.items"
salt_method = 'cmd.run'
salt_params = 'free -m'
# 下面只是为了打印结果好看点
result1 = salt.salt_command(salt_client, salt_test)
for i in result1.keys():
print (i, ': ', result1[i])
result2 = salt.salt_command(salt_client, salt_method, salt_params)
for i in result2.keys():
print (i)
print (result2[i])
print
if __name__ == '__main__':
main()
运行该脚本可以得到:
==================
同步执行命令
master02 : True
k8s-m1 : True
master02
total used free shared buff/cache available
Mem: 1830 464 1097 88 268 1133
Swap: 2048 265 1783
k8s-m1
total used free shared buff/cache available
Mem: 3534 1365 159 164 2009 1702
Swap: 2048 0 2048