内容简介:Saltstack Restful API
Saltstack Restful API
如果需要通过第三方调用Saltstack时,我们可以使用Saltstack自带的Python API但是并不能很好的满足需求。可以通过使用Saltstack基于RESTful风格的HTTP API。该API模块并不是内置的,需要单独安装
Salt REST API简介
这里简单说明下,SaltStack官方支持三种REST API,分别是rest_cherry;rest_tonado和rest_wsgi, rest_cherry和rest_tonado两个模块支持端口的监听和请求接收
本文选择使用rest_cherry模块来实现Saltstack的HTTP API
安装Salt-API服务
一般情况下,salt-api会使用HTTPS,首次配置成功后使用用户名和密码登录,获得Token,Token创建后,默认有效期是12小时,在有效期之内,使用该Token可以代替使用用户名和密码来访问API(该有效时间可在salt-master配置文件中修改)
1.安装依赖包
yum -y install gcc make python-devel libffi-develpip install pyOpenSSL==0.15.1
2.使用salt工具来生成证书
salt-call --local tls.create_self_signed_certlocal: Created Private Key: "/etc/pki/tls/certs/localhost.key." Created Certificate: "/etc/pki/tls/certs/localhost.crt."
salt-call是salt-minion的工具,如果没有这个命令,可以在master端安装minion,然后再执行以上命令
3.安装salt-api
yum install salt-api
4.配置用户及权限
user add -M -s /sbin/nologin bossecho "boss" | passwd boss --stdin
5.修改salt-master的配置文件最后添加如下配置
external_auth: pam: #认证模式,pam指的是用 Linux 本身的用户认证模式 boss: #Linux系统中真实存在的用户名 - '[i]': #设置用户的权限,允许该用户操作哪些主机,[/i]代表全部 - test.* #允许操作的模块及方法 - cmd.*
其他认证模式可以参考官方文档 https://docs.saltstack.com/en/latest/topics/eauth/index.html
配置实例一:多用户认证
external_auth: pam: thatch: - 'web*': - test.* - network.* steve: - .* #不限制用户steve
配置示例二:GROUPS(官方)
To apply permissions to a group of users in an external authentication system, append a % to the ID:
external_auth: pam: admins%: - '*': - 'pkg.*'
配置示例三:操作模块组(官方)
external_auth: pam: thatch: - '@wheel' # to allow access to all wheel modules - '@runner' # to allow access to all runner modules - '@jobs' # to allow access to the jobs runner and/or wheel module
查看salt.wheel.modules https://docs.saltstack.com/en/latest/ref/wheel/all/index.html#all-salt-wheel
查看salt.runner.modules
https://docs.saltstack.com/en/latest/ref/runners/all/index.html#all-salt-runners6.配置salt-api服务
在salt-master的配置文件最后添加如下配置
rest_cherrypy: port: 1559 #监听1559端口 ssl_crt: /etc/pki/tls/certs/localhost.crt #引用证书,基于加密方式 ssl_key: /etc/pki/tls/certs/localhost.key
7.启动服务
/etc/init.d/salt-master restartservice salt-api start
8.登录获得Token(此处通过header获得token)
[root@boss-node1 salt]# curl -sSk https://192.168.56.125:1559/login \> -H 'Accept: application/x-yaml' \> -d username=boss \> -d password=boss \> -d eauth=pamreturn:- eauth: pam expire: 1495051545.6982951 perms: - test.* - cmd.* start: 1495008345.6982939 token: 8e824c77f6766ae20899199628a5263487f3fe32 user: boss
9.复制token并运行test.ping
curl -sSk https://localhost:1559 \ -H 'Accept: application/json' \ -H 'X-Auth-Token: 03e3d81c6494123b6b70a707f436d64b3e5f74e9'\ -d client=local \ -d tgt='*' \ -d fun=test.ping{"return": [{"boss-node2": true, "boss-node1": true}]}
10.编写 python 发送一个请求
<pre style="background-color:#ffffff;color:#000000;font-family:'Courier New';font-size:10.5pt;">#!/usr/bin/env python# -*- coding:utf-8 -*-# Author:Muzi Liimport jsonimport urllibimport urllib2# 在python2.6x中,以下两行不是必须的import sslssl._create_default_https_context = ssl._create_unverified_contexturl = 'https://192.168.56.125:1559' # salt-api所在的“坐标”def test(): pre_data = [{"client": "local", "tgt": "*", "fun": "test.ping"}] # 根据上面官方文档的要求组成数组嵌套字典的形式 json_data = json.dumps(pre_data) # 将其转化为json格式 header = {"Content-Type": "application/json", "Accept": "application/json", "X-Auth-Token": "03e3d81c6494123b6b70a707f436d64b3e5f74e9"} # 这里说明下,Content-Type是声明传递给API的数据是什么格式的,这里指定了json,是因为上面的pre_data数据被我转化成了json格式 # Accept是声明返回结果以什么样的格式显示,这里也指定了json格式来显示返回结果 request = urllib2.Request(url, json_data, header) # 构造一次请求 response = urllib2.urlopen(request) # 构造一次HTTP访问 html = response.read() print htmlif __name__ == "__main__": test()</pre>
9.登录获得Token(此处使用cookie)
[root@boss-node1 ~]# curl -sSk https://localhost:1559/login \> -c ~/cookies.txt \> -H 'Accept: application/x-yaml' \> -d username=boss \> -d password=boss \> -d eauth=pamreturn:- eauth: pam expire: 1495056758.5330541 perms: - test.* - cmd.* start: 1495013558.5330529 token: 8a9ec5677ddbc20fa2c5b90844de0be461a0db9f user: boss[root@boss-node1 ~]# curl -sSk https://localhost:1559 \> -b ~/cookies.txt \> -H 'Accept: application/x-yaml' \> -d client=local \> -d tgt='*' \> -d fun=test.pingreturn:- boss-node1: true boss-node2: true
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。