Exemplo n.º 1
0
def runSaltCommand(host, script_type, filename):
    """
    执行远程命令
    :param host:
    :param script_type:
    :param filename:
    :return:
    """
    client = 'local'
    if host.enable_ssh is True:
        client = 'ssh'

    if script_type == 'sls':
        result = salt_api_token(
            {
                'fun': 'state.sls',
                'tgt': host,
                'arg': filename
            }, SALT_REST_URL, {
                'X-Auth-Token': token_id()
            }).CmdRun(client=client)['return'][0]
        logger.info("执行结果为:%s", result)
    else:
        result = salt_api_token(
            {
                'fun': 'cmd.script',
                'tgt': host,
                'arg': 'salt://%s.%s' % (filename, script_type)
            }, SALT_REST_URL, {
                'X-Auth-Token': token_id()
            }).CmdRun(client=client)['return'][0]
        logger.info("执行结果为:%s", result)
    return result
Exemplo n.º 2
0
def loadProjectConfig(id):
    obj = Project.objects.get(pk=id)
    targets = ""
    for host in obj.host.all():
        if host.enable_ssh is False:
            targets += host.host_name + ","
        else:
            targets += host.host + ","
    if targets != "":
        targets = targets[0:len(targets) - 1]
        for configobj in obj.projectconfigfile_set.all():
            salt_api_token(
                {
                    'fun': 'cp.push',
                    'tgt': targets,
                    'arg': configobj.config_path
                }, SALT_REST_URL, {
                    'X-Auth-Token': token_id()
                }).CmdRun()

            for host in obj.host.all():
                if SALT_CONN_TYPE == 'http':
                    url = SALT_HTTP_URL + '/read'
                    if host.enable_ssh is False:
                        data = requests.post(
                            url,
                            data={
                                "name":
                                "/var/cache/salt/master/minions/" +
                                host.host_name + '/files' +
                                configobj.config_path
                            }).content
                        data = str(data, encoding="utf-8")
                    else:
                        data = requests.post(
                            url,
                            data={
                                "name":
                                "/var/cache/salt/master/minions/" + host.host +
                                configobj.config_path
                            }).content
                        data = str(data, encoding="utf-8")
                else:
                    data = open(
                        "/var/cache/salt/master/minions/" + host.host +
                        configobj.config_path, 'r').read()

                project_host = ProjectHost.objects.get(project=obj, host=host)
                ProjectHostConfigFile.objects.filter(
                    project_host=project_host).delete()
                entity = ProjectHostConfigFile(project_host=project_host,
                                               file_path=configobj.config_path,
                                               file_content=data)
                entity.save()
Exemplo n.º 3
0
def token_id():
    s = salt_api_token(
        {
            "username": SALT_USER,
            "password": SALT_PASSWORD,
            "eauth": "pam"
        }, SALT_REST_URL + "login", {})
    test = s.run()
    salt_token = [i["token"] for i in test["return"]]
    salt_token = salt_token[0]
    return salt_token
Exemplo n.º 4
0
import yaml

from saltjob.salt_https_api import salt_api_token, salt_api_jobs
from saltjob.salt_token_id import token_id
from saltjob.tasks import scanHostJob

ins = salt_api_token({'fun': 'cp.push'},
                     SALT_REST_URL, {'X-Auth-Token': token_id()})
print(ins.CmdRun())
i = ins.sshRun()
print(i)
ins = salt_api_token({'fun': 'key.list_all'},
                     SALT_REST_URL, {'X-Auth-Token': token_id()})
print(ins.wheelRun()['return'][0]['data']['return'])
minions_list_all = salt_api_jobs(
    url=SALT_REST_URL + '/jobs',
    token=token_id()
)
voilet_test = minions_list_all.run()
while True:
    print(voilet_test)
rs = open('/home/kira/dev/github/saltops/doc/script/ls.sls', 'r')

