Ansible:已更改= 0

时间:2019-01-10 07:24:25

标签: ansible

我想知道在某些情况下,即使剧本任务已成功执行且ok = 2,ansible也会显示“ changed = 0”。 使用Rest API和uri模块时,会发生这种情况。 我试图找到一个没有成功的解释。 谁能告诉我原因是什么?如果我在不手动检查所做更改的许多服务器上进行更改,这将是一个大问题。 谢谢!

2 个答案:

答案 0 :(得分:1)

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

如您所见,我们已经达成共识,“ 200或201”已“更改”,而“ 304”未更改(但可以)。该协议由服务器和Ansible角色支持。

对于不太精确的情况,您只需说changed_when: True,您的任务将始终被“更改”(失败和跳过除外)。

答案 1 :(得分:0)

简而言之:

  • changed表示该模块已实现其应实现的更改
  • ok表示不需要进行更改。

例如::如果要将文件复制到远程节点,则模块调试change=1(如果文件在远程目标上不存在,并且由ansible显式复制)模块,而当文件已经存在于具有相同名称和内容的远程节点上时,它将调试ok=1