Ansible 从 URL 获取二进制文件的哈希值

Ansible get hash of binary file from URL

我目前正在尝试获取存储在 URL.
中的二进制文件的哈希值 所以我首先尝试:

hash: {{ lookup('url', my_url) | hash('sha1') }}

这确实会生成 a 哈希,但不是我预期的那样。
为了验证我制作了一个简单的模板文件,其中只有 {{ lookup('url', my_url) }} 有什么不同。查看该文件,似乎 URL 的内容在文件中输出之前被解释为文本并编码为不同的编码。我不太了解这种模式,但是设​​置了最高位的字节在输出中得到了严格的管理。
此外,将 split_lines 参数设置为 false 并不能解决问题。但是,它会导致生成的文件中有几个字节不同。将所有逗号更改为换行符。有点道理,但也有点不合理,因为将该选项设置为 true(默认值),结果不会打印为列表。

我也不能完全使用 uri 内置函数,因为我需要对 URL 的动态列表执行此操作。

最小示例(角色):

tasks/main.yml:

- name: "Example"
  template:
    src: example.yml.j2
    dest: example.yml
    lstrip_blocks: true
    trim_blocks: true

defaults/main.yml:

url_list: ["http://example.com/file1.zip", "http://example.com/file2.zip"]

templates/example.yml.j2:

hashes:
  {% for url in url_list %}
  - {{ lookup('url', url) | hash('sha1') }}
  {% endfor %}

问:"url_list因主机而异。"

A:例如,给定文件

example.com> for i in *.zip; do sha1 $i; done
SHA1 (file1.zip) = af16fa8e5f3ee18d1c1cf20f2d3816b8b2141c02
SHA1 (file2.zip) = 39b0436794261f51793b1bb772c4731c35850c73
SHA1 (file3.zip) = 2cb291abfed23e3b98009cd6eca754d05dd99559
SHA1 (file4.zip) = d00308e4fb7b924eb4adaa06a859cabec7c4cbae

example.com> for i in *.zip; do md5 $i; done
MD5 (file1.zip) = 937e4d2ea0df44e995d796b0a32ad548
MD5 (file2.zip) = b5c3bb57f8b59815467c89c6beacc41f
MD5 (file3.zip) = e6627cd2113334374cb3e9b0129ff372
MD5 (file4.zip) = 52f421b3608b9cc7df1f6a38d437db97

host_vars

shell> cat host_vars/test_11
url_list:
  - http://example.com:8080/file1.zip
  - http://example.com:8080/file2.zip

shell> cat host_vars/test_12
url_list:
  - http://example.com:8080/file3.zip
  - http://example.com:8080/file4.zip

使用get_url,例如

- hosts: test_11,test_12
  tasks:
    - tempfile:
        state: directory
      register: tempfile
    - get_url:
        url: "{{ item }}"
        dest: "{{ tempfile.path }}"
      loop: "{{ url_list }}"
      register: result

结果默认包含md5

    - set_fact:
        hashes: "{{ result.results|map(attribute='md5sum')|list }}"

给予

ok: [test_11] => 
  hashes:
  - 937e4d2ea0df44e995d796b0a32ad548
  - b5c3bb57f8b59815467c89c6beacc41f
ok: [test_12] => 
  hashes:
  - e6627cd2113334374cb3e9b0129ff372
  - 52f421b3608b9cc7df1f6a38d437db97

如果您想要不同的哈希值,请获取它,例如

    - command:
        cmd: "sha1 -q {{ item }}"
      loop: "{{ result.results|map(attribute='dest')|list }}"
      register: hresult
    - set_fact:
        hashes: "{{ hresult.results|map(attribute='stdout')|list }}"

给予

ok: [test_11] => 
  hashes:
  - af16fa8e5f3ee18d1c1cf20f2d3816b8b2141c02
  - 39b0436794261f51793b1bb772c4731c35850c73
ok: [test_12] => 
  hashes:
  - 2cb291abfed23e3b98009cd6eca754d05dd99559
  - d00308e4fb7b924eb4adaa06a859cabec7c4cbae