SaltStack编排状态中如何校验任意或指定2台minion执行成功?
SaltStack实现指定数量节点成功校验的方案
SaltStack原生salt.function状态默认要求所有匹配的目标节点执行成功才会返回通过,没有内置successful_count这类参数,要实现指定成功节点数的校验,可采用以下两种方案:
方案一:Jinja+Runner直接实现(无额外开发成本)
直接在状态文件中通过Jinja模板先批量执行检查命令,统计成功节点数后再做校验,适合临时需求:
{# 先批量在所有目标节点执行namenode进程检查 #} {% set nn_check_result = salt.saltutil.runner('cmd.run', tgt='G@stype:hbase and G@pod_name:example_pod', tgt_type='compound', cmd='ps aux | grep [n]amenode || exit 1' ) %} {# 统计返回码为0(执行成功)的节点数量 #} {% set success_count = nn_check_result | selectattr('retcode', 'equalto', 0) | list | length %} {# 校验成功数量是否符合预期 #} 2_3_example_pod_is_nn_running: test.check_fail: - name: "Namenode运行数量校验失败:预期2个节点正常,实际为{{ success_count }}个" - failhard: True - onlyif: - fun: test.ne value: {{ success_count }} expected: 2
方案二:自定义状态模块(可复用性更高)
如果后续频繁需要用到按成功数校验的逻辑,可以自定义状态模块封装逻辑,调用更简洁:
- 在Salt Master的
/srv/salt/_states/目录下新建check_success_count.py文件,写入以下内容:
def cmd_run(name, tgt, tgt_type='glob', expected_success=1, **kwargs): """ 批量在目标节点执行命令,校验成功执行的节点数符合预期 :param name: 要执行的shell命令 :param tgt: 目标节点匹配规则 :param tgt_type: 匹配规则类型,默认glob,支持compound、grain等 :param expected_success: 预期执行成功的节点数量 """ ret = {'name': name, 'result': False, 'changes': {}, 'comment': ''} # 调用runner模块批量执行命令 exec_result = __salt__['saltutil.runner']('cmd.run', tgt=tgt, tgt_type=tgt_type, cmd=name, **kwargs) # 统计成功节点数 success_nodes = [node for node, res in exec_result.items() if res.get('retcode', 1) == 0] if len(success_nodes) == expected_success: ret['result'] = True ret['comment'] = f"校验通过:成功执行节点数{len(success_nodes)},符合预期值{expected_success}" return ret ret['comment'] = f"校验失败:预期成功节点数{expected_success},实际为{len(success_nodes)}" return ret
- 执行命令同步自定义模块到所有节点:
salt '*' saltutil.sync_states - 之后直接在状态文件中调用即可:
2_3_example_pod_is_nn_running: check_success_count.cmd_run: - name: ps aux | grep [n]amenode || exit 1 - tgt: 'G@stype:hbase and G@pod_name:example_pod' - tgt_type: compound - expected_success: 2 - failhard: True
补充说明
- 进程检查命令中用
grep [n]amenode的写法是为了避免匹配到grep自身进程,减少误判 - 如果需要校验至少2个节点成功,把代码中的等于判断改为大于等于即可
- 自定义模块可以根据需求扩展支持其他salt函数的成功数校验,仅需调整入参和执行逻辑即可
内容的提问来源于stack exchange,提问作者Ming Hsieh
相关产品推荐
相关产品推荐

