it-roy-ru.com

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

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

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

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

Подход first вводит накладные расходы на поддержание 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 PlayBook.

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

7
Vlad Manuel Mureșan

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

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

- 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 и последующего использования поиска для его чтения. 

15
barnesm999

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

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

- debug:
    var: your_file_info.stat.md5
2
modle13

Элегантное решение будет использовать нижеприведенные 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

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

1
Ganesan Srinivasan

Другое решение - использовать url lookup (протестировано на ansible-2.3.1.0):

- name: Download
  get_url:
    url: "http://localhost/file"
    dest: "/tmp/file"
    checksum: "md5:{{ lookup('url', 'http://localhost/file.md5') }}"
0
alius.miles