我在服务器上有几个文件需要从 ansible playbook
下载,但因为连接很可能会中断,所以我想在下载后检查它们的完整性。
我正在考虑两种方法:
file.extension
和 file.extension.md5
. 第一 方法引入了在 ansible 中维护 md5s 的开销。因此,每次有人添加新文件时,他都需要确保在正确的位置添加了 md5。
但作为一个优势,有一个解决方案,使用来自
get_url
的内置检查。与 checksum=md5
一起行动.例如。:action: get_url: url=http://example.com/path/file.conf dest=/etc/foo.conf checksum=md5:66dffb5228a211e61d6d7ef4a86f5758
第二个方法更优雅,责任更窄。当有人在服务器上添加新文件时,他会确保添加
.md5
同样,甚至不需要使用 ansible playbook。有没有办法使用
checksum
从文件匹配md5的方法?
最佳答案
如果您希望采用将校验和存储在服务器上的文件中的方法,您绝对可以使用 get_url 校验和 arg 来验证它。
下载 .md5 文件并将其读入 var:
- set_fact:
md5_value: "{{ lookup('file', '/etc/myfile.md5') }}"
然后当你下载文件时,将 md5_value 的内容传递给 get_url:
- get_url:
url: http://example.com
dest: /my/dest/file
checksum: "md5:{{ md5_value }}"
force: true
请注意,在
dest
中指定文件路径至关重要。 ;如果您将其设置为目录(并且在 url
中有一个文件名),则行为会发生显着变化。另请注意,您可能需要 force: true。这将导致每次运行时都会下载一个新文件。校验和仅在下载文件时触发。如果该文件已存在于您的主机上,则无需验证现有文件的总和,这可能是不可取的。
为避免每次可以统计文件是否已存在时下载,请查看其总和是多少,并有条件地设置 force 参数。
- stat:
path: /my/dest/file
register: existing_file
- set_fact:
force_new_download: "{{ existing_file.stat.md5 != md5_value }}"
when: existing_file.stat.exists
- get_url:
url: http://example.com
dest: /my/dest/file
checksum: "md5:{{ md5_value }}"
force: "{{ force_new_download | default ('false') }}"
此外,如果您从某种 Web 服务器中提取总和/工件,您实际上可以直接从 url 获取总和的值,而无需实际将文件下载到主机。这是一个使用 Nexus 服务器的示例,该服务器将托管工件及其总和:
- set_fact:
md5_value: "{{ item }}"
with_url: http://my_nexus_server.com:8081/nexus/service/local/artifact/maven/content?g=log4j&a=log4j&v=1.2.9&r=central&e=jar.md5
这可以用来代替使用 get_url 下载 md5 文件,然后使用查找从中读取。
关于md5 - 是否有一种优雅的方法可以使用从服务器获取的 md5 文件在 ansible 中使用 md5 检查文件完整性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36448944/