有没有办法检查 ansible 是否应用了补丁?

Is there a way to check with ansible if a patch has been applied?

我想知道是否有办法使用 ansible playbook 来确定是否应用了补丁。例如,我有一个 shell 脚本,我需要打补丁,然后使用它的打补丁版本。如果已打补丁,则跳过该任务。

此刻,当我尝试执行修补任务时,我的 playbook 失败了,因为它已在之前的尝试中完成,并且在尝试修补已修补文件时出错。 谢谢

您可能需要检查文件的 md5 并仅在校验和不是您预期的情况下才应用补丁:

- stat: path=/my/file get_md5=yes
  register: file_md5
- patch: ...
  when: file_md5.stat.md5 != myexpectedmd5

您也可以在打补丁前进行测试。

patch -R --dry-run -f  < patchfile;
if [ $? -eq 0 ] then
  patch -f < patchfile
fi

作为一行(并使用 || 而不是 if..then)将是:

patch -R --dry-run -f < patchfile || patch -R -f < patchfile

基本上它会尝试做一个 dry-运行 补丁 -R 尝试还原补丁,然后如果失败它会尝试修补它。

但这并非没有缺点,因为这两个命令都可能失败。

结合此处已给出的两个答案的一种方法是使用 patch, and then filtering against (with stat) 创建一个新的空文件,无论该文件是否存在,然后再应用补丁。

diff -urN mycode-0.1/is-patched mycode-0.1/is-patched
--- mycode-0.1/is-patched      1970-01-01 10:00:00.000000000 +1000
+++ mycode-0.1/is-patched      2018-04-18 10:00:00.000000000 +1000
@@ -0,0 +1 @@
+

那么作为你任务的一部分

- stat: path=/my/directory/is-patched
  register: mypatch
- patch: ...
  when: mypatch.stat.exists == false

这避免了需要更新文件之一的散列。