自动化运维:salt RESTful api的使用

一、前提简介

不知道你是否了解过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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值