status

使用方法: salt-run manage.status

功能: 输出所有已知的minions的状态, 以up和down分组输出

核心代码及补充的代码说明:

client = salt.client.LocalClient(__opts__['conf_file'])

minions = client.cmd('*', 'test.ping', timeout=__opts__['timeout'])   #利用client.cmd对所有的minion发送test.ping指令,用于探测minion


是否存活


key = salt.key.Key(__opts__)

keys = key.list_keys()                  # 利用salt.key获取当前master上有多少minion的key,即获取到完整的minion列表


ret = {}

ret['up'] = sorted(minions)         # 将执行test.ping有返回值的minion即存活的minion的ID放入up中

ret['down'] = sorted(set(keys['minions']) - set(minions))   #完整的minion列表减去存活的minion就是down掉/无法连接的minion喽

if output:

    salt.output.display_output(ret, '', __opts__)    # 输出

return ret

总结: 该方法果然很给力,从此妈妈再也不担心不知道minion是否存活喽

key_regen

使用方法: salt-run manage.key_regen

功能: 重新生成环境下的所有key (副作用甚强,慎用,慎用, 除非你知道在做什么)

核心代码及补充的代码说明:

minions = client.cmd('*', 'saltutil.regen_keys')     # 执行saltutil.regen_keys,重新生成key

总结: 慎用,慎用,慎用

down

使用方法: salt-run manage.down

功能: 输出down掉/无法连接的minion

核心代码及补充的代码说明:

ret = status(output=False).get('down', [])   # 直接用之前的status方法,然后获取down的minion列表

总结: 函数编程果然是王道,省时省力,直接通过该方法查询down掉的minion,再也不麻烦了

up

使用方法: salt-run manage.up

功能: 输出存活的minion

核心代码及补充的代码说明:

ret = status(output=False).get('up', [])   # 和上边直接down一样,不过这次的需求变成了up而已

总结: 和楼上类似

versions

使用方法: salt-run manage.versions

功能: 输出所有存活的minion的版本和master的版本对比情况

核心代码及补充的代码说明:

minions = client.cmd('*', 'test.version', timeout=__opts__['timeout'])  # 通过client.cmd方法下发所有minion需要执行test.version(输出


版本号)的指令


labels = {                        # 定义版本对比的描述

    -1: 'Minion requires update',

    0: 'Up to date',

    1: 'Minion newer than master',

}


version_status = {}


comps = salt.__version__.split('-')    # 获取master version

if len(comps) == 3:

    master_version = '-'.join(comps[0:2])

else:

    master_version = salt.__version__

for minion in minions:

    comps = minions[minion].split('-')

    if len(comps) == 3:

        minion_version = '-'.join(comps[0:2])

    else:

        minion_version = minions[minion]

    ver_diff = cmp(minion_version, master_version)   # 通过python的cmp方法对版本号进行对比


    if ver_diff not in version_status:

        version_status[ver_diff] = []

    version_status[ver_diff].append(minion)


ret = {}

for key in version_status:

    for minion in sorted(version_status[key]):

        ret.setdefault(labels[key], []).append(minion)


salt.output.display_output(ret, '', __opts__)

return ret

总结: 利用本方法,哪些minion需要升级立马得知,谁用谁知道啊!