• 通过saltapi接口安装实例(modules)


    1、需求

    自定义一个类,首先初始化时候获得token,然后使用token认证去请求相应的json文件。

    salt命令在shell中使用方式是salt 客户端 模块名.方法 参数(例子:salt ‘client’ cmd.run ‘free -m’)。

    这里salt命令方法我们已经封装好了,想使用salt的什么方法就传入对应的客户端、方法、参数即可。

    2、准备工作

    ①、服务端安装salt-master、salt-api

    ②、查看/etc/salt/master配置文件,找到file_roots这个参数所指定的家目录

    ③、在家目录下创建如下文件

    [root@jiang salt]# pwd
    /srv/salt
    [root@jiang salt]# ls
    _file  _modules  _runner  _shell

    这里需要注意的是家目录下的目录需要以“_”开头

    各个文件的内容:

    _file:存放的文件,方便copy到minion端

    _modules:自定义的模块文件

    _runner:自定义的runner文件

    _shell:自定义的shell文件

    3、编写saltapi.py文件

    #定义modules和runner接口

    import json
    import requests

    class SaltServer(object):
    def __init__(self):
    self.session = requests.session()
    self.token = self.getToken() #获取token,如果这里不写的话可以在下面函数调用也一样
    self.url = "http://192.168.137.130:8000"

    # print(self.session.cookies) #通过resquests模块也可以获取到token,不过需要再执行过滤,这个看具体使用

    def getToken(self): #定义获取token的函数
    url = "http://192.168.137.130:8000/login"
    headers = {"Accept": "application/json"}
    data = {
    "username": "saltapi",
    "password": "saltapi",
    "eauth": "pam"
    }
    res = self.session.post(url=url, headers=headers, data=data)
    text = res.text
    result = json.loads(text) #把json数据类型转化成python对象
    token = result.get("return")[0].get("token")
    return token

    def resBean(self, datas): #定义res接口规范函数,方便下面调用,一般都使用这个规范!
    resultBean = dict()
    try:
    res = self.session.post(url=self.url, data=datas)
    text = res.text
    data = json.loads(text).get("return")
    resultBean['code'] = 0
    resultBean['message'] = "success"
    resultBean['data'] = data
    except Exception as e:
    resultBean['code'] = -1
    resultBean['message'] = "error"
    resultBean['data'] = e
    finally:
    return resultBean

    def runModules(self, minionid, fun, arg=None): #定义module函数,三个参数分别是客户端,函数和参数
    # url = "http://192.168.137.130:8000"
    data = {
    # "X-Auth-Token": self.getToken(), #在上面构造函数里定义了这里就可以不用再写这个参数了
    "client": "local", #调用module使用local
    "tgt": minionid, #定义minion的id
    "fun": fun, #使用的函数
    "arg": arg #函数使用的参数
    }
    return self.resBean(data)

    def runRunner(self, fun, **kwarge): #定义runner函数,两个参数分别是函数和参数
    # url = "http://192.168.137.130:8000"
    data = {
    # "X-Auth-Token": self.getToken(),
    "client": "runner", #调用runner的使用runner
    "fun": fun,
    }
    data.update(kwarge) #这里的data参数和modules模块的有区别,需要注意
    return self.resBean(data)

    4、编写安装软件的模块:installApp.py(可以定义多个函数,每个函数表示安装的软件,这里只是示例安装nginx)

    #调用脚本安装相关软件

    import commands

    def nginx():
    resultBean = dict()
    __salt__['cp.get_file']('salt://_shell/app/nginx.sh', '/usr/local/src/installnginx.sh') #调用cp模块传送shell脚本到minion端
    cmd = 'sh /usr/local/src/installnginx.sh && systemctl restart nginx' #执行minion端的shell脚本
    status, output = commands.getstatusoutput(cmd)
    if status == 0:
    resultBean['code'] = 0
    resultBean['message'] = 'success'
    resultBean['data'] = output
    else:
    resultBean['code'] = -1
    resultBean['message'] = 'install nginx error'
    resultBean['data'] = output
    return resultBean

    每次编写或者修改完模块后记得执行同步模块命令:

    [root@jiang salt]# salt '*' saltutil.sync_modules

    5、编写安装nginx的shell脚本,放在_shell目录里面(只做示例用,详细的可以自己按照需求编写即可)

    #!/bin/bash

    yum install -y nginx

    6、测试:test.py

    from saltUtil.util.saltapi import SaltServer       #在pycharm里面执行,加载saltapi.py脚本的SaltServer类,具体路径按照自己写的路径为准

    saltServer = SaltServer()

    result = saltServer.runModules('*', 'installApp.nginx') #传入客户端和模块方法
    print(result)
  • 相关阅读:
    用友U8远程接入客户端提示启动客户端错误
    oracle 10g 错误 ORA-01653 的解决过程
    用友 凭证引入 如何删除引入的外部凭证
    Delphi实现程序只运行一次并激活已打开的程序
    Delphi Raize的日期控件RzDateTimeEdit星期几不能正确显示的问题
    U8 提示“操作员没有查询权限或视图权限”
    数据库图片存储也读取
    Delph最简单i获取外网IP
    cxgrid 单元格合并
    cocos2d 中使用 pickerView 简单的老虎机应用
  • 原文地址:https://www.cnblogs.com/Jweiqing/p/9281861.html
Copyright © 2020-2023  润新知