我想知道在某些情况下,ansible 显示“已更改 = 0”,即使剧本任务已成功执行且 ok = 2。使用 Rest API 和 uri 模块时会发生这种情况。我试图找到一个解释但没有成功。任何人都可以建议是什么原因?如果我在许多服务器上一起进行更改,而我没有手动检查更改是否已完成,这将是一个大问题。谢谢!
Ansible 中“已更改”和“确定”之间的主要区别在于所有模块之间关于“确定”和“已更改”的内部协议。
当一个模块认为它的动作改变了某些东西(例如,模块执行之前的主题状态和之后的状态不同),它需要向 Ansible 报告“已更改”。如果没有有意义的更改(“有意义”的定义留给模块),则它会报告“确定”。有时模块可以提前检测是否需要更改(例如:不需要创建目录,因为它已经存在),有时只能在执行操作后才能检测到(例如某些应用程序报告“未更改”到尝试重新配置)。
现在让我们看看url模块。url请求后,模块如何猜测远程 http/s 服务器上的某些内容是否已更改?事实是,它有时可以。如果服务器以“已更新”之类的内容回答,则模块可以报告“已更改”。但是如果服务器回答是“200 OK”怎么办?所以,这里没有“改变”。
该怎么办?
Ansible 有一个功能:您可以通过声明“已更改”的条件来覆盖默认模块“已更改”状态。
例子
这是我对 API 服务器的真实配置的一个示例:
uri:
method: POST
url: http://{{ api_address }}:{{api_port }}/config
body_format: raw
headers:
Content-Type: text/plain
body: '{{ {"global_config": global_config} |to_yaml }}'
status_code:
- 200
- 304
- 201
register: config_post
changed_when: config_post.status == 200 or config_post.status == 201
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我们有一个协议,即“200 或 201”已“更改”,而“304”未更改(但没问题)。该协议由服务器和 Ansible 角色支持。
对于不太精确的情况,您可以说changed_when: True您的任务将始终“更改”(失败和跳过除外)。
| 归档时间: |
|
| 查看次数: |
4771 次 |
| 最近记录: |