使跳过的任务显示为“确定”

使跳过的任务显示为“确定”

我有一些 ansible 任务,分两部分运行。第一部分设置条件,第二部分用于when有条件地执行。伪示例:

- name: check if installed
  command: (...)
  register: is_installed

- name: run install script
  when: is_installed.stdout == "yes"
  command: (...)

第二项任务显示为“已跳过”。这其实不对,我并没有放弃安装,但确认已经完成,因此应该显示为“OK”。只有当给定主机不需要此步骤时,它才应该显示“已跳过”。我知道这只是表面现象,但我仍然想知道是否有办法让它显示“OK”。

我尝试changed_when设置False。虽然这会将结果设置为 OK,但它仍会运行该命令。有人要求ok_when设置,但被拒绝了,我不确定开发人员是否理解该请求。

答案1

我在这里想不出通用的解决方案。但如果任务确实安装了某些东西,您可以删除第一部分并添加creates第二部分以实施检查。

- name: run install script
  creates: /path/to/installation
  command: (...)

答案2

when:评估为 false 会导致该任务的状态为 skipped。在 skipped 上打印一些内容来自标准输出回调插件。对于基于默认的回调,可以使用display_skipped_hosts配置项全局禁用此功能。请参阅文档: ansible-doc -t callback default

一个优雅的解决方案是将其包装在真正的包管理器中,然后安装它。Ansible 有多个幂等包管理器模块。

或者,可以安全地重新运行安装脚本,并在成功时返回零代码。


虽然我不代表开发人员发言,但他们对向核心添加功能非常谨慎。他们可能没有发现报告为跳过的任务存在问题,并不是每个游戏的每个任务都会运行。

when:控制任务是否运行。changed_when:failed_when:在任务运行后修改其状态,例如基于返回代码或标准输出。这些功能共同控制任务的状态是已更改还是失败,即使对于通用命令任务也是如此。

为了更好地控制幂等性,请使用不太通用的模块。如果您仍然对打印的内容感到不快,请考虑使用自定义回调插件。

答案3

如何修改“检查是否安装”任务中执行的命令,当需要安装时退出 0,当不需要安装时退出 1,并利用 shell && 来控制链式命令的执行。

您还可以反转逻辑(check_script exit 0 表示它已经存在,exit 1 表示缺少内容,需要安装)并使用 || 将链式脚本粘合在一起。

然后你可以在剧本中执行单项任务:

- name: install stuff where needed
  shell: <check_command> && <install_command>
  register: installtask
  changed_when: "<check_stdout_indicating_install_required>" in installtask.stdout

此任务将始终运行,但根据检查脚本的退出状态,安装部分将在目标主机上执行或不执行。changed_when 可以控制显示“OK”或“Changed”作为此任务的结果,具体取决于实际安装是否发生。

如果由于 <install_script> 而将至少一个文件添加到系统中,那么如其他答案中一样的“creates: <file/path>”将处理整个场景。

相关内容