是否有一种优雅的方法可以使用从服务器获取的md5文件在ansible中使用md5检查文件完整性?

Vla*_*șan 9 md5 integrity md5-file ansible ansible-playbook

我在服务器上有几个文件需要从a下载ansible playbook,但因为连接很有可能中断我想在下载后检查它们的完整性.

我正在考虑两种方法:

  1. 将这些文件的md5存储在ansible中作为vars
  2. 将这些文件的md5作为扩展名为.md5的文件存储在服务器上.这样的一对看起来像:file.extensionfile.extension.md5.

一种方法引入了维护md5s的开销.因此,每当有人添加新文件时,他需要确保将md5添加到正确的位置.

但作为一个优势,有一个解决方案,使用内置的get_url行动检查与结合checksum=md5.例如:

action: get_url: url=http://example.com/path/file.conf dest=/etc/foo.conf checksum=md5:66dffb5228a211e61d6d7ef4a86f5758
Run Code Online (Sandbox Code Playgroud)

第二个方法是更优雅和缩小的责任.当有人在服务器上添加新文件时,他会确保添加该文件.md5,甚至不需要使用ansible playbooks.

有没有办法使用该checksum方法匹配文件中的md5?

bar*_*999 19

如果您希望使用在服务器上的文件中存储校验和的方法,您肯定可以使用get_url校验和arg来验证它.

下载.md5文件并将其读入var:

- set_fact:
    md5_value: "{{ lookup('file', '/etc/myfile.md5') }}"
Run Code Online (Sandbox Code Playgroud)

然后在下载文件时,将md5_value的内容传递给get_url:

- get_url:
    url: http://example.com
    dest: /my/dest/file
    checksum: "md5:{{ md5_value }}"
    force: true
Run Code Online (Sandbox Code Playgroud)

请注意,指定文件的路径至关重要dest; 如果将其设置为目录(并且文件名为url),则行为会发生显着变化.

另请注意,您可能需要force:true.这将导致每次运行时都下载新文件.仅在下载文件时触发校验和.如果您的主机上已存在该文件,则无需验证现有文件的总和,这可能是不可取的.

为了避免每次你可以使用stat来查看文件是否已经存在,请查看其总和是什么,并有条件地设置force param.

- 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') }}"
Run Code Online (Sandbox Code Playgroud)

此外,如果您从某种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
Run Code Online (Sandbox Code Playgroud)

这可以用来代替使用get_url下载md5文件,然后使用lookup来读取它.