有没有办法检查 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
这避免了需要更新文件之一的散列。
我想知道是否有办法使用 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
这避免了需要更新文件之一的散列。