You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

方案二:自定义状态模块(可复用性更高)

如果后续频繁需要用到按成功数校验的逻辑,可以自定义状态模块封装逻辑,调用更简洁:

  1. 在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
  1. 执行命令同步自定义模块到所有节点:
    salt '*' saltutil.sync_states
  2. 之后直接在状态文件中调用即可:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 07:15:03