1.1 salt-api安装

    参考博客:https://www.jianshu.com/p/012ccdff93cc

  1、介绍

      1. saltsatck本身就提供了一套算完整的api,使用 CherryPy 来实现 restful 的 api,供外部的程序调用。

      2. salt-api需要安装,然后进行一些配置才可以正常使用

  2、安装salt-api,并设置开机启动

      yum -y install salt-api pyOpenSSL

      systemctl enable salt-api

  3、配置自签名证书

      cd /etc/pki/tls/certs/

      make testcert

Enter pass phrase:    ===>  输入加密短语,这里我使用salt2017
Verifying - Enter pass phrase: ===> 确认加密短语
umask 77 ; \
/usr/bin/openssl req -utf8 -new -key /etc/pki/tls/private/localhost.key -x509 -days 365 -out /etc/pki/tls/certs/localhost.crt -set_serial 0
Enter pass phrase for /etc/pki/tls/private/localhost.key: ===> 再次输入相同的加密短语
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:BeiJing
Locality Name (eg, city) [Default City]:BeiJing
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:
Email Address []:

交互模式输入密码等

  4、解密key文件,生成无密码的key文件

      注:过程中需要输入key密码,该密码为之前生成证书时设置的密码

      cd /etc/pki/tls/private/

      openssl rsa -in localhost.key -out localhost_nopass.key

  5、修改文件权限

      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

  6、添加用户

      注:生产环境请使用密码复杂度高的密码,这里我使用 chnsys@2016

      useradd -M -s /sbin/nologin saltapi          # 创建用户 saltapi

      passwd saltapi                                    # 为用户saltapi设置密码

  7、配置salt-api

      sed -i '/#default_include/s/#default/default/g' /etc/salt/master

  8、创建/etc/salt/master.d/目录    

      mkdir -p /etc/salt/master.d/
      cd /etc/salt/master.d/
      touch eauth.conf
      touch api.conf

external_auth:
pam:
saltapi: # 用户
- .* # 该配置文件给予saltapi用户所有模块使用权限,出于安全考虑一般只给予特定模块使用权限

eauth.conf

rest_cherrypy:
port: 8001
ssl_crt: /etc/pki/tls/certs/localhost.crt
ssl_key: /etc/pki/tls/private/localhost_nopass.key

api.conf

  9、启动salt-api

      systemctl restart salt-master
      systemctl start salt-api
      ps -ef|grep salt-api
      netstat -lnput|grep 8001

  10、测试获取token

      curl -k https://192.168.56.11:8001/login -H "Accept: application/x-yaml"  -d username='saltapi'  -d password='chnsys@2016'  -d eauth='pam'

  11、调用test.ping

      curl -k https://192.168.56.11:8001/ -H "Accept: application/x-yaml" -H "X-Auth-Token: 87cbb68e0babf3d0ad6b3741795667dbe62b3c11" -d client='local' -d tgt='*' -d fun='test.ping'

