一、前提简介
不知道你是否了解过saltstack这个工具,它是自动化运维的强力工具之一,通过salt,你可以管理上百,上千甚至上万的机器,可以批量部署管理应用,通常使用的时候我们可以用命令去执行一些管理操作,比如salt、salt-cp、salt-ssh等,但是有时候,命令行的操作并不一定满足我们的需求,所以为了拓展salt这个工具,你可以借助salt开发自己的运维小工具。怎么借助salt进行开发呢,一般这种工具都会提供类似的RESTful api给开发者们使用的,salt也不例外,它就提供了RESTful api,通过HTTP访问的方式就能使用salt的功能,下面我就将一些,我介绍一些salt restful api的使用方式。
二、安装salt-api
在你使用salt api之前,你需要,提供salt-api服务,这个就比较简单了,安装教程,我这里就不做详解,网上的教程很多,我这里提供一个别人的链接:
https://www.cnblogs.com/xiewenming/p/7716660.html
三、salt RESTful api的使用
首先使用salt api获取token,用于认证:
curl -sSk http://172.17.40.126:8000/login \
-H 'Accept: application/x-yaml' \
-d username='salt' \
-d password='salt' \
-d eauth='pam'
返回结果如下:
拿到token之后,我们就可以做更多的事情了,比如测试test.ping这个模块:
curl -sSk http://172.17.40.126:8000 \
-H 'Accept: application/x-yaml' \
-H 'X-Auth-Token: 897739b4def112f7a39d79eced19ddde611958b8' \
-d client='local' \
-d tgt='*' \
-d fun='test.ping'
执行结果如下:
通过api测试cmd.run模块
curl -sS http://172.17.40.126:8000 \
-H 'Accept: application/x-yaml' \
-H 'X-Auth-Token: 897739b4def112f7a39d79eced19ddde611958b8' \
-d client='local' \
-d tgt='*' \
-d fun='cmd.script' \
-d arg='runas=admin' \
-d arg='salt://test_script.sh' \
-d arg='aaa bbb'
一些参数解释:
X-Auth-Token:指定一个会话令牌,令牌来自登录
Accept:指定所需的响应格式
tgt:指定哪些minion作为执行目标,默认是shell glob,可以通过tgt_type或expr_form选项修改,建议使用tgt_type
tgt_type:指定tgt的类型,包含的类型如下:
glob - Bash glob completion - Default
pcre - Perl style regular expression
list - Python list of hosts
grain - Match based on a grain comparison
grain_pcre - Grain comparison with a regex
pillar - Pillar data comparison
pillar_pcre - Pillar data comparison with a regex
nodegroup - Match on nodegroup
range - Use a Range server for matching
compound - Pass a compound match string
ipcidr - Match based on Subnet (CIDR notation) or IPv4 address.
runas: 可以指定使用哪个用户执行
arg: 可以传递各种参数,比如上边的salt://test_script.sh,传递的是一个执行的脚本,如果脚本需要一个位置参数($1 $2 $3 ...)怎么办,可以继续使用arg传递参数,传递方式是,参数之间加上空格
四、事件总线
事件总线
curl -SsNk http://172.17.40.126:8000/events?token=897739b4def112f7a39d79eced19ddde611958b8
事件总线是salt的一大特点,当执行一个任务的时候,你怎么知道它在minion端执行的结果怎么样呢?salt官方采用的是事件总线的方式,通过发布、订阅事件,可以将所有的操作都记录在事件总线中,包括认证操作。上面的命令,是一个监控事件总线的操作,它会一直挂载监听,如果有操作,首先会从salt-master将命令发送给salt-minion端,minion端执行完,把结果返回到事件总线,就是master端,然后在打印出结果。这个地方,有个缺点,就是当你执行一个很长的任务时,你并不能确定帮你的任务执行到哪了,这个比较坑,好像不能实时返回结果,只能等待salt-minion端执行完成才会返回执行结果。
五、salt-api的封装用法
上面的一些都是铺垫,让你了解一下salt api的一些使用方式,你了解这些之后,封装api就简单多了,salt本身也是python开发,这里封装我也采用python来封装,其实你也可以使用java来封装,道理是一样的,HTTP的访问方式,python和java都能做到的,这里我只介绍python的封装方式。
先上代码:
import requests
from urllib.parse import urljoin
class SaltAPI(object):
def __init__(self, url, username, password):
"""
传入初始化参数,以便获取Token
:param url: salt-api的地址
:param username: salt-api的用户
:param password: salt-api的密码
"""
self.url = url
self.__username = username
self.__password = password
self.token = self.get_token()
def get_token(self):
"""
获取Token
:return: Token串
"""
get_token_url = urljoin(self.url, '/login')
params = dict(username=self.__username, password=self.__password, eauth='pam', verify=False)
token_obj = requests.post(get_token_url, data=params)
return token_obj.json()["return"][0]["token"]
def post(self, prefix='/', params=None, headers=None):
"""
post请求
:param prefix:
:param json_data:
:param headers:
:return:
"""
post_url = urljoin(self.url, prefix)
if headers is None:
headers = {'X-Auth-Token': self.token, 'Accept': 'application/json'}
else:
headers = {'X-Auth-Token': self.token, }.update(headers)
post_requests = requests.post(post_url, json=params, headers=headers, verify=False, timeout=10)
return post_requests.json()
def get_all_key(self):
"""
获取所有接受的minion和拒绝的minion
:return:
"""
params = {'client': 'whell', 'fun': 'key.list_all'}
content = self.post(params=params)
# minions = content['return'][0]['data']['return']['minions']
# minions_pre = content['return'][0]['data']['return']['minions_pre']
# return minions, minions_pre
return content
def remote_run_module_single(self, tgt, fun, arg=None):
"""
远程主机执行模块,args参数可选
:param tgt:
:param fun:
:param args: 可以是单个参数或参数列表
:return:
"""
params = {'client': 'local', 'tgt': tgt, 'fun': fun}
if arg:
params.update({'arg': arg})
content = self.post(params=params)
return content['return'][0]
这个是我封装的,环境采用的是python3.6环境,主要使用requests这个模块,这个模块比较好用,封装简单,模块的使用方式,贴下一个教程:
http://docs.python-requests.org/zh_CN/latest/user/quickstart.html
代码写的简单,主要是提供一个思考的方式。
六、参考
salt-api封装参考:
https://www.cnblogs.com/40kuai/p/9164994.html
https://www.jianshu.com/p/13fa0b463fda
七、总结
其实,说实话,内容都挺简单,而且资料也很丰富,基本所有的资料都是网上查找的,虽然网上的很多文章都是千篇一律,但是有些写的还是挺好的,而且,看到好的文章,我都会推荐,贴上他们的链接,这是对这些作者的劳动成果的尊重。
题外
不知道你是不是一个宅男,推荐一个最近很火的番剧结尾曲,很有魔性,当你看完第三集,你就会感受到这个片尾曲的魔力。
《辉夜大小姐想让我告白》之《书记舞蹈》
bilibili可以观看
http://www.bilibili.com/video/av41809384?share_medium=android&share_source=copy_link&bbid=XZ25BC72862E1A3555A89F14C24B329CE159B&ts=1553481092258