r = yaml.load(rs)
print(r)
Exemplo n.º 5
0
def scanHostJob():
    logger.info('扫描Minion启动状态列表')
    upList = []
    try:
        manageInstance = salt_api_token({'fun': 'manage.status'},
                                        SALT_REST_URL,
                                        {'X-Auth-Token': token_id()})
        statusResult = manageInstance.runnerRun()
        upList = statusResult['return'][0]['up']
    except Exception as e:
        logger.info("没有任何主机启动状态信息:%s" % e)

    logger.info("扫描客户端注册列表")
    minions_rejected = []
    minions_denied = []
    minions_pre = []
    try:
        minionsInstance = salt_api_token({'fun': 'key.list_all'},
                                         SALT_REST_URL,
                                         {'X-Auth-Token': token_id()})
        minionList = minionsInstance.wheelRun()['return'][0]['data']['return']
        minions_pre = minionList['minions_pre']
        logger.info("待接受主机:%s" % len(minions_pre))
        # minions = minionList['minions']
        minions_rejected = minionList['minions_rejected']
        logger.info("已拒绝主机:%s", len(minions_rejected))

        minions_denied = minionList['minions_denied']
        logger.info("已禁用主机:%s", len(minions_denied))
    except Exception as e:
        logger.info("扫描主机键值状态异常:%s" % e)
        # logger.info("自动主机")
        # for minion in minions_pre:
        #     logger.info("自动接受主机:%s" % minion)
        #     salt_api_token({'fun': 'key.accept', 'match': minion},
        #                    SALT_REST_URL, {'X-Auth-Token': token_id()}).wheelRun()
        # rs = Host.objects.filter(host_name=minion)
        # if len(rs) == 0:
        #     try:
        #         device = Host(host_name=minion, minion_status=2)
        #         device.save()
        #     except Exception as e:
        #         logger.info(e)

    logger.info("获取Minion主机资产信息")
    result = salt_api_token({
        'fun': 'grains.items',
        'tgt': '*'
    }, SALT_REST_URL, {
        'X-Auth-Token': token_id()
    }).CmdRun()['return'][0]
    logger.info("扫描Minion数量为[%s]", len(result))
    Host.objects.update(minion_status=0)

    for host in result:
        try:
            minionstatus = 0
            if host in upList:
                minionstatus = 1
            if host in minions_rejected:
                minionstatus = 3
            if host in minions_denied:
                minionstatus = 4

            rs = Host.objects.filter(host_name=host, host=result[host]["host"])
            if len(rs) == 0:
                logger.info("新增主机:%s", result[host]["host"])
                device = Host(
                    host_name=host,
                    kernel=result[host]["kernel"],
                    kernel_release=result[host]["kernelrelease"],
                    virtual=result[host]["virtual"],
                    host=result[host]["host"],
                    osrelease=result[host]["osrelease"],
                    saltversion=result[host]["saltversion"],
                    osfinger=result[host]["osfinger"],
                    os_family=result[host]["os_family"],
                    num_gpus=result[host]["num_gpus"],
                    system_serialnumber=result[host]["system_serialnumber"]
                    if 'system_serialnumber' in result[host] else
                    result[host]["serialnumber"],
                    cpu_model=result[host]["cpu_model"],
                    productname=result[host]["productname"],
                    osarch=result[host]["osarch"],
                    cpuarch=result[host]["osarch"],
                    os=result[host]["os"],
                    # num_cpus=int(result[host]["num_cpus"]),
                    mem_total=result[host]["mem_total"],
                    minion_status=minionstatus)
                device.save()
                for ip in result[host]["ipv4"]:
                    hostip = HostIP(ip=ip, host=device)
                    hostip.save()
            else:
                entity = rs[0]
                logger.info("更新主机:%s", entity)
                entity.kernel = result[host]["kernel"]
                # entity.num_cpus = result[host]["num_cpus"],
                entity.kernel_release = result[host]["kernelrelease"]
                entity.virtual = result[host]["virtual"]
                entity.osrelease = result[host]["osrelease"],
                entity.saltversion = result[host]["saltversion"]
                entity.osfinger = result[host]["osfinger"]
                entity.os_family = result[host]["os_family"]
                entity.num_gpus = result[host]["num_gpus"]
                entity.system_serialnumber = result[host]["system_serialnumber"] \
                    if 'system_serialnumber' in result[host] else result[host]["serialnumber"]
                entity.cpu_model = result[host]["cpu_model"]
                entity.productname = result[host]["productname"]
                entity.osarch = result[host]["osarch"]
                entity.cpuarch = result[host]["osarch"]
                entity.os = result[host]["os"]
                entity.mem_total = result[host]["mem_total"]
                entity.minion_status = minionstatus
                entity.save()

                HostIP.objects.filter(host=entity).delete()
                for ip in result[host]["ipv4"]:
                    hostip = HostIP(ip=ip, host=entity)
                    hostip.save()

        except Exception as e:
            logger.error("自动扫描出现异常:%s", e)

    logger.info("扫描Salt-SSH主机信息")
    sshResult = salt_api_token({
        'fun': 'grains.items',
        'tgt': '*'
    }, SALT_REST_URL, {
        'X-Auth-Token': token_id()
    }).sshRun()['return'][0]
    logger.info("扫描主机数量为[%s]", len(sshResult))
    for host in sshResult:
        try:
            if 'return' in sshResult[host]:
                rs = Host.objects.filter(host=host)
                if rs is not None:
                    entity = rs[0]
                    logger.info("更新主机:%s", host)
                    entity.host_name = sshResult[host]['return'][
                        'fqdn'] if 'fqdn' in sshResult[host]['return'] else ""
                    entity.kernel = sshResult[host]['return']['kernel']
                    entity.kernel_release = sshResult[host]['return'][
                        'kernelrelease']
                    entity.virtual = sshResult[host]['return']['virtual']
                    entity.osrelease = sshResult[host]['return']['osrelease']
                    entity.saltversion = sshResult[host]['return'][
                        'saltversion']
                    entity.osfinger = sshResult[host]['return']['osfinger']
                    entity.os_family = sshResult[host]['return']['os_family']
                    entity.num_gpus = sshResult[host]['return']['num_gpus']
                    entity.system_serialnumber = sshResult[host]['return'][
                        "serialnumber"]
                    entity.cpu_model = sshResult[host]['return']["cpu_model"]
                    entity.productname = sshResult[host]['return'][
                        "productname"]
                    entity.osarch = sshResult[host]['return']["osarch"]
                    entity.cpuarch = sshResult[host]['return']["cpuarch"]
                    entity.os = sshResult[host]['return']["os"]
                    # entity.num_cpus = int(sshResult[host]['return']["num_cpus"]),
                    # entity.mem_total = int(sshResult[host]['return']["mem_total"]),
                    entity.minion_status = 1
                    entity.save()
                    HostIP.objects.filter(host=entity).delete()
                    for ip in sshResult[host]['return']["ipv4"]:
                        hostip = HostIP(ip=ip, host=entity)
                    hostip.save()

        except Exception as e:
            traceback.print_exc()