1.2 编写python脚本请求salt api接口

  1、使用python简单测试接口执行命令

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
__author__ = 'junxi' 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.56.11:8001/" class SaltApi:
"""
定义salt api接口的类
初始化获得token
"""
def __init__(self, url):
self.url = url
self.username = "saltapi"
self.password = "chnsys@2016"
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"
}
self.params = {'client': 'local', 'fun': '', 'tgt': ''}
self.login_url = salt_api + "login"
self.login_params = {'username': self.username, 'password': self.password, 'eauth': 'pam'}
self.token = self.get_data(self.login_url, self.login_params)['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()
result = dict(response)
return result['return'][0] def salt_command(self, tgt, method, arg=None):
"""远程执行命令,相当于salt 'client1' cmd.run 'free -m'"""
if arg:
params = {'client': 'local', 'fun': method, 'tgt': tgt, 'arg': arg}
else:
params = {'client': 'local', 'fun': method, 'tgt': tgt}
print '命令参数: ', params
result = self.get_data(self.url, params)
return result def main():
salt = SaltApi(salt_api)
salt_client = '*'
salt_test = 'test.ping'
result1 = salt.salt_command(salt_client, salt_test)
print result1
# 返回结果:{u'linux-node1.example.com': True, u'linux-node2.example.com': True} if __name__ == '__main__':
main()

使用python简单测试接口执行命令

  2、使用requests模块获取基本信息

#! /usr/bin/env python
# -*- coding: utf-8 -*-
import requests
import json
import logging
logging.captureWarnings(True) # 屏蔽由于访问https时没有证书警告问题 SALT_BASE_URL = 'https://192.168.56.11:8001/'
SALT_USER = 'saltapi'
SALT_PWD = 'chnsys@2016' class SaltAPI(object):
__token_id = '' def __init__(self):
self.__url = SALT_BASE_URL
self.__user = SALT_USER
self.__password = SALT_PWD def token_id(self):
"""
用户登陆和获取token
:return:
"""
params = {'eauth': 'pam', 'username': self.__user, 'password': self.__password}
content = self.postRequest(self.__url + '/login', data=params)
try:
self.__token_id = content[0]['token']
except Exception as e:
print '**** Failed to get token, {} ****'.format(str(e)) def postRequest(self, url, data=None):
headers = {"X-Auth-Token": self.__token_id}
ret = requests.post(url=url, data=data, json='json', headers=headers, verify=False)
if ret.status_code == 200:
return ret.json()['return']
return ret.text def remote_execution_module(self, tgt, fun, arg):
"""
远程执行模块,有参数
:param tgt: minion list
:param fun: 模块
:param arg: 参数
:return: dict, {'minion1': 'ret', 'minion2': 'ret'}
"""
params = {'client': 'local', 'tgt': tgt, 'fun': fun, 'arg': arg}
self.token_id()
return self.postRequest(self.__url, params) def salt_alive(self, tgt):
'''
salt主机存活检测
'''
params = {'client': 'local', 'tgt': tgt, 'fun': 'test.ping'}
self.token_id()
return self.postRequest(self.__url, params) if __name__ == '__main__':
salt = SaltAPI()
minions_list = [
'cloud:type',
'cluster:domain',
'cluster:name',
'cpu_model',
'fqdn_ip4',
'hospital:type',
'kernelrelease',
'nodename',
'os',
'osmajorrelease',
'osrelease',
'saltversion',
'serialnumber',
'virtual',
'num_cpus',
'mem_total',
'cloud:region',
'ipv4',
]
ret = salt.remote_execution_module('*', 'grains.item', minions_list)
print json.dumps(ret, ensure_ascii=False) '''
[{
"linux-node1.example.com": {
"osrelease": "7.6.1810",
"fqdn_ip4": ["192.168.56.11"],
"serialnumber": "VMware-56 4d 26 83 60 7c bb 5a-14 17 6a ab c2 45 f2 7a",
"nodename": "linux-node1.example.com",
"kernelrelease": "3.10.0-957.1.3.el7.x86_64",
"cloud:type": "",
"num_cpus": 1,
"saltversion": "2018.3.3",
"cpu_model": "Intel(R) Core(TM) i7-7500U CPU @ 2.70GHz",
"virtual": "VMware",
"cluster:domain": "",
"cluster:name": "",
"osmajorrelease": 7,
"hospital:type": "",
"cloud:region": "",
"os": "CentOS",
"ipv4": ["127.0.0.1", "192.168.56.11"],
"mem_total": 1819
},
"linux-node2.example.com": {
"osrelease": "7.6.1810",
"fqdn_ip4": ["192.168.56.12"],
"serialnumber": "VMware-56 4d 09 af 9d 33 70 99-e9 7b 6d b2 5a 3b 7f 22",
"nodename": "linux-node2.example.com",
"kernelrelease": "3.10.0-957.1.3.el7.x86_64",
"cloud:type": "",
"num_cpus": 1,
"saltversion": "2018.3.3",
"cpu_model": "Intel(R) Core(TM) i7-7500U CPU @ 2.70GHz",
"virtual": "VMware",
"cluster:domain": "",
"cluster:name": "",
"osmajorrelease": 7,
"hospital:type": "",
"cloud:region": "",
"os": "CentOS",
"ipv4": ["127.0.0.1", "192.168.56.12"],
"mem_total": 1819
}
}]
'''

使用requests模块获取基本信息

  3、解决访问无证书https报错:requests.exceptions.SSLError: HTTPSConnectionPool

      参考博客:https://blog.csdn.net/qq_31077649/article/details/79013199

      1)安装相关模块:

          pip install cryptography
          pip install pyOpenSSL
          pip install certifi

       2)关闭证书验证(verify=False)

          ret = requests.post(url=url, data=data, json='json', headers=headers, verify=False)

1111111111111111111111111111111

