我正在检查模式下使用 zypper 模块来测试是否安装了某个软件包,并根据此信息执行后续任务。
- name: check if {{ package }} is installed
community.general.zypper:
name: "{{ package }}"
state: installed
register: _package_installed
check_mode: true
- name: change a file from {{ package }}
lineinfile:
...
when: _package_installed.changed
这有效。但令人恼火的是,在
check_mode
中运行的步骤返回“已更改”状态,并且在 PLAY RECAP 中显示为“已更改”状态,即使实际上并未在目标系统上应用任何更改。仅仅查看 RECAP 的用户可能会错误地认为该剧实际上修改了系统。
使用
changed_when: false
不是一个选项,因为它会导致后面的 when:
子句始终返回 false。我可以求助于解析 zypper 模块的标准输出,但我想避免这种情况,因为它很容易出错,并且该解决方案将是该模块独有的。
一般来说,这是不可能的。
如果任务被“更改”,无论是否在
check_mode
中,它都会在播放日志和游戏回顾中显示,除非设置了 changed_when: false
。对于某些模块,可以设置 changed_when: false
,注册结果,并在后面的条件中使用特定于模块的返回值(例如 rc
表示 ansible.builtin.command
)。
对于问题中提到的
zypper
特定问题,可以使用package_facts
来代替,正如@Zeitounator的评论中指出的那样。