it-swarm.com.de

Gibt es eine elegante Möglichkeit, die Integrität von Dateien mit md5 zu überprüfen, indem md5-Dateien vom Server abgerufen werden?

Ich habe mehrere Dateien auf einem Server, die ich von einem ansible playbook herunterladen muss, aber da die Verbindung gute Unterbrechungschancen hat, möchte ich ihre Integrität nach dem Download überprüfen.

Ich denke über zwei Ansätze nach:

  1. Speichern Sie die MD5 dieser Dateien als VARs
  2. Speichern Sie das MD5 dieser Dateien auf dem Server als Dateien mit der Erweiterung .md5. Ein solches Paar würde wie folgt aussehen: file.extension und file.extension.md5.

Der first Ansatz führt zu Overhead bei der Pflege der MD5s in Ansible. Jedes Mal, wenn jemand eine neue Datei hinzufügt, muss er sicherstellen, dass er den md5 an der richtigen Stelle hinzufügt.

Aber als Vorteil gibt es eine Lösung dafür, indem die eingebaute Aktion check from get_url in Verbindung mit checksum=md5 verwendet wird. Z.B.:

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

Der zweite Ansatz ist eleganter und die Verantwortung wird enger. Wenn jemand eine neue Datei auf dem Server hinzufügt, stellt er sicher, dass auch der .md5 hinzugefügt wird, und muss nicht einmal die ansiblen Wiedergabebücher verwenden.

Gibt es eine Möglichkeit, den checksum-Ansatz zu verwenden, um den md5 aus einer Datei abzugleichen?

Wenn Sie die Methode zum Speichern der Prüfsumme in Dateien auf dem Server verwenden möchten, können Sie die get_url-Prüfsumme arg verwenden, um sie zu überprüfen. 

Laden Sie die .md5-Datei herunter und lesen Sie sie in eine var: 

- set_fact:
    md5_value: "{{ lookup('file', '/etc/myfile.md5') }}"

Wenn Sie die Datei herunterladen, übergeben Sie den Inhalt von md5_value an get_url: 

- get_url:
    url: http://example.com
    dest: /my/dest/file
    checksum: "md5:{{ md5_value }}"
    force: true

Beachten Sie, dass Sie unbedingt einen Pfad zu einer Datei in dest angeben müssen. Wenn Sie hier ein Verzeichnis festlegen (und einen Dateinamen in url haben), ändert sich das Verhalten erheblich.

Beachten Sie auch, dass Sie wahrscheinlich die Kraft benötigen: true. Dadurch wird bei jeder Ausführung eine neue Datei heruntergeladen. Die Prüfsumme wird nur ausgelöst, wenn Dateien heruntergeladen werden. Wenn die Datei bereits auf Ihrem Host vorhanden ist, muss die Summe der vorhandenen Datei nicht überprüft werden. Dies ist möglicherweise nicht wünschenswert. 

Um zu vermeiden, dass der Download jedes Mal durchgeführt werden kann, um festzustellen, ob die Datei bereits vorhanden ist, überprüfen Sie die Summe der Werte und stellen Sie den force-Parameter bedingt ein. 

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

Wenn Sie die Summen/Artefakte von einem Webserver abrufen, können Sie den Wert der Summe direkt aus der URL abrufen, ohne die Datei tatsächlich auf den Host herunterladen zu müssen. Hier ein Beispiel mit einem Nexus-Server, der die Artefakte und ihre Summen hosten würde:

- 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

Dies könnte anstelle von get_url verwendet werden, um die md5-Datei herunterzuladen, und dann mithilfe von Lookup aus ihr zu lesen. 

15
barnesm999

Mit dem stat Modul:

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

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

Bei der eleganten Lösung werden die unten genannten 3 Module von ansible selbst verwendet

  1. http://docs.ansible.com/ansible/stat_module.html

    verwenden Sie das Stat-Modul, um den MD5-Wert zu extrahieren und in einer Variablen zu registrieren

  2. http://docs.ansible.com/ansible/copy_module.html

    registrieren Sie während der Verwendung des Kopiermoduls zum Kopieren der Datei vom Server den Rückgabewert von MD5 in einer anderen Variablen

  3. http://docs.ansible.com/ansible/playbooks_conditionals.html

    verwenden Sie dieses Bedingungsmodul, um die beiden obigen Variablen zu vergleichen und die Ergebnisse zu drucken, unabhängig davon, ob die Datei ordnungsgemäß kopiert wird oder nicht

1

Eine andere Lösung ist die Verwendung von url lookup (getestet auf 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

Schrieb ein Ansible-Modul mit Hilfe von https://pypi.org/project/checksumdir

Das Modul finden Sie hier

Beispiel:

- get_checksum: 
    path: path/to/directory
    checksum_type: sha1/md5/sha256/sha512
  register: checksum
0
Rahul