如何让Ansible执行PowerShell脚本时返回‘OK(无变更)’状态?
Ansible执行PowerShell脚本时控制changed/OK状态的方法
默认情况下,win_command/win_shell/win_psexec这类模块只要执行成功(无错误退出码),就会返回changed状态——因为Ansible无法追踪PowerShell脚本内部的具体操作,只能确认脚本正常执行完毕,所以默认会标记为"有变更"。但并非必须如此,你可以通过以下两种方式让Ansible在无实际变更时返回OK状态:
方法一:用changed_when覆盖默认判定逻辑
这是最灵活且无需修改脚本的方案,直接在Ansible任务中定义判断规则:
- 基于脚本输出内容判断:约定脚本在无变更时输出特定标识(比如
NO_CHANGES),然后在任务中检查输出:
- name: 执行目标PowerShell脚本 win_shell: .\your_script.ps1 register: script_output changed_when: '"NO_CHANGES" not in script_output.stdout'
- 基于脚本退出码判断:提前约定退出码规则(比如
0=无变更,1=有变更),同时用failed_when避免把合法的非0退出码判定为失败:
- name: 执行目标PowerShell脚本 win_shell: .\your_script.ps1 register: script_result changed_when: script_result.rc == 1 failed_when: script_result.rc not in [0, 1]
方法二:改造PowerShell脚本输出结构化结果
如果允许修改脚本,可以让脚本输出符合Ansible解析逻辑的JSON格式结果,再在任务中解析判断:
比如在脚本末尾根据实际执行情况输出:
# 无变更时输出 Write-Output '{"changed": false, "msg": "未执行任何变更"}' # 有变更时输出 Write-Output '{"changed": true, "msg": "已完成预期变更"}'
对应的Ansible任务:
- name: 执行目标PowerShell脚本 win_shell: .\your_script.ps1 register: script_output changed_when: (script_output.stdout | from_json).changed
另外,win_psexec模块的判定逻辑和前两者完全一致,同样可以通过上述方法修改其返回的状态。
内容的提问来源于stack exchange,提问作者jerdub1993
相关产品推荐
相关产品推荐

