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

问题描述 投票:0回答:6

我的服务器上有几个文件需要从

ansible playbook
下载,但由于连接很可能会中断,所以我想在下载后检查它们的完整性。

我正在考虑两种方法:

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

第一个方法引入了在ansible中维护md5的开销。因此,每次有人添加新文件时,他都需要确保将 md5 添加到正确的位置。

但作为一个优点,有一个解决方案,将

get_url

 操作的内置检查与 
checksum=md5
 结合使用。例如:

action: get_url: url=http://example.com/path/file.conf dest=/etc/foo.conf checksum=md5:66dffb5228a211e61d6d7ef4a86f5758

第二种

方法更加优雅,并且缩小了责任范围。当有人在服务器上添加新文件时,他会确保也添加 .md5,甚至不需要使用 ansible 剧本。


有没有办法使用

checksum

方法来匹配文件中的md5?

    

md5 ansible integrity md5-file
6个回答
22
投票

下载 .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
中具有文件名),则行为会发生显着变化。

另请注意,您可能需要力量:true。这将导致每次运行时都会下载一个新文件。仅当下载文件时才会触发校验和。如果该文件已存在于您的主机上,则不会费心验证现有文件的总和,这可能是不可取的。

为了避免每次都下载,您可以统计文件是否已存在,查看其总和是多少,并有条件地设置强制参数。

- 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 文件,然后使用 Lookup 从中读取。 


3
投票

- stat: path: "path/to/your/file" register: your_file_info - debug: var: your_file_info.stat.md5



2
投票

  1. http://docs.ansible.com/ansible/stat_module.html

    使用stat模块提取md5值并将其注册到变量中

  2. http://docs.ansible.com/ansible/copy_module.html

    使用copy模块从服务器复制文件时,将md5的返回值注册到另一个变量中

  3. http://docs.ansible.com/ansible/playbooks_conditionals.html

    使用此条件模块比较上述2个变量并打印结果无论文件是否正确复制


1
投票
url

查找(在 ansible-2.3.1.0 上测试): - name: Download get_url: url: "http://localhost/file" dest: "/tmp/file" checksum: "md5:{{ lookup('url', 'http://localhost/file.md5') }}"



0
投票
https://pypi.org/project/checksumdir

的帮助下编写了一个ansible模块 该模块可以在

这里

找到 示例:

- get_checksum: path: path/to/directory checksum_type: sha1/md5/sha256/sha512 register: checksum



0
投票

- name: download the country data get_url: url: "{{ pbf_url }}" dest: "{{ data_dir }}" tmp_dest: "{{ tmp_dir }}" checksum: "md5:{{ lookup('url', pbf_url + '.md5', split_lines=False).split()[0] }}"

 
url 查找

返回行列表,因此 split_lines 标志禁用拆分。然后,md5文件(

md5sum
命令的结果)里面有一个文件名,如下所示:
8596eb4d50e63bff41c7121c8964e44a  estonia-latest.osm.pbf

为了只获得第一部分,我做
.split()[0]

    

© www.soinside.com 2019 - 2024. All rights reserved.