CMBD 资产管理(6) python调用salt-api执行命令

python调用salt-api执行命令

import json

salt_api = 'https://192.168.1.8:8001'

class SaltApi:

    def __init__(self, url):    # 初始化 参数
        self.url = url
        self.username = 'saltapi'    # 设置的用户名和密码  salt-api的
        self.password = '123213'
        self.headers = {      #headers 写死的 请求的头部
                     'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0'
                     'Content-type': 'application/json'     # 固定的写法,Agent的浏览器参数
                    }
        self.params = {'client':'local', 'fun':'', 'tgt':''}  # 固定key值
        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).get('token')   
            # 这是个字典还可以切片取值['token']。 推荐get方式取值,取不到只有空,不会报错。切片取值就能获取到报错信息
            # token 值 调用get_data 取值,传过去了 url 和 登录信息相关的参数
        self.headers['X-Auth-Token'] = self.token
    

    def get_data(self, url, params):   # get 数据 + 格式转换
        send_data = json.dumps(params)    # 先将字典 通过json 变成 str格式
        request = requests.post(url, data=send_data, headers=self,headers, verify=False) #发送请求
        response = request.json()   # 将返回的数据 字符串 str 转成 json格式 给 response
        result = dict(response)    # 再转换成字典
        return result['retrun'][0]    #最好return出去需要的值 

    def salt_command(self, tat, method, arg=None):   #执行发送请求, 传入的时候有地三个参数就传arg,没有就none
        if arg:
            #params = {'client': 'local', 'fun': method, 'tgt': tgt, 'arg':arg, 'expr_form':'list'}
            params = {'client': 'local', 'fun': method, 'tgt': tgt, 'arg':arg,}
        else:
            params = {'client': 'local', 'fun': method, 'tgt': tgt}  #这是salt的规则,必须是这样
        result = self.get_data(self.url, params) # 往 get_data方法里传入两个值,url和params 的字典
        return result 


def main():
    
    salt = SaltApi(salt_api)   #实例化对象
    salt_client = 'hc-02'    # 这里是 minion端的ID 多个值可以是 ['*']
    selt_test = 'test.ping'    # 这是 测试主机连通性,是salt执行的命令

    #selt_test = 'grains.items'   # 这个 items 抓了很多数据

    selt_method = 'grains.get'   # 抓主机信息 
 
    #salt_method = 'cmd.run'      #  执行shell命令
    #salt_method = 'disk.usage'   # salt 'hc-02' disk.usage   取磁盘信息
    #salt_method = 'svn.update'   # 要使用SVN的模块  salt 'hc-02' svn.update 
    
    selt_params = ['ip_interfaces', ]  # ip网卡信息

    #salt_params = ['ip_interfaces', 'hwaddr_interfaces']  # 取 IP网卡 和 MAC地址
    #salt_params = 'free -m'        # salt 'hc-02' cmd.run 'free -m' 取内存信息
    #salt_params = ['free -m', ]
    #salt_params = ['/', '/data/www', 'root', ]

    
    result1 = salt.salt_command(salt_client, salt_test) 
             # 传入两个值, 一个是minion的ID值 'hc-02' ,二个是salt执行的命令 'test.ping'
    print (result1)    # result1 传入的是 test.ping ,返回的是命令的返回值
    result2 = salt.salt_command(salt_client, salt_method, salt_params)
    print (result2)     # result2  传入的是  grains.get ip_interfaces ,返回的我主机的ip网卡信息


if __name__ == '__main__':
    main()

测试命令 salt 'hc-03' grains.get ip_interfaces

[root@hc master.d]# salt 'hc-03' grains.get ip_interfaces
hc-03:
    ----------
    eth0:
        - 192.168.1.15
    eth1:
    lo:
        - 127.0.0.1

# 做了桥接网卡的 需要特殊处理

[root@hc master.d]# salt 'hc-02' grains.get ip_interfaces
hc-02:
    ----------
    br0:
        - 192.168.1.9
        - fe80::ca60:ff:fe8e:6f93
    eth0:
        - fe80::ca60:ff:fe8e:6f93
    eth1:
    lo:
        - 127.0.0.1
        - ::1
    vnet0:
        - fe80::fc54:ff:fe1d:dab6


#返回的我主机的ip网卡信息

你可能感兴趣的:(CMBD 资产管理(6) python调用salt-api执行命令)