Существует ли элегантный способ проверки целостности файлов с помощью md5 в ansible с использованием файлов md5, полученных с сервера?

У меня есть несколько файлов на сервере, которые мне нужно скачать с ansible playbook, но поскольку соединение имеет хорошие шансы на прерывание, я хотел бы проверить их целостность после загрузки.

Я рассматриваю два подхода:

  1. Храните md5 из этих файлов в ansible как vars
  2. Сохраните md5 этих файлов на сервере как файлы с расширением.md5. Такая пара будет выглядеть так: file.extension а также file.extension.md5,

Первый подход вводит накладные расходы на поддержание md5s в ansible. Поэтому каждый раз, когда кто-то добавляет новый файл, он должен убедиться, что он добавляет md5 в нужное место.

Но в качестве преимущества, есть решение для этого, используя встроенную проверку от get_url действие в сочетании с checksum=md5, Например:

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

Второй подход более элегантен и сужает ответственность. Когда кто-то добавляет новый файл на сервер, он обязательно добавит .md5 а также и не нужно даже использовать ANSIBLE Playbooks.

Есть ли способ использовать checksum подходить, чтобы соответствовать md5 из файла?

4 ответа

Решение

Если вы хотите использовать свой метод хранения контрольной суммы в файлах на сервере, вы можете использовать аргумент контрольной суммы 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), поведение существенно меняется.

Обратите внимание, что вам, вероятно, нужна сила: true. Это приведет к загрузке нового файла каждый раз, когда вы его запускаете. Контрольная сумма срабатывает только при загрузке файлов. Если файл уже существует на вашем хосте, он не потрудится проверить сумму существующего файла, что может быть нежелательно.

Чтобы избежать загрузки каждый раз, когда вы можете получить статистику, чтобы увидеть, существует ли файл уже, посмотрите, какова его сумма, и установите параметр force условно.

- 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') }}"

Кроме того, если вы извлекаете суммы / артефакты с какого-либо веб-сервера, вы можете получить значение суммы прямо из 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 и последующего использования поиска для его чтения.

С модулем статистики:

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

- debug:
    var: your_file_info.stat.md5

Элегантное решение будет использовать нижеприведенные 3 модуля, предоставленные самим ansible

  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

    используйте этот условный модуль, чтобы сравнить две вышеуказанные переменные и распечатать результаты независимо от того, правильно ли скопирован файл или нет

Другое решение - использовать поиск по 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') }}"

Написал доступный модуль с помощью https://pypi.org/project/checksumdir

Модуль можно найти здесь

Пример:

- get_checksum: 
    path: path/to/directory
    checksum_type: sha1/md5/sha256/sha512
  register: checksum
Другие вопросы по тегам