SaltStack状态中获取返回码、解析stdout并控制执行流程的方法
在SaltStack状态中获取返回码与解析stdout
一、获取命令的返回码
SaltStack中可以通过以下方式获取cmd.run状态的返回码:
指定期望返回码
在cmd.run中通过retcode参数定义命令执行成功的返回码,若实际返回码不符,该状态会标记为失败:check_satellite_registration: cmd.run: - name: subscription-manager list - retcode: 0 # 定义命令成功的返回码为0通过模块调用获取返回码
使用cmd.retcode模块直接获取命令的返回值,可在Jinja模板中用于条件判断:{% set reg_retcode = salt['cmd.retcode']('subscription-manager list') %}
二、解析stdout并控制后续状态执行
针对你需要判断stdout中Status是否为Subscribed的需求,提供两种实现方式:
方式1:通过onlyif/unless直接校验
利用Shell管道和grep在后续状态的条件中直接校验输出,无需额外解析步骤:
# 执行注册检查命令 check_satellite_registration: cmd.run: - name: subscription-manager list # 仅当状态为Subscribed时,部署配置文件 deploy_http_conf: file.managed: - name: /etc/http/conf/http.conf - source: salt://apache/http.conf - onlyif: "subscription-manager list | grep -q 'Status: Subscribed'" # 若状态不是Subscribed,执行重新注册操作 re_register_satellite: cmd.run: - name: <你的重新注册命令> # 替换为实际注册命令 - unless: "subscription-manager list | grep -q 'Status: Subscribed'"
方式2:通过Jinja模板解析命令输出
使用cmd.run_all模块一次性获取命令的retcode、stdout和stderr,再通过Jinja条件判断逻辑决定执行的状态:
{% set reg_result = salt['cmd.run_all']('subscription-manager list') %} {# 同时校验返回码为0且Status为Subscribed #} {% if reg_result['retcode'] == 0 and reg_result['stdout'] is search('Status: Subscribed') %} deploy_http_conf: file.managed: - name: /etc/http/conf/http.conf - source: salt://apache/http.conf {% else %} {# 返回码异常或状态不符时,执行重新注册 #} re_register_satellite: cmd.run: - name: <你的重新注册命令> # 替换为实际注册命令 {% endif %}
说明:第二种方式仅在状态文件渲染时执行一次命令,第一种方式的onlyif/unless会在状态执行时再次调用命令,可根据实际场景选择。
内容的提问来源于stack exchange,提问作者Megazord
相关产品推荐
相关产品推荐