02:saltstack-api使用详解的更多相关文章

  1. spring原理案例-基本项目搭建 02 spring jar包详解 spring jar包的用途

    Spring4 Jar包详解 SpringJava Spring AOP: Spring的面向切面编程,提供AOP(面向切面编程)的实现 Spring Aspects: Spring提供的对Aspec ...

  2. saltstack源码详解一

    目录 初识源码流程 入口 1.grains.items 2.pillar.items 2/3: 是否可以用python脚本实现 总结pillar源码分析: @(python之路)[saltstack源 ...

  3. API函数详解:API大全总目录(按字母排列)

    API函数详解 http://www.feiesoft.com/api/api.html

  4. 2、自动化运维之SaltStack远程执行详解

    SaltStack远程执行详解 ●目标(Targeting) ●模块(Module) ●返回(Returnners) 混合模式-C 选项 主机名设置参照: redis-node1-redis03-id ...

  5. saltstack自动化运维系列⑤之saltstack的配置管理详解

    saltstack自动化运维系列⑤之saltstack的配置管理详解 配置管理初始化: a.服务端配置vim /etc/salt/master file_roots: base: - /srv/sal ...

  6. Hadoop生态圈-zookeeper的API用法详解

    Hadoop生态圈-zookeeper的API用法详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.测试前准备 1>.开启集群 [yinzhengjie@s101 ~] ...

  7. android Camera2 API使用详解

    原文:android Camera2 API使用详解 由于最近需要使用相机拍照等功能,鉴于老旧的相机API问题多多,而且新的设备都是基于安卓5.0以上的,于是本人决定研究一下安卓5.0新引入的Came ...

  8. Android API Levels 详解

    Android API Levels 当你开发你的Android应用程序时,了解该平台API变更管理的基本方法和概念是很有帮助的.同样的,知道API级别标识以及该标识如何保障你的应用与实际硬件设备相兼 ...

  9. Python3安装使用SaltStack以及salt-api详解

    序言 最近在使用salt-api做主机批量管理部署,整理一下文档.之前使用saltstack 多用于命令行管理,自己做web版的自动化管理平台时,发现命令行的些许局限性,接触到salt-api,找到了 ...

  10. Ajax编程(HTTP请求与响应及API)详解

    AJAX编程 即 Asynchronous [e'sɪŋkrənəs] Javascript And XML, AJAX 不是一门的新的语言,而是对现有技术的综合利用. 本质是在HTTP协议的基础上以 ...

随机推荐

  1. 20165321 学习基础与C语言学习心得

    一.技能学习 我其实在小时候学过挺多东西,在我小学的时候,我曾经短时间地学过小提琴.拉丁舞.国画.书法,但是,由于各种原因,都没有继续学习下去.后来,在我小学四年级的时候,我接触到了二胡,于是,我开始 ...

  2. leetcode473 Matchsticks to Square

    一开始想求所有结果为target的组合来着,但是所选元素不能重叠.用这个递归思想很简单,分成四个桶,每次把元素放在任意一个桶里面,最后如果四个桶相等就可以放进去,有一个地方可以剪枝,假如任意一个桶的元 ...

  3. cocos2d-x JS 纯代码实现人物头像裁剪

    有时候为了方便会直接用颜色层和过渡层来显示一些信息,但层只有方角没有圆角不太美观,于是我用剪切节点实现了一个圆角层.方便以后使用.   当然,如果使用Cosos Studio 操作会更好一些,省去了坐 ...

  4. javaweb之验证码验证技术

    今天学习了一个验证码校验技术,所以就写下了一些笔记,方便日后查看.首先创建web工程 1.然后在src目录下创建一个Servlet类,此类用来显示登录页面和错误信息提示 package com.LHB ...

  5. docker-php-ext-install.md(https://gist.github.com/giansalex/2776a4206666d940d014792ab4700d80)

    ```bash RUN apt update RUN apt upgrade -y RUN apt install -y apt-utils RUN a2enmod rewrite RUN apt i ...

  6. ubuntu安装mysql,redis,python-mysqldb

    sudo apt-get install mysql-server sudo apt-get install redis-server sudo apt-get install python-redi ...

  7. Tornado安装

    Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快.得利于其 非阻塞的方式和对 epoll 的运用,Tornado ...

  8. 重装win10系统

    一. 1.搜索是最好的老师,这个是非常重要的 2.数据的二备份,和三备份 二. 待完善

  9. freedom is a kind of responsibility

    张维迎教授在2017年7月1日北大国发院2017届毕业典礼上的发言<自由是一种责任> 张维迎:自由是一种责任    本文为张维迎教授在2017年7月1日北大国发院2017届毕业典礼上的发言 ...

  10. bash shell 编程练习

    原始文件: find /etc -name passwd 2>&1 | tee ee.log 1. cat -n 把 e.log 的文档内容加上行号后输入 e2.log 这个文档里: x ...