saltstack安装和配置salt-api(python调用)

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

配置python调用的api

安装:

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

能够监听到端口,即启动成功

python调用salt-api执行命令

命令行获得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

你可能感兴趣的:(自动化工具使用)