我的服务器上有几个文件需要从
ansible playbook
下载,但由于连接很可能会中断,所以我想在下载后检查它们的完整性。
我正在考虑两种方法:
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 文件并将其读入 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 从中读取。
- stat:
path: "path/to/your/file"
register: your_file_info
- debug:
var: your_file_info.stat.md5
查找(在 ansible-2.3.1.0 上测试):
- name: Download
get_url:
url: "http://localhost/file"
dest: "/tmp/file"
checksum: "md5:{{ lookup('url', 'http://localhost/file.md5') }}"
的帮助下编写了一个ansible模块 该模块可以在
这里找到 示例:
- get_checksum:
path: path/to/directory
checksum_type: sha1/md5/sha256/sha512
register: checksum
- 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]
。