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
我目前正在尝试获取存储在 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