12

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

我正在考虑两种方法:

  1. 将这些文件的 md5 作为 vars 存储在 ansible 中
  2. 将这些文件的 md5 作为扩展名为 .md5 的文件存储在服务器上。这样的一对看起来像:file.extensionfile.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 剧本。

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

4

5 回答 5

21

如果您希望使用将校验和存储在服务器上的文件中的方法,您绝对可以使用 get_url 校验和参数来验证它。

下载 .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。这将导致每次运行时都会下载一个新文件。校验和仅在文件下载时触发​​。如果文件已经存在于您的主机上,则无需验证现有文件的总和,这可能是不可取的。

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

- 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 文件,然后使用查找来读取它。

于 2016-05-23T19:08:36.350 回答
2

使用 stat 模块:

- stat:
    path: "path/to/your/file"
  register: your_file_info

- debug:
    var: your_file_info.stat.md5
于 2017-05-09T15:18:52.957 回答
1

优雅的解决方案将使用 ansible 本身提供的以下 3 个模块

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

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

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

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

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

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

于 2016-04-15T11:11:20.293 回答
0

另一种解决方案是使用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') }}"
于 2017-07-28T12:44:49.163 回答
0

在https://pypi.org/project/checksumdir的帮助下编写了一个 ansible 模块

该模块可以在这里找到

例子:

- get_checksum: 
    path: path/to/directory
    checksum_type: sha1/md5/sha256/sha512
  register: checksum
于 2019-05-08T22:30:06.273 回答