Ansible:已更改=0

Ansible:已更改=0,ansible,Ansible,我想知道在某些情况下,ansible显示“changed=0”,甚至连playbook任务都成功执行了,ok=2。 当使用REST API和URI模块时,这种情况就发生了。 我试图找到一个解释,但没有成功。 谁能告诉我原因是什么?如果我一起在多台服务器上进行更改,而不是手动检查更改是否完成,这将是一个大问题。 谢谢 Ansible中“更改”和“确定”之间的关键区别在于所有模块之间就什么是“确定”和什么是“更改”达成了内部一致 当一个模块认为它的动作改变了某些东西时(例如,在模块执行前主体的状态和

我想知道在某些情况下,ansible显示“changed=0”,甚至连playbook任务都成功执行了,ok=2。 当使用REST API和URI模块时,这种情况就发生了。 我试图找到一个解释,但没有成功。 谁能告诉我原因是什么?如果我一起在多台服务器上进行更改,而不是手动检查更改是否完成,这将是一个大问题。
谢谢

Ansible中“更改”和“确定”之间的关键区别在于所有模块之间就什么是“确定”和什么是“更改”达成了内部一致

当一个模块认为它的动作改变了某些东西时(例如,在模块执行前主体的状态和执行后主体的状态不同),它需要向Ansible报告“已改变”。如果没有有意义的更改(“有意义”的定义留给模块),则会报告“ok”。有时模块可以提前检测是否需要更改(例如:不需要创建目录,因为它已经存在),有时只有在执行操作后才能检测到(例如,某些应用程序报告“未更改”尝试的重新配置)

现在让我们看看
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
如您所见,我们有一个协议,即“200或201”已“更改”,而“304”未更改(但可以)。此协议由服务器和Ansible角色支持

对于不太精确的情况,您可以在:True时说
changed\u,您的任务将始终“更改”(失败和跳过除外)。

简而言之:

  • changed
    表示模块实现了它应该实现的更改
  • ok
    表示无需更改
例如:如果要将文件复制到远程节点,则如果文件在远程目标上不存在且由ansible模块显式复制,则模块将调试
change=1
,而当文件在远程节点上已存在且具有相同名称和内容时,模块将调试
ok=1